Ez számomra egy nagyon nehéz CTF volt. Több napon keresztül kellett futtatni a programokat, és sok csapda is volt, ami tévútra vezetett. Azért a végére sikerült megoldani.
sudo nmap -p- -nP $IP
Csak három port volt nyitva, lássuk, milyen szolgáltatások vannak mögötte:
sudo nmap -sV -p 22,80,445 $IP
Egy SSH és két HTTP. Mindkét weboldalon csak az alapértelmezett Apache üzenet van, a forráskódban sincs egyetlen árva megjegyzés sem. Jöhet a weboldalak átnyálazása:
gobuster dir -u $IP -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
gobuster dir -u $IP:445 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
Nagyon kevés találat jött fel, ezért próbálkoztam más listákkal is:
gobuster dir -u $IP:445 -w /usr/share/wordlists/dirb/big.txt
gobuster dir -u $IP:445 -w /usr/share/wordlists/dirb/others/best1050.txt
Nem számított, a 80-as porton egy /admin /passwd /shadow fájlokat fedeztem fel. Mindegyik mögött egy base64 kódolású fájl volt. Dekódolás után ezt kaptam: not this easy :D Az admin sem volt bíztatóbb: Trust me it is not this easy..now get back to enumeration :D
Oké, a 80-as portot el lehet felejteni. Jöhet a 445-ös. Egy oldal jött csak fel: /management. Tovább kerestem:
gobuster dir -u http://10.10.157.64:445/management -w /usr/share/wordlists/dirb/big.txt
Ez már sokkal érdekesebb volt. Találtam például egy adatbázis dump-ot, amiben md5 hash-elt jelszavak voltak, illetve egy /management/classes/login.php bejelentkezést. A hasheket egész könnyen lehetett visszafejteni:
hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt
Persze egyik jelszó sem működött a bejelentkezésnél. Nem volt semmi információm, csak egy login form, meg egy uploads könyvtár. Talán SQL injection működik? Először kézzel próbálgattam, de nem sikerült semmit elérnem. Nézzük meg, valami eszköz tud-e jobbat.
Burp Suit-al lementettem a POST kérést, majd sqlmap-el nekiestem.
sqlmap -r request.txt --dbs
Úgy tűnik a blind injection működik, az adatbázis kezelő pedig MySQL. Blind injection-nél a lekérdezéshez egy sleep-et adunk. Ha a lekérdezés sokáig fut, akkot találtunk valamit. Ha gyorsan lefut, akkor nincs találat. Ezzel a módszerrel karakterenként visszakaphatjuk a teljes adatbázis tartalmát. Mint látható, ez egy gyötrelmesen lassú módszer, ezér nem a teljes adatbázisra, hanem a számomra lényeges adatokra koncentráltam. Lássuk a táblákat:
sqlmap -r request.txt --tables --dbms=mysql -D tms_db
A korábban megtalált adatbázis dump mégis hasznos volt, mert kiderült számomra, hogy ha az adatok nem is, de az adatbázis szerkezete változatlan. Ezért csak a users tábla két oszlopára koncetráltam:
sqlmap -r request.txt --dump --dbms=mysql -D tms_db -T users -C username
sqlmap -r request.txt --dump --dbms=mysql -D tms_db -T users -C password
Bingó, van felhasználó nevem és jelszó hash-em! Azért így is jó sokáig tartott, amig ezeket az információkat megszereztem. A korábbi hashcat paranccsal próbálkoztam, de csak a puser jelszavát tudtam törni. Az admin jelszóval megint nem volt szerencsém.
A weboldal elég összetett, sok modulból áll, viszont a funkciók száma nagyon korlátozott. Gyakorlatilag semmit nem lehet csinálni. Megváltoztathatom a jelszót, meg új képet tölthetek fel magamról. Ácsi! Feltöltés? Kipróbáltam, de semmilyen megkötés nem volt arra, mit is töltök fel. Az uploads könyvtárt már korábban megtaláltam. Feltöltöttem egy PHP reverz shellt, és volt hozzáférésem a géphez. Igaz, csak egy www-data, de akkor is lehetett parancsokat gépelni. Az /etc/passwd alapján azt is tudtam, hogy a plot_admin felhasználó lesz a következő célpont.
Először ssh-val végigpróbáltam az összes megtalált jelszót, de az nem működött. A /var/www/html könyvtárban voltak még más konfigurációs állományok, de az ott található hash-ek, jelszavak is zsákutcának bizonyultak. A crontab viszont hasznos volt. Kiderült, hogy a plot_admin percenként futtatja a /var/www/scripts/backup.sh-t. Az egyetlen probléma, hogy a szkriptet nem tudom szerkeszteni. A benne található parancsok mind abszolút elérési úttal voltak megadva.
A könyvtárban bóhóckodtam egyik alkalommal, amikor véletlenül letöröltem a backup.sh-t. Ezen meglepődtem, úgy tudtam csak akkor tudok letörölni valamit, ha van a fájlhoz írási jogom. Ismét tanultam valami a Linuxról. Akkor tudok letörölni valamit, ha a könyvtárhoz van írási jogom. Még a root fájlokat is törölhetem a könyvtáramból. Készítettem egy új backup.sh-t, de ebben már egy reverz shell volt. A revshell.com-ról kipróbáltam párat, de csak a python-os működött.
Oké, most már van plot_admin-os hozzáférésem is, a user.txt-t tudom olvasni. Hogyan leszek root?
A sudo -l jelszót kér, ami nekem nincs. Kilistáztam a suid bites fájlokat:
find / -perm -u=s 2>/dev/null
Semmi. Crontab semmi. Felmásoltam a linpeas-t a gépre, és lefuttattam. Egyetlen szekció volt érdekes, mégpedig a doas. Ez meg mi a fene? Utánaolvasva kiderült, hogy a doas olyan, mint a sudo. A konfigurációs állomány szerint az openssl-t tudom futtatni root-ként.
A GTFOBins receptjeit lehet használni, csak a sudo helyett doas-t kell írni. Az újabb reverz shell nem akart működni, de a fájl olvasás igen:
doas openssl -enc -in /root/root.txt
Sikerült!