Łamanie haseł z pomocą nmap NSE

01 sierpnia 2018, 14:33 | Teksty | komentarze 3
: zin o bezpieczeństwie - pobierz w pdf/epub/mobi.

Czym są skrypty NSE Nmapa większość Czytelników Sekuraka pewnie już wie. Temat był poruszany wielokrotnie m.in. w artykułach: Nmap NSE – kilka przykładów, Tworzymy własne skrypty NSE dla Nmapa i Nmap i 12 przydatnych skryptów NSE. Jeśli więc nie wiesz czym jest Nmap lub NSE zachęcam do przeczytania któregoś z powyższych artykułów.

Dzisiaj przyjrzymy się bliżej skryptom z kategorii brute, które służą do łamania haseł metodą słownikową.

http-brute.nse

Skrypt http-brute służy do wykonania audytu haseł używanych do różnych metod uwierzytelniania, takich jak HTTP basic, digest i NTLM. Dzięki wykorzystaniu biblioteki creds, wszelkie odgadnięte dane logowania są zapisywane w rejestrze Nmapa i kiedy inny skrypt będzie ich potrzebował, sam sobie po nie “sięgnie”.

Najprzydatniejsze argumenty, z których możemy skorzystać używając tego skryptu to:

  • http-brute.hostname – argumentu używamy w przypadku, gdy badana aplikacja korzysta z wirtualnego hostingu (pod jednym adresem IP działa wiele usług WWW). Podajemy w nim nazwę domenową badanej aplikacji – umieszczana jest ona wtedy w nagłówku Host zapytań;
  • http-brute.method – przekazujemy metodę HTTP, z której skrypt ma skorzystać (domyślnie: GET);
  • http-brute.path – ścieżka chronioną uwierzytelnieniem (domyślnie: / );
  • userdb – podajemy listę nazw użytkowników do sprawdzenia (domyślnie – LINUX: /usr/share/nmap/nselib/data/usernames.lst, WINDOWS: C:\Program Files (x86)\Nmap\nselib\data\usernames.lst lub C:\Program Files\Nmap\nselib\data\usernames.lst);
  • passdb – lista haseł do sprawdzenia (domyślnie – LINUX: /usr/share/nmap/nselib/data/passwords.lst, WINDOWS: C:\Program Files (x86)\Nmap\nselib\data\passwords.lst lub C:\Program Files\Nmap\nselib\data\passwords.lst);
  • brute.credfile – lista użytkowników i haseł rozdzielonych znakiem ukośnika “/”;
  • brute.emptypass – gdy przekażemy w tym argumencie “true”, skrypt spróbuje zalogować się na podane konta użytkowników bez podawania hasła (domyślnie: false);
  • brute.guesses – ilość prób logowania na każde konto z listy (argument przydatny, jeśli chcemy uniknąć zablokowania kont przez zbyt dużą ilość niepoprawnych prób logowania);
  • brute.delay – liczba sekund do odczekania między kolejnymi próbami logowania (domyślnie: 0);
  • brute.retries – liczba ponownych prób w przypadku wystąpienia możliwych do naprawienia awarii;
  • brute.passonly – w argumencie przekazujemy “true”, jeśli docelowa usługa obsługuje autoryzację samym hasłem (domyślnie: false);
  • brute.firstonly – skrypt zatrzymuje swoje działanie po pierwszym udanym logowaniu;
  • http.useragent – domyślnym nagłówkiem User-Agent skryptów NSE Nmapa jest “Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)”. Może zdarzyć się, że docelowa usługa będzie blokowała zapytania z takim nagłówkiem – wtedy możemy go zmienić z pomocą powyższego argumentu.

Przykładowe użycie

Na początku musimy znaleźć adres IP naszej ofiary, którą będzie maszyna znajdująca się w tej samej sieci LAN (oczywiście pamiętając, że możemy testować tylko te systemy informatyczne, których właściciel wyraził na to zgodę). W tym celu możemy skorzystać z narzędzia netdiscover:

