TryHackMe Easy Target IP: 10.130.157.45

Máquina RootMe

Resolución paso a paso de la máquina RootMe de TryHackMe, realizando enumeración de directorios web, evadiendo filtros de subida de archivos para ganar acceso inicial, y escalando privilegios explotando un binario con permisos SUID (Python).

#Linux#SUID#GTFOBins#File Upload#Upload Bypass#Gobuster#Reverse Shell#Python

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
Escaneo inicial de puertos de Nmap
Resultados del escaneo de Nmap sobre el objetivo 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 cookie PHPSESSID no tiene el flag HttpOnly activo.

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
Fuzzing de directorios con Gobuster
Resultados de la enumeración de directorios web

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:

Página de carga de archivos en /panel/
Panel web desprotegido para la subida de 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):

Generador de reverse shell de PentestMonkey
Configuración de los parámetros IP y Port en la reverse shell PHP

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:

Subida exitosa y renombrado de archivo
Confirmación del éxito de subida tras renombrar la extensión

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:

Índice de subidas e inicio de la sesión
Listado de uploads y establecimiento de la reverse shell en Netcat

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:

Obtención del flag user.txt
Búsqueda y lectura de la flag del usuario de bajo privilegio

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
Listado de archivos SUID
Identificación del binario vulnerable python2.7 con permisos SUID

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:

GTFOBins para python SUID
Instrucción de GTFOBins para explotar el bit SUID en Python

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:

Escalada a root y lectura de la flag final
Escalada exitosa a root y obtención de la flag final
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
whoami
cat /root/root.txt

La flag de root es: THM{pr1v1l3g3_3sc4l4t10n}