Dzisiaj pokażemy jak za pomocą opisywalnego już przez nas oprogramowania THC-Hydra w wersji 8.1 napastnik może zaatakować dowolny formularz na stronie internetowej z pomocą słownika (dictionary attack). Takim formularzem może być przykładowo panel logowania do systemu administracyjnego daną stroną internetową. Za pomocą tej metody w bardzo prosty sposób możemy również przetestować w praktyce siłę swojego hasła i poprawność konfiguracji serwera hostingowego. Dodatkowo możemy sprawdzić odporność naszych skryptów na ataki słownikowe lub brute-force. Naszym zdaniem właśnie w ten sposób ostatnio OurMine Team atakował konta w serwisie Instagram. Prawdopodobnie wybierali z toplisty różnych krajów tysiące kont YouTuberów i testowali ich hasła istagraowe brutalną siłą na chybił trafił. Nie był to raczej atak skierowany na konkretne osoby.
Użyteczne narzędzia do ataku formularzy HTML
W celu wykonania ataku hakerzy wykorzystują całe multum swoich ulubionych narzędzi. Do dzisiejszego treningu polecam subiektywnie następujące narzędzia:
- Przegląda internetowa Mozilla Firefox,
- wtyczka Live HTTP headers,
- system Kali Linux 2.0,
- Hydra 8.1,
- Burp Suite Free (opcjonalnie).
Do tego poradnika na końcu wpisu został dodany film prezentacyjny na YouTube oczywiście z lektorem.
Skrypt treningowy brute-force
Zacznijmy od czegoś prostego. Poniżej przedstawiamy przykładowy skrypt logowania, który wykorzystamy do zrozumienia idei działania Hydry atakującej formularze po protokole HTTP. Plik login.php wygląda następująco:
<?php if (isset($_POST['login']) && isset($_POST['haslo'])) { if ($_POST['login'] == 'admin' && $_POST['haslo'] == '1234') { echo("Poprawne logowanie"); } else { echo("Zle haslo!"); } } else { ?> <form name="input" action="login.php" method="post"> Username: <input type="text" name="login"> Password: <input type="password" name="haslo"> <input type="submit"> </form> <?php } ?>
Powyższy skrypt logowania działa bardzo prosto. Za pomocą funkcji php isset sprawdza czy użytkownik wpisał jakieś wartości w polu formularza. Jeśli tego nie zrobił to zostaje wyświetlony formularz logowania. Jeśli jednak zostały jakieś wartości wprowadzone przez użytkownika to dodatkowo skrypt sprawdza czy login i hasło z formularza to admin i 1234. Przeważnie w taki sposób działają wszystkie systemy weryfikacji użytkownika za pomocą nazwy użytkownika i hasła.
Warto zwrócić uwagę na 10 linijkę kodu i parametr action wskazujący do jakiego skryptu dane zostaną wysłane w celu dalszego przetworzenia. W naszym przypadku wskazuje on na samego siebie więc De Facto mógł zostać pominięty. Wspomiany parametr action może oczywiście odnosić się do innych skryptów znajdujących się nawet w innej domenie www. W 12 i 14 linijce warto też zwrócić uwagę na parametr name. Za ich pomocą wprowadzone wartości mogą być identyfikowane w naszym skrypcie. Prościej mówiąc odwołując się w kodzie PHP do tablicy POST możemy dostać się do wartości wprowadzonych przez użytkownika $_POST[’login’] i $_POST[’haslo’]. Więcej o formularzach html i php znajdziesz na pewno w google. Dodatkowo możesz przeczytać temat na naszym forum pt. atrybuty ogólne kontrolek formularza w HTML i PHP.
Dictionary attack z hydra i http-form-post
Nasz treningowy powyższy skrypt wrzuciliśmy do naszego ulubionego darmowego Windowsowego serwera HTTP o nazwie XAMPP. Folder nazwaliśmy hydra. U nas ścieżka do tego skryptu wygląda następująco C:\xampp\htdocs\hydra\login.php. W celu przetestowania skryptu wystarczy w przeglądarce internetowej wywołać nasz adres lokalny http://localhost/hydra/login.php. Przetestuj teraz działanie naszego formularza logowania.
Teraz spróbujmy za pomocą oprogramowania THC-hydra złamać hasło do użytkownika admin. Uruchom system Kali Linux 2.0 na swojej wirtualnej maszynie (jak to zrobić opisywaliśmy wielokrotnie). Wprowadź następujące polecenie w swoim terminalu:
hydra 192.168.0.11 -l admin -P slownik.txt http-post-form "/hydra/login.php:login=^USER^&haslo=^PASS^:S=Poprawne logowanie"
lub
hydra 192.168.0.11 -l admin -P slownik.txt http-post-form "/hydra/login.php:login=^USER^&haslo=^PASS^:F=Zle haslo"
Polecenia oba są tożsame i różnią się tylko warunkiem końca. W pierwszym wykorzystaliśmy warunek S= czyli success. Wskazuje on na wyrażenie występujące na stronie www po poprawnym zalogowaniu się. W drugim przypadku przyjęliśmy strategie odwrotną. Wykorzystując F= czyli failed i wskazujemy informacje, którą zwraca strona www w przypadku niepowodzenia logowania. Wybór techniki należy zazwyczaj do hakera. To on badając formularz logowania musi stwierdzić, czy lepiej jest weryfikować proces logowania za pomocą informacji o niepowodzeniu logowania czy o poprawnym logowaniu. Jeśli chciałbyś wykorzystać słownik z loginami zamiast parametru -l użyj -L.
Objaśnienie wykorzystanych parametrów Hydra
Przejrzyjmy się reszcie parametrów wykorzystanych przez nas w powyższych poleceniach:
- 192.168.0.11 jest to adres IP serwera na którym jest hostowana strona www. Możemy zamiast tego adresu użyć nazwy domenowej np: instagram.com.
- -l admin wskazuje na nazwę użytkownika którego hasło chcemy poznać. Oczywiście zależnie od formularza logowania może być to np: adres e-mail. Można też przekazać cały słownik z loginami za pomocą parametru -L.
- -P slownik.txt ścieżka do słownika w którym hasła są uporządkowane jeden pod drugim.
- http-post-form protokół HTTP POST który wspiera hydra. Przydatnymi innymi protokołami mogą być HTTP-FORM-GET, HTTP-HEAD lub HTTPS-FORM-POST.
- „/hydra/login.php:login=^USER^&haslo=^PASS^:F=Zle haslo” – specyficzna składnia polecenia THC-Hydra.
Warto zwrócić uwagę na ten ostatni punkt, który najczęściej będzie metodą prób i błędów dostosowywany przez pentestera pod dany cel.
Budowa tej składni może składać się z maksymalnie czterech części (my użyliśmy trzech) i ma postać „1:2:3:4”.Każda z części oddzielona jest znakiem dwukropka. Pierwsza część wskazuje na adres skryptu do którego formularz odwołuje się. W naszym przypadku na serwerze skrypt logowania znajduje się w /hydra/login.php.
Druga część to zawartość wiadomości HTTP wysyłanej do serwera. W naszym przypadku wskazaliśmy że login i haslo maja być pobrane z zdefiniowanych przez nas słowników. Nazwa login i haslo musi być identyczna z parametrami name w formularzu. Spójrz na 12 i 14 linie kodu. Należy pamiętać, że czasami formularze posiadają dodatkowe ukryte pola formularza które również wysyłają i trzeba to uwzględnić w tej sekcji. Oczywiście wyrażenie ^USER^ i ^PASS^ jest zmienną symboliczną programu hydra. Oznacza to, że w tych miejscach zostaną wstawione wartości słownikowe z parametru -l i -P.
Trzecia część tej specyficznej składni to wyrażenie logiczne mające wskazać hydrze, kiedy logowanie się powiodło. Możemy użyć argumentu F= mówiącego Hydrze co zostaje wyświetlone na stronie www w przypadku błędnego logowania. Zamiast tego możemy również użyć argumentu S= wskazującego co zwraca strona www w przypadku poprawnego zalogowania się.
Istnieje również czwarta część w tej składni umożliwiająca dostarczenie opcjonalnych dodatkowych nagłówków HTTP.
Specjalnie do rozjaśnienia budowy składni tego polecenia stworzyliśmy poniższą grafikę.
Jak badać strony www i zapytania POST / GET
Przed przystąpieniem do symulowanego ataku warto na sucho na swoim koncie przetestować konfiguracje polecenia hydra. Jeśli chcesz dokładnie zbadać formularz jak działa i jakie są wysyłane przez niego informacje, to warto skorzystać z funkcji przeglądarki o nazwie pokaż źródło strony lub zbadaj element. Taką funkcjonalność zaimplementowaną ma większość przeglądarek www, jednak moim zdaniem najlepiej wypada w zestawieniu Firefox.
Warto również do niego doinstalować rozszerzenie o nazwie Live HTTP headers, za pomocą którego możemy śledzić nagłówki HTTP wysyłane z formularza jak i odpowiedzi. Zaraz po zainstalowaniu rozszerzenia uruchom je, wciśnij capture a następnie przechodząc do badanego formularza logowania wprowadź w nim błędne lub poprawne dane logowania i spójrz na zrzut informacji w tym pluginie Analizując je na pewno wiele możesz się dowiedzieć na temat danego formularza i działania samego protokołu HTTP. Z pomocą tego rozszerzenia Firefoxa możecie również fałszować zapytania i ponownie je wysyłać przyciskiem replay.
Bardziej zaawansowanym narzędziem do audytowania i debugowania stron jest Burp Site. To narzędzie udostępnione jest również w wersji komercyjnej. Zostało napisane w języku Java i działa zarówno na systemie Microsoft Windows jak i Linux (zainstalowany jest w Kali Linux 2.0). Posiada bardzo mnogie i użyteczne narzędzia do inspekcji działania web aplikacji. W naszym przypadku służy on jako lokalna bramka proxy i pozwala w bardzo wygodny sposób kontrolować i analizować przepływ całego zapytania HTTP. Może kiedyś i to narzędzie szerzej opiszemy.
Opcjonalne parametry programu Hydra
Warto również spojrzeć do manuala programu THC-Hydra, aby sięgnąć po inne opcjonalne parametry aplikacji. Czasem się zdarzy, że testowanie siły hasła w ten sposób nie może się odbyć bez pewnej przerwy czasowej między kolejnymi zapytaniami. Poniżej przedstawiam kilka z przydatnych opcjonalnych argumentów programu:
-R restore a previously aborted session. Requires a hydra.restore
file was written. No other options are allowed when using -R-S connect via SSL
-s PORT
if the service is on a different default port, define it here-l LOGIN
or -L FILE login with LOGIN name, or load several logins from
FILE-p PASS
or -P FILE try password PASS, or load several passwords from
FILE-x min:max:charset
generate passwords from min to max length. charset can contain 1
for numbers, a for lowcase and A for upcase characters.
Any other character is added is put to the list.
Example: 1:2:a1%.
The generated passwords will be of length 1 to 2 and contain
lowcase letters, numbers and/or percent signs and dots.-e nsr additional checks, „n” for null password, „s” try login as pass,
„r” try the reverse login as pass-C FILE
colon separated „login:pass” format, instead of -L/-P options-u by default Hydra checks all passwords for one login and then
tries the next login. This option loops around the passwords, so
the first password is tried on all logins, then the next pass‐
word.-f exit after the first found login/password pair (per host if -M)
-F exit after the first found login/password pair for any host (for
usage with -M)-M FILE
server list for parallel attacks, one entry per line-o FILE
write found login/password pairs to FILE instead of stdout-t TASKS
run TASKS number of connects in parallel (default: 16)-w TIME
defines the max wait time in seconds for responses (default: 32)-W TIME
defines a wait time between each connection a task performs.
This usually only makes sense if a low task number is used, .e.g
-t 1-4 / -6
prefer IPv4 (default) or IPv6 addresses-v / -V
verbose mode / show login+pass combination for each attempt -d
debug mode-h, –help
Show summary of options.
Wideo demonstracyjne WordPress Hydra POST
Poniżej na naszym kanale znajduje się nasz film prezentacyjny badanie formularza HTML za pomocą różnych narzędzi i przykładowy atak na nasz prywatny serwer lokalny. Zapraszamy do subskrypcji naszego kanału na YouTube!
Podsumowanie o atakach słownikowych i OurMine
Wbrew pozorom ataki słownikowe lub brute force nadal mogą być bardzo skuteczne pod warunkiem wykorzystania olbrzymiego zbioru danych z potencjalnymi hasłami. Jeżeli czasowo próba łamania hasła przekracza możliwości hakera to zawsze może on skorzystać z komputerów zombie w sieci botnet. Być może tak grupa OurMine zdobywała konta ze względu na brak kodu capache na chwile obecną w Instagramie. Co ciekawe za pomocą metody GET i słownika programem Hydra w podobny sposób można poszukiwać ukrytych katalogów i plików, które być może nie powinny być dostępne publicznie. Najważniejsze jest żebyś sam próbował i uczył się. Nigdy opanowanie wiedzy z takiego poradnika nie będzie wyznacznikiem Twoich umiejętności. Daliśmy Tobie tylko wędkę a nie rybę więc teraz idź połowić. Nie pytajcie więc o gotowe komendy pod daną stronę www. To blog o bezpieczeństwie a nie wspierający hakowanie wszystkiego… Szukaj problemów i je rozwiązuj. Być może też zainteresują Cię inne nasze wpisy:
Powodzenia :-).
Można się spodziewać jakiegoś tutoriala odnośnie pisania exploitów na gotowe błędy np. w C/C++, albo asm?
Strona jest dedykowana dla poczatkujacych. Już mało pracujemy w natywnych jezykach…
A co zrobić gdy nie znam nazwy użytkownika ?
Na naszym YouTube jest filmik. Parametr -L moze posluzyc jako slownik loginów. Niestety wtedy zlozonosc obliczeniowa wzrasta (wiecej kombinacji).
Pobrałem słownik, ale mam problem, jak go przenieści do linuxa Kali 2 na VirtualBox ?
Wrzucić na hosting lub localhost na windowsie i ściągnąć w Kalim, lub z pendrive i skonfigurować w wirtualnej maszynie obsługę USB lub zainstalować virtualbox guest additions który umożliwia kopiowanie pomiędzy systemami. Sposobów jest wiele!
Czy jest możliwość żebyście dali link do kali liuxa 2.0 ?
W Google wpisz Kali Linux 2.0 download. Jest to darmowe oprogramowanie dostępne na stronie twórców (następca systemu Linux BackTrack) 🙂
Czy z hydrą w Kalim 2 jest jakiś problem? Próbuję cały dzień złamać hasło do DVWA oraz mojego serwera (prosta strona logowania) i hydra wypluwa mi w zasadzie wszystkie kombinacje jako właściwe. Puszczam tą samą komendę dajmy na to 3 razy z rzędu i za każdym razem podaje mi inne hasło i login jako właściwe. Nie mam już siły – kopiowałem nawet polecania z różnych tutoriali i ani razu komenda nie działała właściwie. Niby wszystko działa, ale hasła/loginy podaje losowo, czasami wypluwa wszystkie kombinacje jako właściwe… Spotkałeś się może z takim problemem?
Czy oglądałeś nasz kurs WAP na YouTube? Tam chyba była pokazywana Hydra pod DVWA. Prawdopodobnie zły parametr sukcesu lub porażki (S lub F) podałeś.
Ludzie, dobrze sprawdzajcie odpowiedzi serwera, nie przepisujcie bezmyślnie tego, co widzicie na filmie. Sprawdzajcie na wszelkie możliwe sposoby. U mnie np w live http headers zwrot z serwera po zalogowaniu był jak na filmie, tzn 302 Found ale łamanie pod taki parametr nie działało. W burpsuite natomiast zwrot z serwera to było samo 302 i atak sie udal.
Przy wordpressie mozna użyć parametru sukcesu S=Location – jeśli nie znacie parametru sukcesu lub macie problem z jego odczytaniem. Również działa. Cała składnia jakiej używam:
hydra -V HOST(bez www lub samo ip) http-form-post „/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Zaloguj+si%C4%99:S=Location” -l nazwa_uzytkownika -P slownik.txt
Pozdrawiam
Brawo. Jesteś jedną z nielicznych osób, która posiada cechę prawdziwego hakera, czyli EKSPERYMENTOWANIE. Bardzo mi się podoba Twoje podejście nie bezmyślnego przepisywania komend znalezionych w internecie. Dla potomnych dodam, że w którymś filmie z darmowego kursu podstaw webaudytu jest właśnie omówiony gruntownie temat szukania parametrów S:= lub F:= :
https://www.youtube.com/watch?v=al9oFl5WP9A&list=PLe18tvImRSTRbffDg4wIGMy7KmMQ1QI45
A nie można dodać parametru S i F w tej samej komendzie?
Jeśli tak ci wyszło w live http headers to upewnij się na przykład w wiresharku albo w ettercapie co?
Hydra w wersji 8.1 ma ograniczenie na ilość lini/haseł w pliku (opcja -P pass.txt). Nie załaduje więcej niż 5 mln. Jak to obejść?
Dlaczego jak rozpoczynam atak to hasło = „nazwa słownika.txt”?
Moim zdaniem zły warunek sukcesu lub fałszu. Musisz spróbować innego.