Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book

Nmap i 12 przydatnych skryptów NSE

23 kwietnia 2018, 19:54 | Teksty | komentarze 2
Tagi: ,

Nmap to najbardziej popularny, darmowy skaner bezpieczeństwa, którego autorem jest Gordon Lyon (a.k.a. Fyodor Vaskovich). Pierwsza wersja Nmapa została opublikowana 1. października 1997 roku w internetowym magazynie Phrack.

Dla zainteresowanych początkami skanera, oto pełny, anglojęzyczny artykuł przedstawiający możliwości i kod źródłowy pierwszej wersji Nmapa: The Art of Port Scanning.

W momencie pisania tego tekstu najnowszą wersją Nmapa jest 7.70. Wersja ta jest wyposażona w 588 skryptów NSE (Nmap Scripting Engine), które obok ogromnej ilości standardowych opcji skanowania, dają możliwość dużo bardziej szczegółowego przebadania interesujących nas hostów.

NSE może być użyte między innymi do trafniejszej detekcji wersji danej usługi, łamania nazw użytkowników i haseł, wykrywania i wykorzystywania znanych podatności, a nawet wykrywania istniejących już tylnych furtek pozostawionych przez napastnika i fuzzingu.

Lista wszystkich dostępnych skryptów wraz z opisami jest publikowana pod adresem https://nmap.org/nsedoc/. Alternatywnie, aby uzyskać listę, możemy skorzystać z terminala (zakładając, że Nmap został zainstalowany w domyślnej lokalizacji):

LINUX

  • ls -1 /usr/share/nmap/scripts

WINDOWS

  • dir “C:\Program Files\Nmap\scripts”

lub

  • dir “C:\Program Files (x86)\Nmap\scripts”

Do uzyskania informacji na temat przeznaczenia skryptu służy polecenie:

  • nmap –script-help <nazwa_skryptu>

Poniżej postaram się przedstawić kilka przydatnych z punktu widzenia pentesterów i administratorów skryptów NSE.

1. http-enum.nse

Skrypt http-enum, korzystając z domyślnej bazy fingerprintów, wysyła ponad 2000 zapytań do serwera WWW, próbując dotrzeć do plików i/lub katalogów specyficznych dla popularnych aplikacji webowych. Jeśli serwer zwróci kod “200 OK” lub “401 Authentication Required” na któreś z zapytań, będzie to oznaczało, że pożądany plik lub katalog jest dostępny na serwerze, a wtedy na podstawie fingerprinta skrypt zwróci nazwę aplikacji.

Rysunek 1. Przykładowy wynik działania skryptu http-enum.

Działanie tego skryptu jest podobne do działania popularnego skanera aplikacji Web – Nikto – i jest możliwość podpięcia bazy fingerprintów Nikto, zawierającej ponad 6500 wpisów, do domyślnej bazy skryptu, za pomocą argumentu http-fingerprints.nikto-db-path. Jeśli po tym argumencie nie podamy ścieżki do bazy Nikto, skrypt będzie sam starał się zlokalizować bazę db_tests.

Alternatywnie, możemy stworzyć własną bazę fingerprintów i wskazać ją w argumencie http-enum.fingerprintfile. Aby to uczynić należy stworzyć skrypt w języku Lua, przykładowo z następującą zawartością:

Rysunek 2. Przykładowa baza fingerprintów.

Następnie wskazujemy ścieżkę do skryptu w argumencie http-enum.fingerprintfile.

Rysunek 3. Użycie własnej bazy fingerprintów.

Kolejnym przydatnym argumentem jest http-enum.basepath, który jako parametr przyjmuje ścieżkę od której rozpocznie się skanowanie.

Rysunek 4. Skanowanie z ustawionym folderem startowym.

Domyślnie, skrypt http-enum traktuje jako istniejące te pliki i foldery, na które serwer odpowiada kodami “200 OK” i “401 Authentication Required”. Aby rozszerzyć ten zakres do wszystkich kodów (z wyjątkiem “404 Not Found”), należy użyć argumentu http-enum.displayall. Dzięki temu prawdopodobieństwo znalezienia ukrytych folderów jest wyższe, lecz generowanych jest dużo więcej false-positive’ów.

2. http-grep.nse

Skrypt http-grep przeszukuje podaną stronę pod kątem przydatnych informacji. Domyślnie zwraca adresy e-mail oraz adresy IP znalezione na wszystkich odkrytych przez skrypt podstronach. Możemy podać skryptowi w argumencie http-grep.url podstronę, którą chcemy przeszukać, a używając argumentu http-grep.builtins rozszerzymy zakres przeszukiwania do adresów e-mail, adresów IP, numerów telefonu, numerów kart mastercard, visa, discover, amex i ssn. Jeśli chcemy dodać jakieś słowo lub wyrażenie regularne do wyszukania, przekazujemy je argumentowi http-grep.match. Domyślną, ustawioną na 3, głębokość przeszukiwania możemy zmienić za pomocą argumentu http-grep.maxdepth.

