A hollywood-i filmekből ismerős lehet a következő helyzet: Az éjszaka közepén egy elsötétített szobában napszemüveges csávó hekkel ezerrel, amikor rájön, hogy másvalaki is hekkeli a rendszert. És akkor nagyon nyomogatják a billentyűket, hogy megtudják, ki a jobb.
Ezt a helyzetet igyekszik visszaadni a következő CTF. A sztori szerint egy hekker már bent van a rendszerben, nekünk a hekkelt rendszert kell felhekkelni.
Először tároljuk az IP címet a $IP változóba, majd szokás szerint végignézzük, milyen nyitott portok vannak:
nmap -sS -Pn --top-ports 100 $IP
SSH és web. Semmi rendkívüli. Az oldal alján rögtön van egy fájl feltöltési lehetőség, de bármivel is próbálkoztam, semmit nem lehet feltölteni. Az oldal forráskódja szerint a feltöltött tartalmak a /cvs könyvtárban vannak, de az nem listázható. Végigfuttattam rajta egy könyvtár keresést gobusterrel, de semmit nem találtam.
Az uploads.php-nek kellene végezni a feltöltést, kommentben ott van az eredeti szkript forráskódja, ami még a hekker támadás előtt működött. A forráskód elemzéséből az látszik, hogy a szkript csak azt nézte, hogy a fájlnévben legyen egy .pdf, de azt nem, hogy az a végén legyen. A hekker biztos feltöltött valamit, ami .pdf.php-re végződött, majd módosította a szkriptet, hogy mi már ne tudjunk belépni.
Lehet, hogy a szkript, amit használt még mindig ott van? Kipróbáltam a revshell.pdf.php-t, de az nem működött. de a shell.pdf.php válaszolt! Valami GET-es paraméter kell neki. A legnyilvánvalóbb jelölt a cmd. Kipróbáltam és ez is működött! Most már lehet egyszerű parancsokat futtatni a gépen. A /home könyvtárban meg is lehet nézni a felhasználó user.txt fájlját, mai az első feladat!
Oké, eddig jó, de be kellene lépni. A felhasználó .bash_history fájlját is meg tudjuk nézni, amiben szerencsére benne van, hogy mire módosította a jelszót a hekker. Szuper! Ha belépünk ssh-val, akkor kb. 3 másodperc múlva egy nope üzenet kíséretében kidob. A hekker valami csapdát rejtett el!
Ha még egyszer megnézzük a shell.pdf.php-vel a .bash_history-t, akkor látjuk, hogy még a jelszó változtatás előtt valamit írt az /etc/cron.d/persistence fájlba. A tartalmát is megnézhetjük a php szkript segítségével. Van egy for ciklus, ami 10 másodpercenként kinyírja a /dev/pts-t használó folyamatokat! Tehát nem tudunk pseudoterminált létrehozni!
Azért nincs minden veszve! Az ssh így is tud parancsokat futtatni. Például:
ssh $user@$IP /bin/bash
És máris van egy stabil shell. Nem a legjobb, de legalább nem dob ki minket. Most legalább van idő körülnézni. Bár egy csomó dolgot kipróbáltam, a megoldás végig a szemem előtt volt, már a /etc/cron.d/persistence fájl első megtekintésénél. A legfontosabb, hogy a PATH változóban a felhasználó bin könyvtára van a legelső helyen! Tehát a pseudoterminált kinyíró pkill parancsot ki tudjuk cseréni saját szkriptre, mert ez az egyetlen, amit nem abszolút elérhetőséggel adtak meg! A felhasználó bin könyvtárában lévő pkill root jogokkal fog futni!
Mivel elég limitáltak a fájl szerkesztési feltételek, ezért a saját gépen hoztam létre a fájlt, majd scp-vel felmásoltam. Itt még bénáztam egy sort, mert először nc-vel akartam létrehozni a reverz shellt, csakhogy a gépen lévő verzió egy őskövület volt, ami nem ismert egy csomó kapcsolót, végül a python verziót használtam innen.
De ez még nem elég, mert a pkill csak az utolsó parancs, ami lefut. Ismét kapcsolódni kell ssh-val, de a /bin/bash parancs nélkül, hogy a rendszer eljusson a pkill parancsig. Amikor megpróbálja kinyírni a terminált, helyette elindít egy root shell-t.
Utána már írhatja a képernyőre, hogy nope, ahányszor csak akarja, engem nem zavar. A root.txt olvasható.
Csak, hogy hűek maradjunk a hollywood-i klisékhez, még beírhatjuk:
wall "Mess with the best, die like the rest."