Writeup
Úvod a kontext
Writeup je postavený na jedné úzké, ale velmi účinné cestě: CMS Made Simple v podadresáři writeup, blind SQL injection a z ní vytěžené SSH heslo pro jkr. Z pohledu útoku je podstatné, že injection nekončí u administrace CMS; rovnou otevírá systémový účet.
Druhá polovina je čistě lokální Linux detail. pspy ukáže, že root při přihlášení volá run-parts bez absolutní cesty, takže rozhoduje obsah $PATH, ne další webová zranitelnost. To je přesně ten vzorec, který rozebírám i v článku PATH, PYTHONPATH a wrapper hijack.
Počáteční průzkum
Kontext webu
Na hostu byla zmínka o podadresáři writeup, kde běžel CMS Made Simple. To je důležité, protože právě pro starší verze CMSMS existuje veřejně známý blind SQL injection exploit.
V takové situaci je lepší nesnažit se injection dokazovat ručně znak po znaku, ale použít hotový exploit zaměřený přímo na tento CMS.
Analýza zjištění
Blind SQL injection v CMS Made Simple
Exploit proti /writeup postupně získal tři zásadní údaje:
- salt,
- uživatelské jméno,
- hash hesla.
Výsledkem byl účet:
jkr
A po cracknutí i heslo:
raykayjay9
To je důležitý rozdíl proti mnoha jiným strojům: hash nesloužil k přihlášení do CMS administrace, ale fungoval přímo pro SSH. Blind SQL injection tu tedy ve výsledku otevírá jiný protokol, ne jen další webovou funkci.
Získání přístupu
SSH jako jkr
Jakmile jsou k dispozici funkční pověření, dává větší smysl přejít rovnou na SSH:
ssh jkr@10.10.10.138
Pak už šlo potvrdit user flag:
cat user.txt
__CENSORED__
Eskalace oprávnění
pspy a run-parts
Při lokální enumeraci bylo klíčové sledovat běžící procesy pomocí pspy. To ukázalo, že při přihlášení root spouští shell, který následně volá run-parts bez plně kvalifikované cesty.
To je přesně ten typ detailu, který se snadno přehlédne. Jakmile se spouští jen run-parts místo /bin/run-parts, začne rozhodovat obsah $PATH.
V prostředí Writeupu byl $PATH nastaven tak, že na začátku obsahoval i zapisovatelné cesty /usr/local/sbin a /usr/local/bin. To otevřelo možnost path hijacku.
Podstrčení vlastního run-parts
Stačilo vytvořit vlastní spustitelný soubor /usr/local/bin/run-parts, který neprovede běžnou práci, ale například připraví SUID kopii bashi:
echo -e '#!/bin/bash\n\ncp /bin/bash /bin/0xdf\nchmod u+s /bin/0xdf' > /usr/local/bin/run-parts
chmod +x /usr/local/bin/run-parts
Jakmile se pak znovu otevřelo SSH spojení a root login workflow sáhlo po run-parts, spustila se útočníkova verze místo systémové.
Výsledkem byl SUID shell:
/bin/0xdf -p
Ten už běžel s efektivním UID root a umožnil přečíst root.txt.
Shrnutí klíčových poznatků
- SQL injection v CMSMS zde sloužila jako cesta k reálnému SSH heslu, ne jen k webové administraci.
- Root část nestála na dalším exploitu aplikace, ale na špatně kvalifikovaném volání
run-partsv privilegovaném procesu. pspybyl rozhodující nástroj, protože bez pozorování procesů by PATH hijack nevynikl.
Co si odnést do praxe
- Blind SQL injection je potřeba brát vážně i tehdy, když nevrací data přímo do stránky. Jakmile vede k hashům a heslům, dopad je stejný jako u „hlasitější“ injekce.
- Privilegované skripty musí používat plné cesty k binárkám. Volání
run-parts,tar,cpnebo jiného nástroje bez absolutní cesty je zbytečný a často fatální risk. pspya podobné pasivní nástroje jsou po footholdu mimořádně cenné. Často odhalí plánované úlohy a login hooky rychleji než dlouhá manuální enumerace.
Další související články
HTB Stroje
Techniky
- Container boundary mistakes: bind mounty, `docker exec`, `runc`, `privileged`
- Údržbové skripty a provozní automaty jako zdroj přístupů
- SUID/GTFOBins a netypické binárky