Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Nmap NSE – kilka przykładów
Wstęp
Nmap to bez wątpienia najbardziej popularny skaner portów, ale od kiedy wprowadzono do niego NSE (Nmap Scripting Engine), powoli staje się wręcz prawdziwym kombajnem, umożliwiającym nie tylko jeszcze dokładniejsze rozpoznanie skanowanego celu, jego usług i aplikacji, ale nawet wykrywanie i wykorzystanie znalezionych podatności dzięki skryptom NSE.
Skrypty te pisane są w języku Lua z wykorzystaniem bibliotek dostarczonych z Nmapem (znajdują się one w katalogu nselib).
Dzięki NSE, za pomocą samego Nmapa i bez użycia dodatkowych narzędzi, możemy automatyzować pewne etapy testów penetracyjnych (więcej o automatyzacji pisaliśmy przy okazji narzędzia OpenVAS).
Ale na tym nie kończą się jego możliwości.
Wśród 446 oficjalnych skryptów dostarczanych wraz z Nmapem istnieją takie, które umożliwiają weryfikację systemów pod kątem zainfekowania przez malware, a nawet proste fuzzery.
Charakterystyka
1. Rodzaje skryptów
Generalnie każdy skrypt w zależności od działania przypisany jest do co najmniej jednej z czternastu kategorii:
- auth: skrypty związane z testowaniem mechanizmów uwierzytelniania czy enumeracją kont użytkowników,
- broadcast: skrypty wykrywające hosty i serwery niektórych usług za pomocą pakietów broadcastowych, bądź multicastowych,
- brute: skrypty wykonujące ataki brute force na różnego rodzaju usługi sieciowe,
- default: skrypty wykonywane domyślnie po uruchomieniu Nmapa z parametrem -sC lub -A,
- discovery: głównie skrypty, które w sposób nieinwazyjny (choć są wyjątki ;) ) starają się wydobyć jak najwięcej informacji na temat samego skanowanego systemu i jego usług,
- dos: kilka skryptów wykonujących ataki DoS, które mogą spowodować crash atakowanej usługi,
- exploit: skrypty potrafiące wykorzystać istniejące podatności w usługach, bądź w niektórych aplikacjach i serwerach webowych,
- external: skrypty, które podczas działania wykonują też połączenia z systemem innym niż skanowany, najczęściej w celu pozyskania jakichś informacji o skanowanym celu; np. zapytania do serwera udostępniającego usługę geolokalizacji IP,
- fuzzer: skrypty wykorzystujące technikę fuzzingu do wykrywania błędów; na razie w tej kategorii znajdują się tylko 3 proste skrypty,
- intrusive: wszystkie skrypty działające w sposób mocno inwazyjny lub potencjalnie niebezpieczny – głównie skrypty z kategorii brute, exploit i vuln,
- safe: skrypty bezpieczne, przeciwieństwo kategorii intrusive,
- malware: skrypty sprawdzające, czy system jest zainfekowany przez złośliwe oprogramowanie,
- version: skrypty zajmujące się zaawansowanym wykrywaniem wersji niektórych usług; opcja ta działa tylko w przypadku, kiedy Nmap jest uruchomiony z parametrem -sV ,
- vuln: skrypty, które potrafią wykryć niektóre znane podatności; część skryptów potrafi je również wykorzystać.
2. Przykłady zastosowania
Czas na spotkanie z kilkoma wybranymi skryptami NSE w praktyce.
Zacznijmy od najprostszego skryptu z kategorii brute-force. Przypuśćmy, że chcemy odkryć jakieś istniejące konta (wraz z hasłami) na serwerze poczty POP3. Do tego celu możemy wykorzystać skrypt NSE o nazwie pop3-brute.
Zacznijmy od zdefiniowania pliku zawierającego listę nazw użytkowników:
Jak widać są to dość uniwersalne dane logowania, które można wykorzystać w przypadku usług różnego rodzaju protokołów.
Jako wartość argumentu userdb skryptu podajemy ścieżkę (względną lub bezwzględną) do pliku z nazwami użytkowników, a dla passdb – pliku z hasłami.
Zakładając, że atakowany serwer znajduje się pod adresem 192.168.1.125 oraz że usługa POP3 nasłuchuje na standardowym porcie, możemy wywołać Nmap w taki sposób:
Jak widać, skrypt odnalazł login i hasło jednego użytkownika tego serwera poczty.
Istnieje również możliwość wykorzystania domyślnie dostarczonych z Nmapem bazy loginów (nselib/data/usernames.lst) i haseł (nselib/data/passwords.lst) – nie podajemy wówczas parametrów userdb oraz passdb.
Rozważmy teraz inny scenariusz. Załóżmy, że chcemy dostać się do zasobu umieszczonego na serwerze www, który wymaga uwierzytelnienia za pomocą Basic access authentication.
W tym celu można by wykorzystać narzędzia typu hydra, brutus, czy nawet burp, ale wystarczy mały skrypcik NSE o nazwie http-brute.
Korzysta się z niego podobnie jak z poprzedniego, przy czym należy jeszcze określić ścieżkę do zabezpieczonego zasobu za pomocą parametru http-brute.path:
Można oczywiście użyć też obu skryptów jednocześnie:
Jeżeli usługi nasłuchiwałyby na niestandardowych portach, to trzeba by jeszcze nakazać Nmapowi wersjonowanie przez parametr -sV.
Bardzo często problemy z bezpieczeństwem serwerów są spowodowane przez znajdujące się na serwerach www nieodpowiednio zabezpieczone aplikacje webowe.
Okazuje się, że już podczas samego skanowania sieci możemy dowiedzieć się, jakie zasoby i aplikacje znajdują się na serwerze. W tym celu z poziomu Nmapa możemy wykorzystać skrypt http-enum, który skanuje serwer www w poszukiwaniu katalogów i plików używanych przez popularne aplikacje internetowe.
Na podstawie tych informacji skrypt potrafi podać nazwy istniejących aplikacji, co pozwoli nam na dalsze profilowanie ataku.
Najprostsze użycie tego skryptu wygląda następująco:
Jak widać skrypt zwrócił wiele cennych informacji, wykrywając między innymi wiele potencjalnie interesujących zasobów sieciowych i aplikacji webowych.
W tego typu scenariuszach czasami może być również przydatny skrypt http-vhosts, wykrywający – na zasadzie zgadywania nazw – vhosty na serwerze.
Lista popularnych nazw vhostów wykorzystywanych przez ten skrypt znajduje się w nselib/data/vhosts-default.lst.
Przykładowo odgadnięcie vhostów na serwerze www.google.com za pomocą tego skryptu wygląda tak:
Przydatny może być również skrypt http-robots.txt, który, jak sugeruje nazwa, pobiera z serwera plik /robots.txt, a następnie wyświetla wpisy Disallow:
W przypadku dużej liczby takich wpisów, do wyświetlenia wszystkich musimy zwiększyć poziom szczegółowości komunikatów (w tym wypadku do wartości 4), podając jako jeden z argumentów wywołania programu -vvvv , co jest równoważne (w sensie Nmapa) zapisowi -v4.
Ciekawy jest również skrypt ip-forwarding, umożliwiający wykrycie systemów z włączonym przekazywaniem pakietów IP między interfejsami sieciowymi oraz systemów Windows z włączonym udostępnianiem połączenia internetowego. Skrypt wymaga podania jednego argumentu – target tj. systemu do którego ( w przypadku sukcesu ) ma wysłać pinga, łącząc się poprzez system testowany. Ponadto w przypadku systemów uniksopodobnych Nmap musi zostać uruchomiony z uprawnieniami roota. Aby zaoszczędzić czas, warto wyłączyć skanowanie portów w Nmapie za pomocą parametru -sn.
Podsumowanie
Jak widać już na przykładzie kilku skryptów, możliwości jakie daje NSE są ogromne, a liczba skryptów ciągle rośnie. Myślę, że dzięki niemu Nmap zyskał jeszcze bardziej na swojej popularności, a z całą pewnością ułatwił automatyzację wielu zadań administratorom i pentesterom.
— Sebastian Włodarczyk [netcuter<at>gmail.com]
Skoro tyle czasu poświęcasz HTTP, polecam zerknąć na prace George’a Chatzisofroniou, tegorocznego studenta GSoC. Większość jest już albo w Nmapie 6.40, albo w SVN, wśród tych tutaj:
https://svn.nmap.org/nmap/scripts/
Tutaj jest niesamowicie ciekawy wykład Fyodora, autora Nmapa (oraz Davida, drugiego maintainera, też naprawdę świetnego hakera) na temat NSE oraz skryptów SMB, wykorzystywanych do współdzielenia plików w Windows:
https://www.youtube.com/watch?v=M-Uq7YSfZ4I
Z innych ciekawych skryptów, polecam uwadze *-geolocation-* ;)
Ciekawy artykuł. Trzeba będzie zerknąć na Lua i spróbować coś samemu pokodować :)
BTW, ciekawe, czemu akurat Lua, a nie C, Perl czy Python.
Bo Lua jest banalnie proste w osadzaniu. Perl jest praktycznie nieczytelny, C jest językiem zbyt niskiego poziomu a Lua ma tę wygodną cechę, że jest banalnie prosty. Autorzy chwalą się tym, że cały kod + dokumentacja + binarki spokojnie mieszczą się na dyskietce (http://www.lua.org/about.html)
http://nmap.org/presentations/Sharkfest10/sharkfest10-slides-fyodor.pdf
(slajd 5)
BTW, Wasze powiadomienia o mailach trafiają mi do spamu, sprawdźcie konfigurację serwerów maili.
@bl4de: też mnie zastanawiało czemu akurat Lua ale po lekturze angielskiej strony na Wikipedii zaczynam rozumieć. Patrząc na to kto jeszcze (albo kto najpierw?) wykorzystuje ten język, nie dziwi dlaczego właśnie Lua. Sporo osób może go już znać z innych narzędzi z podobnej grupy tematycznej. Zapewne łatwo go zintegrować z własną aplikacją i ponoć jest lekki. Python czy Perl są fajne do programowania tego czy owego ale mogą być za ciężkie do pewnych zastosowań. No i instalacja na Windowsie nmap i osobno np. Perla/Pythona może przerosnąć przeciętnego h4X0r4 co se chce „poskanować”.
@MateuszM
Fakt, zgadzam się z Tobą po przestudiowaniu paru materiałów na temat Lua :)
Jako język skryptowy do pisania wszelkiego rodzaju „wtyczek” nadaje się idealnie. No i rzeczywiście stosowany jest w wielu dziedzinach – zaskoczyła mnie jego popularność choćby w dziedzinie gamedevu.
@d33tah: jak są w 6.40 to pewnie przeglądałem :)
SMB to nie tylko windows ;), natomiast zgadzam się co do Lua ;)
@bl4de: thx ;) btw też myślałem o napisaniu jakiegoś skryptu NSE, ale raczej w kontekście aplikacji webowych – trzeba tylko troche czasu znaleźć ;)
@netcuter:
Nie wszystkie są. Część została napisana po wydaniu 6.40.
@d33tah:
Przejrzałem jeszcze 3 fajne skrypty na githubie – może je miałeś na myśli ;) ?
ip-forwarding sam akurat nie testowałem, ale wygląda fajnie ;) Rozumiem, że to jeden z tych trzech, o których mówisz, w takim razie które należą do tych dwóch pozostałych?
(wcześniej ip-forwarding nie widziałem)
chodziło mi o te 3 :
https://github.com/sophron/nmap-nse-scripts/tree/master/scripts