Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Łamanie haseł z pomocą nmap NSE
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:
netdiscover -r 10.0.0.0/24
Skan 2000 najbardziej popularnych portów pokazuje, że domyślny dla serwerów WWW port jest otwarty.
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.
dirb http://10.0.0.3
Szybki skan dirb’em pokazuje, że administrator serwera starał się jednak coś ukryć…
Wejście do katalogu /secret wymaga podania nazwy użytkownika i hasła. W tym miejscu skorzystamy z omawianego skryptu http-brute.
nmap -p80 --script http-brute 10.0.0.3 --script-args http-brute.path=/secret/
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.
nmap -p80 --script http-brute --script args http-brute.path=/secret/,userdb=./SecLists/Usernames/top-usernames-shortlist.txt,passdb=./SecLists/Passwords/Leaked-Databases/myspace.txt 10.0.0.3
Tym razem skrypt zaraportował znalezienie prawidłowych danych logowania. Sprawdźmy czy nie jest to false-positive.
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:
- Jeśli odpowiedź była pusta – uwierzytelnienie powiodło się;
- 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ę;
- 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ę;
- 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ę;
- 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ą:
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.
nmap -p80 --script http-form-brute --script-args http-form-brute.path=/secret/4d71dc4916f67033d88a20L0G1N914e2a1ba2/index.php,userdb=users.txt,brute.firstonly=1,passdb=./SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt 10.0.0.3
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:
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:
Tworzymy ich listę i przekazujemy skryptowi razem z listą haseł z któregoś z wycieków.
nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.threads=10,http-wordpress-brute.uri=/wordpress/,userdb=users.txt,passdb=./SecLists/Passwords/Leaked-Databases/elitehacker.txt 10.0.0.3
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:
cewl -d 3 -m 6 -w cewl.txt http://10.0.0.3/wordpress/
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
Wygenerowaliśmy całkiem pokaźną, dedykowaną listę haseł. Zobaczmy jak sprawdzi się w praktyce:
nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.threads=20,http-wordpress-brute.uri=/wordpress/,userdb=users.txt,passdb=cewlmangled.txt,brute.firstonly 10.0.0.3
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
nmap -p21 --script ftp-brute --script-args ftp-brute.timeout=3s,userdb=ftpusers.txt 10.0.0.4
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.).
nmap -p3306 --script mysql-brute localhost
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
nmap -p22 --script ssh-brute --script-args brute.firstonly 10.0.0.4
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.
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
nmap -p139,445 --script smb-brute 10.0.0.5 --script-args userdb=./SecLists/Usernames/top-usernames-shortlist.txt
nmap -p139,445 --script smb-brute 10.0.0.5 --script-args userdb=./SecLists/Usernames/top-usernames-shortlist.txt,passdb=./SecLists/Passwords/Leaked-Databases/rockyou-15.txt
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
nmap -p110 --script pop3-brute --script-args brute.firstonly,userdb=users.txt 10.0.0.4
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
nmap -p143 --script imap-brute --script-args brute.firstonly,userdb=users.txt 10.0.0.4
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
Jak zawsze bardzo dobrze opisany poradnik! Pozdrawiam!
Kopiuj / Wklej z TORowej cebulki ;-)
DoomHead
http://qd73mvvc7v7zewwl.onion/viewtopic.php?id=5188
Żadne kopiuj/wklej – chyba, że w drugą stronę ;)
W każdym razie nie istnieje żaden temat pod tym linkiem. Pozdrawiam.
Pytanie: jaka jest przewaga nad innymi lamaczami?
Główna przewaga została wymieniona w podsumowaniu – wygoda + jeśli mamy dostęp do zdalnego komputera i chcemy złamać hasło do lokalnie działającej usługi to dużo bardziej prawdopodobne jest, że administrator ma zainstalowanego Nmapa a nie np. Hydre (Rysunek 19.).
Poza tym NSE obsługuje szeroki wachlarz usług (na ten moment ponad 70 skryptów brute).
Pozdrawiam.
@Marcin, z calym szacunkiem ale lamanie hasla na przejetym komputerze (pentesty, agresor), to zle postepowanie, nie realne.
Poza watpliwa wygoda, jakie sa zalety? Moga sie wypowiedziec osoby z doswiadczeniem?