Posiadasz listę loginów i haseł do serwisu, dla którego przeprowadzasz test penetracyjny.
Chcesz sprawdzić, które z nich należą do administratorów, a które to konta zwykłych użytkowników.
Niestety, typ konta wyświetla się na innej podstronie niż ta, która jest zwracana przez serwer po zalogowaniu.
Oczywiście możesz napisać kawałek skryptu w Pythonie, który najpierw zalogował by się przy użyciu podanych danych a następnie pobrał treść podstrony profil.
Ale można to również zrobić bezpośrednio z Burpa korzystając z makr.
Popatrzmy na przykład.
Widzimy tutaj formularz z miejscem na login i hasło.
Po prawidłowym zalogowaniu widzimy nazwę użytkownika.
Żeby sprawdzić jego typ, musimy przejść do podstrony profil.php
.
Tam to zwracany jest ciąg user
albo admin
w zależności od typu konta.
Pary loginów i haseł przechowujemy rozdzielone dwukropkiem w pliku tekstowym.
Do testów użyjemy narzędzia Intruder.
Najpierw z listy wybieramy żądanie, w którym to próbowaliśmy się zalogować.
Ono będzie stanowiło naszą bazę do wykonywania dalszych żądań.
Klikamy prawym przyciskiem myszy i wybieramy opcję: Send to intruder
.
Przechodzimy do podświetlonej zakładki.
Teraz musimy wskazać gdzie znajduje się login i hasło – tak aby oprogramowanie wiedziało, w którym miejscu ma wstawiać dodatkowe kombinację.
Burp sam wykrył 4 potencjalne miejsca, zaznaczając je na zielono.
Usuwamy dwa nieistotne, które zostały oznaczone przez pomyłkę.
Możemy tego dokonać zaznaczając odpowiedni ciąg i wykorzystując guzik Clear
.
Intruder pozwala na przeprowadzanie różnych rodzajów ataków bruteforce.
Zazwyczaj mamy jakąś listę loginów i haseł i próbujemy wszystkich możliwych kombinacji.
W naszym przypadku – wiemy dokładnie jaki jest login i hasło do konkretnego konta.
Wykorzystamy więc opcję Pitchfork
.
W niej to definiuje się dla każdej pozycji osobną listę.
Mamy więc osobną listę dla loginów oraz osobną dla haseł.
Intruder tworząc nowe żądanie bierze pierwszy element z listy loginów i łączy go z pierwszym elementem z listy haseł.
Listy definiujemy w zakładce payloads
.
Set pierwszy to nasz login, który został wcześniej oznaczony na zielono.
Wczytujemy wcześniej przygotowane dane z pliku tekstowego.
Tutaj natrafiamy na mały problem.
Intruder traktuje cały ciąg z pliku jako login a nie tylko dane znajdujące się przed pierwszym dwukropkiem.
Możemy to naprawić korzystając z dodatkowej opcji, która pozwala na przetwarzanie listy przed jej użyciem w żądaniu.
Match/replace
to zwykłe znajdź zamień z wykorzystaniem wyrażeń regularnych.
Przy jego pomocy usuwamy wszystko, co znajduje się po pierwszej kropce: :(.*?)$
.
Analogicznie postępujemy w przypadku haseł – delikatnie zmieniając wyrażenie: ^(.*?):
Możemy teraz przetestować atak.
I rzeczywiście widzimy, że logowanie się powiodło.
Pora na drugą część – czyli sprawdzanie typu zalogowanego konta.
Burp pozwala na wykonywanie dodatkowych, automatycznych żądań, gdy spełnione zostaną odpowiednie kryteria.
Możemy je ustawić w zakładce Project Options -> Sessions
.
Tutaj tworzymy nową regułę.
Jako jej akcję ustawiamy Run a post-request macro
.
Teraz tworzymy nowe makro – czyli wybieramy żądanie, jakie ma się automatycznie wykonać.
Z listy wybieramy to, które prowadzi do podstrony profil.php
.
Ta podstrona wykorzystuje ciasteczka w celu sprawdzenia czy użytkownik jest zalogowany.
To ciasteczko, ustawiane jest wcześniej przez moduł Intrudera.
Aby zostało ono użyte również w tym żądaniu musimy zaznaczyć opcję: Use cookies from the session handling cookie jar in requests
.
Standardowo, Intruder otrzymał by wynik żądania ze strony login.php
.
My chcemy aby zamiast tego przekazana została treść profil.php
.
Zaznaczamy więc opcję Pass back the final response from the macro
.
Pozostało zdefiniowanie zakresu kiedy dana reguła ma działać.
W naszym przypadku ma to być moduł Intruder oraz jeden, specyficzny adres URL.
Na koniec musimy upewnić się, czy w zakładce Cookie jar
zaznaczona jest opcja Intruder.
W innym wypadku, ciasteczka nie będą odpowiednio przekazywane pomiędzy dwoma modułami Burpa.
Pora na testy.
Całość działa poprawnie – to jest w wynikach widzimy typ konta.
Tylko, że wchodzenie w każde żądanie z osobna i poszukiwanie odpowiedniej treści jest na dłuższą metę męczące.
Naszym celem jest wyciągnięcie tych informacji i wyświetlenie ich w odpowiedniej kolumnie.
Służy do tego opcja: grep-extract
.
Definiujemy tutaj gdzie znajdują się interesujące nas informację.
Typ konta znajduje się pomiędzy tagiem <b>
.
Skorzystamy więc z prostego wyrażenia regularnego: <b>(.*?)</b>
.
Tym razem całość wygląda zdecydowanie lepiej.
Co więcej, teraz możemy sortować otrzymane wyniki w zależności od typu użytkownika.