Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Tworzymy własne skrypty NSE dla Nmapa
Nmap wykonuje świetną pracę jako narzędzie do standardowych testów penetracyjnych, ale do bardziej szczegółowych analiz bezpieczeństwa lepiej tworzyć własne skrypty. Umożliwia to silnik Nmap Scripting Engine.
Od wielu lat Nmap stanowi niezbędne narzędzie administratora systemu. Do przeprowadzania testów penetracyjnych nie ma sobie równych. Domyślnie oferuje ponad sto standardowych skryptów. Prócz uruchamiania wstępnie zdefiniowanych skryptów umożliwia jednak znacznie więcej.
Silnik NSE (ang. Nmap Scripting Engine) daje potencjalnie najpotężniejszą i najbardziej elastyczną możliwość uruchamiania własnych skryptów i automatyzacji czynności związanych ze skanowaniem i analizą. Skrypty bazują na języku programowania Lua, który jest łatwy do nauczenia i idealnie się nadaje do pisania skryptów testowych. Nmap wykonuje skrypty równolegle, z dużą szybkością i wysoką wydajnością.
Kluczowe funkcje Nmapa obejmują analizę sieci, wersji i luk w bezpieczeństwie. NSE przenosi skanowanie przy użyciu tego narzędzia na całkowicie nowy poziom, umożliwiając wykrywanie luk podanych na ataki wstrzykiwania SQL i potencjalne wektory ataków siłowych. Dzięki NSE możemy tworzyć własne skrypty testowe i modyfikować istniejące, które są podzielone na kilka kategorii. Warto je poznać (Tabela 1), aby móc je poprawnie przypisywać w konfiguracji nagłówka.
Kategoria | Opis |
---|---|
auth | Przetwarzają dane uwierzytelniające i próbują obejść uwierzytelnianie systemu docelowego; przykłady: x11-access, ftp-anon i oracle-enum-users, wyjątkiem są skrypty dla ataków siłowych. |
broadcast | Generują przesył, by wykryć niezidentyfikowane wcześniej hosty w sieci lokalnej; argument newtargets automatycznie dodaje nowo wykryte hosty do kolejki skanowania. |
default | Standardowe skrypty używane po uruchomieniu Nmapa z opcjami -sC lub -A. |
discovery | Aktywnie starają się wykryć więcej informacji o sieci poprzez na przykład kwerendowanie rejestrów publicznych, urządzeń SMTP, usług itp.; przykłady: html-title (przechwytuje nazwę strony internetowej), smb-enum-shares (odczytuje udziały systemu Windows). |
dos | Mogą powodować ataki typu odmowa usług, by wykrywać luki; awaria usługi to raczej niepożądany skutek uboczny niż cel. |
exploit | Wykorzystują luki bezpieczeństwa. |
external | Wysyłają informacje do zewnętrznych baz danych i usług sieciowych, na przykład pozwalają Nmapowi kwerendować serwer whois pod kątem bardziej szczegółowych informacji o systemie docelowym. |
fuzzer | Umieszczają nieoczekiwane lub losowe pola w każdym pakiecie wysyłanym do systemu docelowego, co pozwala na przykład wykrywać zaskakujące lub nieznane luki na systemach docelowych; przykład: dns-fuzz (wysyła do serwera DNS nieznane żądania, aż serwer ulegnie awarii lub zablokuje połączenie). |
intrusive | Nie dają się przypisać do kategorii bezpiecznych z uwagi na dość wysokie ryzyko awarii systemu docelowego związane z użyciem znaczących zasobów wykorzystujących istniejące luki. Jeśli nie możemy przypisać własnych skryptów do konkretnej kategorii, powinniśmy przynajmniej je sklasyfikować – jako bezpieczne lub inwazyjne. |
malware | Służą do sprawdzania zainfekowania systemu docelowego przy użyciu złośliwego oprogramowania lub trojana; przykłady: smpt-strangeport (sprawdza obecność intruzów na serwerach SMTP) i auth-spoof (wykrywa demony podszywające się pod adres identd). |
safe | Uznawane za bezpieczne; nie wyrządzają szkód na systemach docelowych, mogą jednak wykorzystywać dużą przepustowość sieci lub inne zasoby; przykłady: ssh-hostkey (sprawdza klucz SSH) i html-title (parsuje tytuł strony internetowej). |
version | Rozszerzenia typów detekcji wersji; nie dają się włączyć bezpośrednio, działają tylko po uruchomieniu wykrywania wersji przy użyciu opcji -sV; przykłady: skypev2-version, pptp-version i iax2-version. |
vuln | Sprawdzają określone podatności; raporty są wyświetlane tylko w razie znalezienia luk. |
Tabela 1: Kategorie skryptów
Możliwości zastosowania
Kluczową funkcją Nmapa zawsze pozostaje skanowanie komponentów sieciowych. System wykrywania wersji potrafi identyfikować tysiące różnych usług, dzięki temu, że skaner bazuje na testach i systemie dopasowywania obsługującym również wyrażenia regularne. Nmap skutecznie rozpoznaje usługi SNMP i wykrywa luki umożliwiające przeprowadzenie ataków siłowych. Jedne i drugie możemy łatwo wykorzystywać przy użyciu NSE i odpowiednich skryptów testowych.
Do najważniejszych zadań administracyjnych należy wykrywanie istniejących i nowych luk w infrastrukturze IT, by wyprzedzić intruzów. Nmap – choć trudno go porównać z innymi skanerami bezpieczeństwa, jak Nessus czy OpenVAS – dzięki silnikowi skryptowemu pozwala przeprowadzać proste testy luk. Obecnie oferuje do tego wiele skryptów, a programiści zapowiadają kolejne.
Nmap i NSE przydają się również do wykrywania tylnych furtek (ang. backdoor). Po udanym ataku hakerzy i robaki zwykle zostawiają sobie otwarte tylne drzwi, by móc łatwiej wrócić. Nmap potrafi je namierzać – może nie wszystkie, ale dużą część. NSE pozwala również wykrywać zaawansowane robaki i tylne drzwi.
Z NSE w roli środowiska skryptowego możemy wykorzystywać znalezione luki, co szczególnie przydaje się w testach penetracyjnych. Wprawdzie programiści nie planują zmieniać Nmapa w rozbudowane narzędzie do łamania zabezpieczeń, jak Metasploit, ale warto wiedzieć, że możemy go użyć w połączeniu z NSE.
Rozpoczynamy pracę z NSE
Skrypty NSE, mające rozszerzenie pliku NSE, w domyślnej instalacji Nmapa są w katalogu /usr/share/nmap/scripts. Aby wywołać skrypt NSE, używamy:
nmap --script nazwa_skryptu.nse host_docelowy
a chcąc uruchomić skrypt i określić ścieżkę:
nmap --script /ścieżka/nazwa_skryptu.nse host_docelowy
Po utworzeniu pierwszego skryptu zapewne nie chcemy uruchamiać go publicznie, mimo to powinniśmy sprawdzić, czy działa poprawnie. Na szczęście twórcy Nmapa udostępniają do tego specjalny serwer testowy w domenie scanme.nmap.org. Do wstępnych testów możemy użyć polecenia:
nmap --script /ścieżka/userdefined-NSE-script.nse scanme.nmap.org
Przy pierwszych krokach warto włączyć debugowanie za pomocą d z wartością od 1 do 9 – im wyższą, tym większa szczegółowość danych wyjściowych. Na przykład:
nmap -sV --script exploit -d3 host_docelowy
Skrypty NSE mają przejrzystą strukturę; definiują nie tylko testy do przeprowadzenia, ale również dane wyjściowe. Są cztery rodzaje skryptów Nmap i NSE różniące się regułami wykonywania: prerule, postrule, portrule, hostrule.
Skrypty prerule wykonywane są przed skanowaniem. Mogą służyć na przykład do zbierania informacji o usługach. Niektóre definiują również nowe systemy docelowe, analizowane następnie przez kolejne skrypty. Na przykład skrypt targets-sniffer.nse używa prerule do sprawdzenia, czy Nmap działa w trybie uprzywilejowanym i skaner poprawnie identyfikuje interfejs sieciowy:
prerule = function() return nmap.is_privileged() and (stdnse.get_script_args("targets-sniffer.iface") or nmap.get_interface()) end
Skrypty postrule, wykonywane po przeskanowaniu wszystkich systemów docelowych przez Nmapa, pozwalają formatować i prezentować dane wyjściowe Nmapa. Jeden z najpopularniejszych, ssh-hostkey.nse, otwiera połączenie z serwerem SSH, by odczytać i wyświetlić klucz publiczny. Definicja reguły wygląda następująco:
postrule = function() return (nmap.registry.sshhostkey ~= nil) end
Reguła skryptów usług, postrule, sprawdza, jakie usługi są uruchomione na hoście docelowym i na jakich portach. Nmap obejmuje ponad piętnaście skryptów do testowania usług HTTP na serwerach. Jeśli na systemie docelowym działa serwer z różnymi portami, skrypt uruchamiany jest kilka razy – po razie na każdy port.
Skrypty hosta, z regułą hostrule, zwykle wykonywane są po uruchomieniu wszystkich pozostałych testów. Na przykład whois identyfikuje właściciela systemu docelowego, a pathmtu sprawdza maksymalny rozmiar pakietów IP akceptowany przez hosta.
Fazy skanowania
Wykonywane przez Nmapa czynności związane ze skanowaniem obejmują kilka faz. Warto je znać, aby wiedzieć, w jakiej kolejności się odbywają i które możemy w razie potrzeby pominąć.
- Faza pierwsza to skanowanie wstępne, uruchamiane tylko wtedy, gdy użyjemy –sC lub opcji –script. To próba użycia skryptów NSE w celu zdobycia dodatkowych informacji o systemie docelowym (Rysunek 1).
- W drugiej fazie Nmap rozwiązuje nazwy hostów systemu docelowego, aby móc dalej pracować z adresami IP.
- W trzeciej – za pomocą różnych technik – sprawdza dostępność hostów. Fazę tę możemy pominąć, używając opcji Pn.
- Czwarta faza – odwrotne rozwiązywanie nazw DNS – ma na celu poznanie nazw hostów. Możemy ją wymusić opcją R lub pominąć za pomocą n.
- Faza piąta to skanowanie portów – Nmap sprawdza wówczas statusy portów do analizy. Możemy ją pominąć poprzez opcję sn.
- Faza szósta, zaawansowane wykrywanie wersji znalezionych otwartych portów, wykonywana jest tylko po użyciu argumentu -sV podczas uruchamiania Nmapa.
- W siódmej fazie, która odbywa się tylko, jeśli użyjemy opcji O, Nmap próbuje zidentyfikować system operacyjny uruchomiony na hostach docelowych.
Proces skanowania może obejmować jeszcze trzy fazy.
W fazie ósmej, aktywowanej przez opcję traceroute, skaner portów określa trasę do hostów.
Skrypty NSE wykorzystywane są w fazie dziewiątej, gdy na podstawie konfiguracji wyjściowej ze skryptu generowane są dane wyjściowe. Nmap formatuje uzyskane informacje i je wyświetla.
W dziesiątej, ostatniej, fazie wykonywane są testy zdefiniowane w skrypcie NSE. Jeśli ich nie ma, faza zostaje pominięta.
Wykrywanie otwartych portów
Co dokładnie możemy zrobić ze skryptami NSE i jak to wygląda w praktyce? Odpowiedź na pierwszą część jest prosta; na drugą – nieco trudniejsza. Skrypty Nmapa mogą posłużyć do zbierania informacji o systemach docelowych, wyszukiwania rozszerzonych i ukrytych danych, przeprowadzania ataków siłowych w celu uzyskania dostępu do systemu i sprawdzania systemów docelowych pod kątem potencjalnych luk.
Aby pisać skrypty NSE, potrzebujemy podstawowej znajomości języka Lua. Dodatkowo Nmap bazuje na API NSE i rozbudowanej bibliotece NSE. Przykładowy prosty skrypt NSE http-vuln-check.nse po wykryciu otwartego portu wyświetla wiadomość Witaj, świecie! (Listing 1). Wiersze zaczynające się od dwóch myślników (–) to komentarze.
-- Header -- -- Rule -- portrule = function(host, port) return port.protocol == "tcp" and port.number == 80 and port.state == "open" end -- Action -- action = function(host, port) return "Witaj, świecie!" end
Listing 1: Witaj, świecie!
Skrypt z Listingu 1 składa się z trzech sekcji. Header zawiera metadane związane z funkcją skryptu, celem, autorem i kategorią. W Rule definiujemy warunki wymagane do uruchomienia skryptu, powinna tu być przynajmniej jedna z reguł (portrule, hostrule, prerule lub postrule); większość skryptów wykorzystuje portrule, która przykładzie wykorzystuje API Nmapa do sprawdzenia portu TCP 80. Sekcja Action określa logikę skryptu, bardzo prostą w przykładzie: skrypt, znalazłszy, otwarty port TCP 80, wyświetla komunikat Witaj, świecie!.
Aby przetestować skrypt na serwerze lokalnym, uruchamiamy polecenie:
# nmap --script /ścieżka/http-vuln-check host_docelowy -p 22,80,443
Dane wyjściowe powinny wyglądać podobnie jak na Listingu 2.
Starting Nmap 6.47 (http://nmap.org) at 2015-03-12:00:00 CET Nmap scan report for host_docelowy (192.168.1.100) Host is up (0.023s latency). rDNS record for 192.168.1.100: localhost PORT STAN USŁUGA 22/tcp filtered ssh 80/tcp open http |_http-vuln-check: Witaj, świecie! 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds
Listing 2: Przykładowe dane wyjściowe
Jeśli użyjemy Zenmapa – graficznego interfejsu użytkownika Nmapa (patrz: akapit „Narzędzia Kali Linuksa”) – wyniki skanowania będą w zakładce Nmap Output (Rysunek 2). Uruchomiwszy Nmapa w wierszu poleceń, zobaczymy typowe dane wyjściowe konsoli.
Narzędzia Kali Linuksa
Nmap cieszy się doskonałą reputacją jako skaner portów, ale to nie jedyne narzędzie potrzebne do kompleksowej analizy krytycznych komponentów sieciowych. Znając znaczenie przeprowadzania różnych testów bezpieczeństwa, powinniśmy się zastanowić nad najlepszym do tego środowiskiem. Oparta na Debianie dystrybucja Kali Linux (dołączona do bieżącego wydania „Linux Magazine” w wersji 2016.1), zawierająca Nmapa, i interfejs GUI Nmapa, Zenmap – to idealny wybór.
Jeśli chcemy używać Nmapa z własnymi skryptami, Kali Linux ułatwi nam to z kilku powodów. Po pierwsze, instalacja Nmapa na Kali Linuksie jest od razu gotowa do użytku. Po drugie, Zenmap to wysokiej klasy interfejs GUI do zarządzania Nmapem i uruchamiania skryptów NSE. Dzięki GUI uruchamianie Nmapa jest naprawdę proste. Możemy łatwo zdefiniować system docelowy, który chcemy przeskanować, i rodzaje skanowania – od pingowania po kompleksową analizę portów.
Do używania Zenmapa nie potrzeba doświadczenia. Program wyświetla polecenie Nmapa, uruchamiane na systemie docelowym, i rodzaje skanowania wraz z opcjami. Interfejs GUI zawiera też wizualizację struktury sieci. W zależności od wariantu skanowania widok komputera dostarcza szczegółowe informacje techniczne na temat analizowanego systemu (Rysunek 3).
Najważniejszym elementem NSE są biblioteki, dające się łatwo zintegrować ze skryptem. Jedna z najczęściej używanych, shortport.http, pozwala wykonywać funkcje portrule. Zmodyfikowana konfiguracja skryptu znajduje się na Listingu 3.
-- Header -- local shortport = require "shortport" -- Rule -- portrule = shortport.http -- Action -- action = function(host, port) return "Witaj, świecie!" end
Listing 3: Zmodyfikowana konfiguracja skryptu
Bezpośrednie porównanie konfiguracji skryptów pokazuje, że kod NSE pozwala znacząco uprościć biblioteka shortport.http, która sprawdza wszystkie typowe porty HTTP (80, 443, 631, 7080, 8080, 8088, 5800, 3872, 8180, 8000) i usługi (http, https, ipp, http-proxy itp.), dając nam dużo więcej informacji o hoście docelowym.
Ostatnie szlify
Głównym zadaniem wielu skryptów jest sprawdzanie informacji o usługach i lukach systemu docelowego. Do tego musimy nieco rozszerzyć skrypt podstawowy. Aby zweryfikować, czy aplikacja webowa zawiera luki, możemy spróbować pobrać stronę internetową i zobaczyć odpowiedź serwera (Listing 4).
-- Header -- local shortport = require "shortport" local http = require "http" -- Rule -- portrule = shortport.http -- Action -- action = function(host, port) local uri = "/index.html" local response = http.get(host, port, uri) return response.status end
Listing 4: Sprawdzanie luk
Poprzedni przykład bazuje na bibliotece http. Skrypt możemy jeszcze ulepszyć – na przykład, aby dane wyjściowe generował tylko, gdy zwracany jest kod HTTP 200.
Kolejny krok to identyfikacja konkretnych luk, dużo łatwiejsza, niż się wydaje – w większości przypadków wystarczy zidentyfikować wersję usługi. W przykładzie możemy wykorzystać bibliotekę string i zmodyfikować nagłówek skryptu:
local string = require "string"
Aby skryptu mogły używać osoby trzecie, modyfikujemy nieco nagłówek. Może zawierać różne informacje szczegółowe. Za pomocą @ możemy zawrzeć w nagłówku szczegóły dotyczące użycia (@usage) i danych wyjściowych (@output). Przykład prostego nagłówka znajduje się na Listingu 5.
-- Header -- description = [[ Przykład, jak tworzyć własne skrypty Nmapa]] --- -- @usage -- nmap --script http-vuln-check host_docelowy -- @output -- PORT STAN USŁUGA -- 80/tcp open http -- |_http-vuln-check: Podatny author = "holger reibold" license = "jak nmap" categories = {"default", "safe"} local shortport = require "shortport"
Listing 5: Przykład nagłówka
To zaledwie część możliwości, jakie oferuje NSE. Aby poznać kolejne, najlepiej przestudiować bibliotekę NSE, gdzie znajdziemy dużo informacji dotyczących analizowania innych usług niż HTTP. Nmap ma do zaoferowania znacznie więcej – na przykład równoległe skanowanie wielu hostów.
Podsumowanie
Nmap to wiodący skaner portów, dobrze wyposażony pod kątem analizowania typowych komponentów sieciowych w standardowej konfiguracji. W połączeniu z NSE i obszernymi bibliotekami daje się łatwo dostosować do różnych zadań, dzięki czemu wciąż pozostaje niedościgniony.
— Holger Reibold