Resolución del CTF: AllSafe
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.100- -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 servicios SSH en los puertos 22 y 2222, y un servicio HTTP en el puerto 80.
Enumeración Web
Accedemos al servicio HTTP y detectamos virtual hosting mediante el código fuente.
echo "192.168.0.100 allsafe.thl" | sudo tee -a /etc/hostsEnumeramos subdominios y descubrimos el subdominio interno.
wfuzz -c -u http://allsafe.thl/ -H "Host: FUZZ.allsafe.thl" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt --hw 560Añadimos el subdominio descubierto.
echo "192.168.0.100 intranet.allsafe.thl" | sudo tee -a /etc/hostsAcceso a Intranet
El portal de intranet requiere un ID de empleado y contraseña. Mediante un SSRF en el formulario público obtenemos una contraseña válida.
Credenciales utilizadas:
ID: 0-477-9990
Password: 123456SevenLaTeX Injection y Lectura Arbitraria de Archivos
Dentro del panel, el generador de contratos utiliza LaTeX y es vulnerable a inclusión arbitraria de archivos.
\\lstinputlisting{/home/parker/.ssh/id_rsa}Extraemos la clave privada SSH del usuario parker y la reconstruimos eliminando espacios y corrigiendo encabezados.
Acceso SSH al Contenedor
chmod 600 id_rsassh [email protected] -p 2222 -i id_rsaAccedemos a un contenedor Docker como el usuario parker.
Movimiento Lateral y Escalada en el Contenedor
Encontramos credenciales en el correo local del usuario parker.
cat /var/mail/parker/meetingDecodificamos la clave hexadecimal.
Accedemos como goddard y revisamos privilegios sudo.
Explotamos make para obtener root dentro del contenedor.
Extracción de Credenciales y Acceso al Host
Localizamos una base de datos Password Safe.
Obtenemos credenciales del usuario cisco y accedemos por SSH al host.
Servicio Interno Node.js
Detectamos un servicio Node.js escuchando en localhost:3000.
Revisamos logs accesibles y obtenemos credenciales válidas.
Node.js Deserialization RCE
El servicio deserializa directamente una cookie Base64. Inyectamos una función IIFE para ejecución remota de comandos.
Codificamos el payload y lo inyectamos en la cookie de sesión, forzando la reconexión del socket.
Recibimos una shell como root en el host y accedemos a la flag final.
