A gépen két port volt nyitva, a 22-es és a 1337. Utóbbi egy telnet port, de ezt a leírásból is tudjuk. Ha csatlakozunk hozzá, egy kérdést kapunk csak:
Please enter your username:
A leírásban azt is megkapjuk, hogy a smokey nevű felhasználóval tesztelhetünk. Ha beírjuk, visszakapjuk a jelszót. Sajnos ezzel a jelszóval nem tudunk bejelentkezni. De az első kérdés úgyis az admin felhasználó név. Először írtam egy Python scriptet, hogy gyakori felhasználó neveket próbálgasson végig, de nem működött. Ezek szerint célravezetőbb a "többet ésszel, mint brute force-al" hozzáállás.
Azért poénból megnéztem, hogy kapok-e találatot a "bandit" vagy Burt Reynolds nevére. Nem kaptam.
Akkor valami injection-t kell használni. Először pontosvesszőt raktam a felhasználói névbe, de arra nem adott semmit. Utána "-t, de erre sem reagált. Egyszeres idézőjelre viszont kaptam hibaüzenetet!
Error: unrecognized token: "'ize'' LIMIT 30"
Limit 30? Csak nem SQL lekérdezést kell írni? Az "unrecognized token" viszont szokatlan. MySQL biztos nem ad ilyen hibaüzenetet. A kereső szerint SQLite adatbázissal van dolgunk. Oké, ez már ismerős terep. Ha kommentet akartam beírni, akkor is kaptam egy hibaüzenetet:
For strange reasons I can't explain, any input containing /*, -- or, %0b is not allowed :)
Oké, közeledünk. Mi a helyzet egy select-el?
Ahh there is a word in there I don't like :(
Ez nem jó hír. Mi van, ha egy kicsit megváltoztatjuk azt a selectet. Mondjuk Select-re? Erre már nem adott hibaüzenetet. Lássuk mi van az adatbázisban!
' Union Select name from sqlite_master where type='table
A válasz: admintable! Oké, mi van az admintable-ben?
' Union Select sql from sqlite_master where name='admintable
CREATE TABLE admintable (
id INTEGER PRIMARY KEY,
username TEXT,
password INTEGER)
Ez már könnyű innen.
' Union Select username from admintable where id = '1
Erre megkapjuk az admin felhasználó nevét. Egy ilyen CTF esetén kifizetődő a kíváncsiság. Kíváncsi voltam, mi van, ha 2-t írok be a lekérdezésbe. Erre azt írta ki, hogy flag! Tehát a válaszokat akkor kapjuk meg, ha a következő módszerrel próbálkozunk:
' Union Select password from admintable where id = '1
illetve
' Union Select password from admintable where id = '2
Nagyon jó kis SQL Injection CTF volt! Ez most így olvasva egyszerűnek tűnik, de én SqlLite-ban a .table-t szoktam használni, hogy megtudjam a táblák nevét, a lekérdezésekre úgy kerestem rá. Sokszor lefagyasztottam a lekérdezést, mert beírtam a jó öreg or 1 = 1-t, ami itt nem működött. Az idézőjel sem volt egyértelmű, próbálgattam a "-t is, amíg rá nem jöttem a pontos szintaxisra. A select sql-re meg teljesen véletlenül akadtam rá az oszlopnevek lekérdezését keresve.