Rysunek 1. Znalezienie adresu IP ofiary narzędziem netdiscover.

Skan 2000 najbardziej popularnych portów pokazuje, że domyślny dla serwerów WWW port jest otwarty.

Rysunek 2. Przeprowadzenie szybkiego skanu portów.

Rysunek 3. Domyślna strona Apache2 na serwerze ofiary.

Serwer WWW rzeczywiście działa pod adresem naszego celu, lecz niestety jest to domyślna strona Apache2.

Sprawdźmy czy uda nam się znaleźć jakieś “ukryte” katalogi z pomocą np. programu dirb.

Rysunek 4. Znalezienie ukrytego katalogu “secret”.

Szybki skan dirb’em pokazuje, że administrator serwera starał się jednak coś ukryć…

Rysunek 5. Dostęp do katalogu “secret” chroniony uwierzytelnieniem HTTP Basic Auth.

Wejście do katalogu /secret wymaga podania nazwy użytkownika i hasła. W tym miejscu skorzystamy z omawianego skryptu http-brute.

Rysunek 6. Atak brute-force zakończony niepowodzeniem

Jak widać, skrypt nie znalazł poprawnych danych logowania. Myślę, że warto spróbować jeszcze raz, tym razem z inną bazą nazw użytkowników i haseł niż domyślna.

Bardzo dobra i ciągle rozwijana kolekcja wszelakich list jest dostępna pod adresem https://github.com/danielmiessler/SecLists i to właśnie z niej skorzystamy w następnej próbie.

Rysunek 7. Znalezienie poprawnych danych logowania.

Tym razem skrypt zaraportował znalezienie prawidłowych danych logowania. Sprawdźmy czy nie jest to false-positive.

Rysunek 8. Strona chroniona uwierzytelnieniem.

Udało się zalogować, a to oznacza, że pomyślnie złamaliśmy dane dostępowe do uwierzytelnienia HTTP Basic Auth.

http-form-brute.nse

Skrypt http-form-brute służy do audytowania haseł w uwierzytelnieniu opartym o formularze. Tak jak poprzedni skrypt, korzysta z biblioteki creds i zapisuje znalezione dane logowania “na przyszłość”. Http-form-brute automatycznie próbuje wykryć metodę HTTP formularza, jego atrybut ‘action’, informujący przeglądarkę do której strony ma przesłać dane oraz nazwy pól formularza.

Skrypt ocenia czy logowanie było udane korzystając z poniższego algorytmu:

  1. Jeśli odpowiedź była pusta – uwierzytelnienie powiodło się;
  2. Jeśli niżej omówiony argument onsuccess został użyty i odpowiedź była taka jak ta przekazana do argumentu – uwierzytelnienie powiodło się;
  3. Jeśli niżej omówiony argument onfailure został użyty i odpowiedź była inna niż ta przekazana do argumentu – uwierzytelnienie powiodło się;
  4. Jeśli powyższe argumenty nie zostały użyte, a odpowiedź zawiera pole o takiej samej nazwie jak przesłany parametr hasła – uwierzytelnienie nie powiodło się;
  5. Uwierzytelnienie powiodło się.

Lista najprzydatniejszych argumentów skryptu:

  • http-form-brute.hostname – tak jak w przypadku http-brute, przekazujemy nazwę hosta, w przypadku korzystania z wirtualnego hostingu;
  • http-form-brute.path – w argumencie wskazujemy ścieżkę do formularza;
  • http-form-brute.onsuccess –  w tym argumencie przekazujemy treść/wzór odpowiedzi zwracany podczas udanej próby uwierzytelnienia;
  • http-form-brute.onfailure – to samo co wyżej, tylko w przypadku nieudanej próby uwierzytelnienia;
  • http-form-brute.sessioncookies – skrypt próbuje przechwycić ciasteczka przed przesłaniem formularza. Jeśli formularz nie wymaga ustawienia ciasteczka przed logowaniem, zaleca się ustawić ten argument na “false” (domyślnie: true).

