NATAS, GRA CTF 24-27

NATAS, GRA CTF 24-27

Opis przejścia kolejnych poziomów gry OverTheWire dla poziomów 24-27.

Natas24:
Link do zalogowania: http://natas24.natas.labs.overthewire.org/index.php
Login: natas24
Password: OsRmXFguozKpTZZ5X14zNO43379LZveg

Poniżej kod strony wraz ze źródłem php…

Kluczowym elementem tego zadania jest sposób porównywania zmiennych przy pomocy funkcji strcmp(). Kluczowym zapisem jest tutaj sprawdzenie, że funkcja sprawdza czy dwa ciągi znaków są różne zamiast sprawdzania czy są takie same. Funkcja strcmp() jeżeli ciągi są różne to wyświetla hasło na stronie. Ciekawą własnością tej funkcji jest fakt, że zachowuje się nietypowo jeżeli porównywane są inne elementy niż ciągi znaków. Korzystając z manuala funkcji strcmp() istnieje możliwość osiągnięcia wartości innej niż True lub False:

Porównywanie ciągu znaków oraz tablicy powoduje, że porównywanie tych zmiennych powoduje zwrot wartości NULL, zatem te wartości nie są różne.
Poniżej przykład takiego porównania oraz wynik:

natas24.natas.labs.overthewire.org/?passwd[]=1234

Hasło do levelu25 jest GHF6X7YwACaYYssHVY05cFq83hRktl4c

NATAS25:

Link do zalogowania: http://natas25.natas.labs.overthewire.org/index.php
Login: natas25
Password: GHF6X7YwACaYYssHVY05cFq83hRktl4c

Poniżej kod skryptu do analizy:

Kod programu polega na wyświetleniu tekstu w 2 różnych językach: angielskim oraz niemieckim. Parametr odpowiadający za zmianę języka występuje w parametrze GET o nazwie lang, który przyjmuje dwa parametry eng oraz de. Dodatkowo w liniach 24-28 znajduje się funkcja odpowiedzialna za przewidywanie atakom path traversal, która powoduje zamianę ciągu ../ na pusty ciąg znaków.
W liniach 31-33 istnieje zabezpieczenie, które uniemożliwia podejrzenie pliku zawierającego ciąg natas_webpass. Pora spróbować sobie poradzić z wymienionymi zabezpieczeniami.

Najpierw należy zauważyć, że zabezpieczenie przeciwko path traversal niedostatecznie chroni przed tym atakiem. Ciągiem, który pozwala na wyświetlenie innych plików to ….// (cztery ukośniki i dwa backshashe).
Następnie należy zauważyć, że funkcja o nazwie logRequest zapisuje do pliku  $fd=fopen(„/var/www/natas/natas25/logs/natas25_” . session_id() .”.log”,”a”); wszystkie zdarzenia na stronie. Zaczynam od odtworzenia parametru session_id, który u mnie wynosi: ige5msfgjnb0r0k0s4l2liarv7

Zatem adres do pliku przedstawia się następująco: http://natas25.natas.labs.overthewire.org/?lang=….///logs/natas25_ige5msfgjnb0r0k0s4l2liarv7.log

Pora teraz spróbować podejrzeć zawartość pliku z hasłem. Tutaj kluczowy jest zapis w linii 57: $log=$log . ” ” . $_SERVER[’HTTP_USER_AGENT’];
Stosowana jest tutaj konkatenacja zmiennej log oraz zmiennej globalnej HTTP_USER_AGENT. Należy zatem podmienić zawartość tego nagłówka na inny ciąg o następującej wartości:

Odpowiedzią na takie zapytanie jest:

Hasłem jest ciąg znaków: oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T

Natas26:

Link do zalogowania: http://natas26.natas.labs.overthewire.org/index.php
Login: natas26
Password: oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T

Kod strony przedstawia się następująco:

Na wstępie podane zostaną przykładowe dane x1=20, x2=10, y1=100, y2=150, co daje poniższy wynik:

Samo zapytanie z poziomu BurpSuite przedstawia się jak poniżej:

Na uwagę zasługuje ciąg drawing, który posiada zakodowaną wartość w base64 YToxOntpOjA7YTo0OntzOjI6IngxIjtzOjI6IjIwIjtzOjI6InkxIjtzOjI6IjEwIjtzOjI6IngyIjtzOjM6IjEwMCI7czoyOiJ5MiI7czozOiIxNTAiO319, która po zdekodowaniu wynosi:
a:1:{i:0;a:4:{s:2:”x1″;s:2:”20″;s:2:”y1″;s:2:”10″;s:2:”x2″;s:3:”100″;s:2:”y2″;s:3:”150″;}}

Mamy do czynienia tutaj z serializacją/deserializacją danych w PHP. Podatna aplikacja musi mieć klasę, która implementuje magiczną metodę PHP (taką jak __wakeup lub __destruct), której można użyć do przeprowadzenia złośliwych ataków lub uruchomienia „łańcucha POP”.
A także wszystkie klasy używane podczas ataku muszą zostać zadeklarowane, gdy wywoływana jest podatna na ataki funkcja unserialize (), w przeciwnym razie dla takich klas musi być obsługiwane automatyczne ładowanie obiektów. Oba te warunki są spełnione przez naszą aplikację.

Potrzebny jest teraz skrypt w php, który spowoduje wygenerowanie zakodowanego ciągu, który następnie może zostać wysłany przez BurpSuite.

Wynikiem działania skryptu jest ciąg:

Nowa wartość zapytania w BurpSuite wpisana do repetera:

Następnie należy podejrzeć hasło do kolejnego poziomu poprzez wykonanie zapytania: http://natas26.natas.labs.overthewire.org/img/haslo.php, wynik:
Zegnam 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ

Natas27:

Link do zalogowania: http://natas27.natas.labs.overthewire.org/index.php
Login: natas27
Password: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ

Zacznijmy od przejrzenia kodu:

Kod strony zachowuje się następująco: Po wpisaniu danych logowania sprawdzane jest czy wskazany użytkownik istnieje w bazie danych, następnie sprawdza czy podane hasło pasuje do wskazanego użytkownika. Jeżeli tak to wyświetla dane tego użytkownika, w przeciwnym wypadku informuje, że podane hasło jest nieprawidłowe. Natomiast jeżeli podanego użytkownika nie ma w bazie danych to go tworzy. Dodatkowo podana jest struktura tabeli użytkowników, która posiada dwa pola po 64 znaki.
Na podstawie poniższych danych można spróbować nadużyć podanego kodu.

Podajemy dane do logowania login:user1, password:1234

Spowoduje to dodanie użytkownika user1 z hasłem 1234, zatem aby zdobyć hasło do użytkownika natas28 należy spowodować dodanie konta natas28 w sposób uniemożliwiający sprawdzenie ,iż to konto jeszcze nie istnieje w systemie, w sposób poniższy:

Warto tutaj wytłumaczyć na czym polega ta sztuczka. Dodajemy konto o nazwie natas28 (te plusy to spacje) oraz litera a na końcu. W ten sposób dodajemy do tabeli z użytkownikami konto natas28 zawierające po nazwie 57 spacji oraz literę a. To powoduje, że dodany jest użytkownik, który zostaje wpisany do bazy danych, ale ponieważ tabela składa się z 64 znaków to litera a jest wycinana z ciągu. To powoduje ,że są dwa konta natas28, w tym jedno z 57 spacjami na końcu, ale język SQL obcina te spacje co powoduje, że logujemy się na konto natas28. Następnie jest sprawdzane jedno z istniejących haseł tych kont, oryginalnego nie znamy ale jest też sprawdzane to podane przy tworzeniu powyżej o treści 1234. Następnie loguję się na konto natas28 z hasłem 1234. Wynikiem zalogowania jest rozwiązanie:

Welcome natas28!
Here is your data:
Array ( [username] => natas28 [password] => JWwR438wkgTsNKBbcJoowyysdM82YjeF )

Dziękuję i przepraszam za tak dużą pauzę w ostatnim czasie, są to trudne i dla mnie czasy.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.