Rysunek 5. Wynik działania skryptu http-grep z podaną podstroną do przeszukania.

Rysunek 6. Dodane proste wyrażenie regularne do wyszukiwania.

3. ssh-brute.nse

Skrypt ssh-brute służy do łamania haseł usługi SSH metodą słownikową. Domyślnie korzysta ze swojej, dość rozbudowanej bazy użytkowników i haseł. Można jednak, za pomocą argumentów userdb oraz passdb, przekazać skryptowi nasze listy.

Rysunek 7. Utworzenie list z loginami i hasłami.

Rysunek 8. Przekazanie utworzonych list argumentom userdb oraz passdb i znalezienie jednej działającej pary.

4. dns-brute.nse

Skrypt dns-brute próbuje odnaleźć jak najwięcej subdomen badanego hosta korzystając z najczęściej używanych nazw subdomenowych.

Rysunek 9. Przykładowy wynik działania skryptu dns-brute.

5. http-config-backup.nse

Skrypt http-config-backup wysyła wiele zapytań do serwera WWW, próbując uzyskać kopie konfiguracji popularnych CMS’ów pozostawionych przez użytkownika lub edytor tekstowy. Według badania przeprowadzonego przez autora narzędzia CMSploit, którym zainspirowany jest skrypt http-config-backup, prawie 1% stron korzystających z CMS’ów ujawnia swoje dane dostępowe do bazy danych poprzez pozostawione kopie konfiguracji.

Rysunek 10. Wynik działania skryptu http-config-backup i znalezione dwie kopie konfiguracji.

6. vulscan.nse

Skrypt vulscan dodaje Nmapowi funkcjonalność skanera podatności. Niestety, nie należy on do standardowej biblioteki skryptów Nmapa, dlatego, aby z niego skorzystać należy pobrać go ze strony http://www.computec.ch/projekte/vulscan/?s=download i umieścić wypakowany folder vulscan w katalogu scripts Nmapa.

W przypadku tego skryptu trzeba zastosować dodatkową opcję -sV, która służy do wykrycia wersji skanowanego oprogramowania, a wtedy na jej podstawie, skrypt korzystając z kilku baz (pliki .csv w folderze vulscan) sugeruje możliwe podatności.

Rysunek 11. Uruchomienie skanowania z opcją -sV.

Rysunek 12. Fragment z sugerowanymi podatnościami.

Aby zmienić szablon wyniku działania skryptu, można użyć argumentu vulscanoutput, który może przyjąć jeden z czterech argumentów:

  • details – w wyniku otrzymamy nazwę podatności, ilość dopasowań, nazwę i wersję oprogramowania oraz linki do exploitów lub objaśnień podatności
  • listid – w wyniku otrzymamy samo ID lub CVE wykrytych podatności
  • listlink – w wyniku otrzymamy linki do exploitów lub objaśnień podatności
  • listtitle – w wyniku otrzymamy tylko nazwy wykrytych podatności

Można także stworzyć własny szablon z pomocą następujących elementów:

  • {id} – ID podatności
  • {title} – tytuł podatności
  • {matches} – ilość dopasowań
  • {product} – nazwa oprogramowania
  • {version} – wersja oprogramowania
  • {link} – link do exploita/wyjaśnienia podatności
  • \n – nowa linia
  • \t – tabulator

Tak będzie wyglądało polecenie, którego wynikiem ma być tabelka zawierającą ID i link do podatności:

nmap -sV --script vulscan/vulscan --script-args vulscanoutput='{id}\t{link}'

Rysunek 13. Fragment z sugerowanymi podatnościami, z parametrem “details” przekazanym do vulscanoutput.

7. smb-enum-users.nse

Zadaniem skryptu smb-enum-users jest wyliczenie wszystkich użytkowników dostępnych na skanowanym systemie Windows. Skrypt ten korzysta z protokołu MSRPC (Microsoft RPC) i dwóch technik enumeracji:

  • SAMR – technika ta zwraca więcej informacji niż same nazwy użytkownika, jest o wiele mniej “hałaśliwa” od LSA oraz przez to, że korzysta z dedykowanej funkcji, zwróci wszystkie istniejące konta. Wymaga uprawnień minimum zwykłego użytkownika (na systemie Windows 2000 nie wymaga żadnych uprawnień);
  • LSA – oprócz nazw użytkownika zwraca konta systemowe, grupy i aliasy. Wymaga mniejszych uprawnień od SAMR – może być użyta z uprawnieniami gościa, lecz za to generuje dużą ilość logów na skanowanym systemie.