Jeśli nie ufamy automatycznej próbie wykrycia pól i metody, możemy skorzystać z tych argumentów:

  • http-form-brute.uservar – w argumencie przekazujemy nazwę pola używanego do przechowywania nazwy użytkownika;
  • http-form-brute.passvar – przekazujemy nazwę pola używanego do przechowywania hasła;
  • http-form-brute.method – przekazujemy używaną przez formularz metodę HTTP (domyślnie: POST).

Zważając na to, że skrypt http-form-brute także korzysta z bibliotek brute i http, możemy także używać argumentów takich jak brute.credfile, brute.firstonly, brute.emptypass, brute.delay, brute.guesses, brute.retries, brute.passonly i http.useragent.

Przykładowe użycie

W poprzednim przykładzie udało się uzyskać dostęp do ukrytego katalogu chronionego hasłem a uzyskane dzięki temu informacje powinny już satysfakcjonować, to jednak na dole strony widnieje link o nazwie Panel Administracyjny, który prowadzi do strony z następującą zawartością:

Rysunek 9. Panel administracyjny – Laudanum Shell.

Administratorzy lubią ułatwiać sobie życie i widok jak ten na Rysunku nr 9 to nie nowość w wirtualnym świecie. Rozwiązanie to raczej słabe, lecz teraz sprawdzimy czy jest chociaż zabezpieczone mocnym hasłem. Użyjemy do tego celu skryptu http-form-brute, utworzonej przez nas listy potencjalnie istniejących użytkowników oraz którejś z list haseł uprzednio pobranej kolekcji SecLists.

Rysunek 10. Utworzona lista użytkowników.



Rysunek 11. Znalezione poprawne dane dostępowe do panelu administracyjnego.

Jak widać, skrypt poprawnie wykrył pola formularza i hasło zostało złamane w 2 sekundy, co oznacza, że nie było zbyt mocne.

Po zalogowaniu możemy korzystać z shella i wykonywać komendy na serwerze ofiary:

Rysunek 12. Możliwość wykonywania dowolnych komend na serwerze ofiary.

http-wordpress-brute.nse

Skrypt http-wordpress-brute celuje w formularz logowania najpopularniejszego CMS’a na świecie – WordPressa. Również korzysta z biblioteki creds i zapisuje znalezione dane logowania do późniejszego użytku.

Przyjrzyjmy się kilku dostępnym argumentom:

  • http-wordpress-brute.threads – ustawia liczbę równoległych wątków (domyślnie: 3);
  • http-wordpress-brute.uri – temu argumentowi podajemy ścieżkę do formularza (domyślnie: /wp-login.php);
  • http-wordpress-brute.uservar – nazwa zmiennej przechowującej nazwę użytkownika podczas logowania (domyślnie: log);
  • http-wordpress-brute.passvar – zmienna przechowująca hasło podczas logowania (domyślnie: pwd);
  • http-wordpress-brute.hostname – wartość wysyłana w nagłówku Host (w przypadku wirtualnego hostingu);

Prawie wszystkie skrypty http-*brute wykorzystują biblioteki http i brute do działania, więc i w przypadku tego skryptu możemy używać argumentów dostępnych dla tych bibliotek, m. in.: brute.credfile, brute.firstonly, brute.emptypass, brute.delay, brute.guesses, brute.retries, brute.passonly i http.useragent.

Przykładowe użycie

Podczas dalszych oględzin znaleźliśmy instalację WordPress’a pod adresem http://10.0.0.3/wordpress/. Zważając na fakt użycia słabych haseł w poprzednich przykładach, warto przeprowadzić audyt hasła i w tym miejscu.