Gdy uruchomimy skrypt bez argumentów, skorzysta on z obydwóch powyższych technik. Jeśli chcemy ograniczyć skanowanie do jednej techniki, wystarczy użyć argumentu:

  • samronly – dla skanowania tylko metodą SAMR;
  • lsaonly – dla skanowania tylko metodą LSA.

Jeśli konto gościa z pustym hasłem nie jest dostępne na skanowanym systemie, będziemy musieli użyć jeszcze argumentów smbusername i smbpassword
i podać dane dostępowe użytkownika systemu. W takim przypadku można też ograniczyć skanowanie do samej techniki SAMR, aby przebiegło ono “ciszej”.

Rysunek 14. Enumeracja użytkowników techniką SAMR.

8. http-wordpress-enum.nse

Skrypt http-wordpress-enum, korzystając z bazy wp-themes.lst zawierającej około 32 tysięcy wpisów oraz z bazy wp-plugins.lst posiadającej ponad 14 tysięcy nazw wtyczek do WordPressa, sprawdza, które motywy i pluginy zostały zainstalowane na skanowanym serwisie. Nazwy w bazach posortowane są według popularności. Przekazanie liczby w argumencie http-wordpress-enum.search-limit zmieni domyślną wartość sprawdzania po 100 najpopularniejszych wtyczek i motywów, a gdy przekażemy “all”, zostaną sprawdzone wszystkie nazwy z baz. Jeśli WordPress na badanym serwerze został zainstalowany w niestandardowym katalogu, wskazujemy jego ścieżkę w argumencie http-wordpress-enum.root. Kolejnym przydatnym parametrem jest http-wordpress-enum.check-latest, który sprawdzi aktualność wtyczek
i motywów, jeśli przekażemy mu “true”.

Rysunek 15. Przykładowy wynik działania skryptu http-wordpress-enum.

9. firewalk.nse

Skrypt firewalk korzystając z techniki śledzenia trasy pakietu (traceroute)
i upływu TTL, znanej jako firewalking, próbuje wykryć reguły zapory / bramy sieciowej. Parametry skanowania można kontrolować za pomocą następujących argumentów:

  • firewalk.max-probed-ports – ilość portów do przebadania dla każdego protokołu. Ustawiona na -1 zbada wszystkie filtrowane porty;
  • firewalk.max-retries – maksymalna ilość retransmisji;
  • firewalk.recv-timeout – czas trwania pętli zbierającej pakiety (w milisekundach);
  • firewalk.max-active-probes – maksymalna ilość równoległych skanów;
  • firewalk.probe-timeout – ważność pojedynczego skanu (w milisekundach).

Rysunek 16. Skrypt firewalk w akcji.

10. mysql-empty-password.nse

Skrypt mysql-empty-password sprawdza, czy jest możliwość zalogowania się do serwera MySQL na konto root lub anonymous używając pustego hasła.

Rysunek 17. Znalezione konto MySQL użytkownika root z pustym hasłem.

11. mysql-users.nse

Skrypt mysql-users służy do wylistowania dostępnych na serwerze MySQL użytkowników. Do wylistowania użyjemy konta root z pustym hasłem, które odkryliśmy poprzednim skryptem. Dane dostępowe przekazujemy w argumentach mysqluser oraz mysqlpass. Gdy hasło jest puste, można pominąć argument mysqlpass.

Rysunek 18. Wylistowanie użytkowników MySQL za pomocą konta root z pustym hasłem.

12. mysql-brute.nse

Skrypt mysql-brute służy do łamania danych dostępowych do serwera MySQL. Poprzednim skryptem wykryliśmy użytkownika testerr, którego hasło postaramy się teraz złamać. Na początku należy stworzyć plik z nazwami użytkowników – w tym przykładzie będzie to tylko użytkownik testerr.

Rysunek 19. Lista użytkowników.

Następnie stworzoną listę przekazujemy argumentowi userdb i opcjonalnie możemy użyć argumentu passdb do wskazania bazy haseł.

Podawanie skryptowi swoich baz oczywiście nie jest konieczne i jeśli tego nie zrobimy skorzysta on z domyślnych baz z najbardziej popularnymi loginami i hasłami. W tym przykładzie wykorzystamy domyślną bazę ponad 5000 popularnych haseł nie używając argumentu passdb.

Rysunek 20. Skanowanie zakończone sukcesem – hasło użytkownika testerr zostało odnalezione.

Podsumowanie

Nmap bez wątpienia powinien być jednym z podstawowych narzędzi każdego pentestera i administratora, a ciągle rosnąca liczba rozbudowanych skryptów NSE sprawia, że posiada on funkcjonalności pozwalające na szczegółowe przebadanie bezpieczeństwa sieci, bez konieczności korzystania z innych narzędzi.

–Marcin Mol

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



Komentarze

  1. P4

    Brakuje mi tutaj jeszcze ssl-enum-ciphers, którego używam częściej niż każdego z Twojej listy. Pozdrawiam.

    Odpowiedz

Odpowiedz