Na początku skorzystamy ze skryptu http-wordpress-users, aby wykryć użytkowników:

Rysunek 13. Enumeracja użytkowników WordPress’a.

Tworzymy ich listę i przekazujemy skryptowi razem z listą haseł z któregoś z wycieków.

Rysunek 14. Niepowodzenie w łamaniu haseł użytkowników.

Niestety, prawidłowe dane logowania nie zostały odnalezione.

Do następnej próby wygenerujemy dedykowaną listę haseł z pomocą narzędzi cewl i johntheripper.

Na początku korzystamy z cewl’a, aby pobrać z serwera listę słów posiadających co najmniej 6 znaków:

Rysunek 15. Lista słów pobrana ze strony ofiary.

Następnie używamy john’a do spermutowania listy, korzystając z niestandardowej reguły TryHarder:

john –wordlist=cewl.txt –rules=TryHarder –stdout > cewlmangled.txt

Rysunek 16. Permutacja listy pobranych słów z pomocą narzędzia johntheripper.

Wygenerowaliśmy całkiem pokaźną, dedykowaną listę haseł. Zobaczmy jak sprawdzi się w praktyce:

Rysunek 17. Hasło użytkownika nanoresearcher91 zostało odnalezione

Jak widać, nasza dedykowana lista haseł sprawdziła się doskonale. Warto pamiętać, że użytkownicy lubią ustawiać hasła zgodne z zainteresowaniami lub tematyką portalu na którym się rejestrują i używanie dedykowanych list haseł ma duże szanse na powodzenie.

ftp-brute.nse

Skrypt ftp-brute służy do audytów haseł używanych do logowania na serwerze FTP.

Skrypt posiada tylko jeden własny argument:

  • ftp-brute.timeout – czas oczekiwania na odpowiedź serwera w sekundach. Domyślnie jest to 5s, lecz jeśli serwer specjalnie opóźnia odpowiedź dla niepoprawnego logowania, warto zaniżyć tą wartość dla zwiększenia wydajności skryptu.

Reszta argumentów, z których możemy skorzystać to te z bibliotek brute i unpwdb: userdb, passdb, brute.credfile, brute.firstonly, brute.emptypass, brute.delay, brute.guesses, brute.retries, brute.passonly.

Przykładowe użycie

Rysunek 18. Znalezione dane dostępowe do serwera FTP.

mysql-brute.nse

Skrypt mysql-brute służy do łamania danych dostępowych do serwera MySQL.

Tak samo jak w ftp-brute, mamy tutaj do dyspozycji tylko jeden należący do skryptu argument – mysql-brute.timeout – i działa on w ten sam sposób: przekazujemy w nim wartość oczekiwania na odpowiedź serwera MySQL w sekundach (domyślnie: 5s).

Tak samo jak w reszcie skryptów korzystających z bibliotek brute i unpwdb możemy korzystać z argumentów userdb, passdb i brute.*.

Przykładowe użycie

Tym razem do ataku skorzystamy z dostępu do web shell’a uzyskanego we wcześniejszym przykładzie (Rysunek 12.).

Rysunek 19. Skorzystanie z Nmapa dostępnego na serwerze ofiary do ataku na usługę MySQL.

ssh-brute.nse

Skrypt ssh-brute służy do łamania haseł usługi SSH metodą słownikową.

Ssh-brute znów oferuje tylko jeden argument, definiujący czas oczekiwania na odpowiedź: ssh-brute.timeout i także domyślną jego wartością jest 5s.

Przydatne argumenty z bibliotek unpwdb i brute: userdb, passdb, brute.credfile, brute.firstonly, brute.emptypass, brute.delay, brute.guesses, brute.retries, brute.passonly.

Przykładowe użycie

Rysunek 20. Dane dostępowe odnalezione w 2 sekundy korzystając z domyślnych list Nmapa.

smb-brute.nse

Skrypt smb-brute próbuje odgadnąć słabe hasła użytkowników używane do autoryzacji przez protokół SMB (protokół służący udostępnianiu zasobów komputerowych np. plików i drukarek).

Jeśli konto gościa dla SMB jest dostępne, wtedy system Windows na próby uwierzytelnienia z nieprawidłowym (nieistniejącym) loginem odpowiada w inny sposób niż na próby logowania z prawidłowym loginem (takim, który w systemie istnieje). Skrypt smb-brute dedukuje z powyższego, które konta istnieją w systemie
i w dalszej części prób zajmuje się już tylko nimi, przez co atak nie odbywa się dłużej “na ślepo”, oszczędzając dzięki temu sporo czasu.

Słynny robak – Conficker, od swojego drugiego wariantu został rozbudowany o próby ataków słownikowych na SMB i rozpowszechniał się w dużej mierze dzięki udanym atakom na słabe hasła udostępnionego zasobu ADMIN$.

Dostępne dla skryptu smb-brute argumenty:

  • smblockout – argument zmusza skrypt do kontynuowania, nawet jeśli docelowe konto jest zablokowane lub zostanie zablokowane po kolejnych próbach;
  • canaries – limit ilości prób, służący do sprawdzenia, po ilu próbach pierwsze konto zostanie zablokowane (domyślnie: 3);
  • brutelimit – limit ilości nazw użytkowników do sprawdzenia

A także dobrze już znane passdb i userdb.

Przykładowe użycie

Rysunek 21. Niestety w tym przypadku nie udało się złamać danych dostępowych do udostępnionych zasobów.

pop3-brute.nse

Skrypt pop3-brute próbuje odnaleźć prawidłowe hasła do kont usługi POP3.

W argumencie pop3loginmethod wskazujemy, z której metody logowania ma skorzystać skrypt. Do wyboru mamy: “USER”, “SASL-PLAIN”, “SASL-LOGIN”, “SASL-CRAM-MD5”, “APOP”. Domyślną metodą jest “USER”.

Nazwy użytkowników i hasła wskazujemy w argumentach userdb i passdb lub brute.credfile. Inne parametry ataku ustawiamy korzystając z umówionych wcześniej argumentów:  brute.firstonly, brute.emptypass, brute.delay, brute.guesses, brute.retries.

Przykładowe użycie

Rysunek 22. Złamane dane logowania do usługi POP3.

imap-brute.nse

Skrypt imap-brute służy do przeprowadzenia audytu haseł używanych do uwierzytelnienia na serwerze IMAP.

Typ mechanizmu uwierzytelnienia wskazujemy w argumencie imap-brute.auth, który może mieć którąś z poniższych wartości:

  • LOGIN
  • PLAIN
  • CRAM-MD5
  • DIGEST-MD5
  • NTLM

Przydatne argumenty: userdb, passdb, brute.credfile brute.firstonly, brute.emptypass, brute.delay, brute.guesses, brute.retries.

Przykładowe użycie

Rysunek 23. Ku naszemu zdziwieniu odnalezione dane dostępowe są takie same jak w przypadku usługi POP3 :)

Podsumowanie

Jak widać skrypty Nmapa dość dobrze radzą sobie z łamaniem haseł różnych usług. Dużym plusem jest wygoda – korzystając z jednego narzędzia możemy wykrywać usługi a następnie łamać dostęp do większości z nich. Minusem jest jednak to, że wyniki niestety nie zawsze są rzetelne i trzeba zagłębiać się w działanie skryptu za pomocą dodatkowego argumentu –script-trace.

– Marcin Mol, hackuje w Securitum

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Kamil

    Jak zawsze bardzo dobrze opisany poradnik! Pozdrawiam!

    Odpowiedz
  2. cvnt5
    Odpowiedz
  3. LamaczKlamacz

    Pytanie: jaka jest przewaga nad innymi lamaczami?

    Odpowiedz

Odpowiedz