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

Tworzymy własne skrypty NSE dla Nmapa

28 lipca 2017, 09:33 | Narzędzia, Teksty | 0 komentarzy
Materiał pochodzi z Linux Magazine 3 2016 (145).

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.

Rysunek 1: Nmap uruchamiany z włączonym silnikiem NSE.

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.

Rysunek 2: Jeśli nie chcemy używać wiersza poleceń, możemy uruchomić własne skrypty przy użyciu Zenmapa.

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).

Rysunek 3: Zenmap w działaniu. Dzięki interfejsowi GUI zarządzanie skanerem i ocena wyników są znacznie łatwiejsze.

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

Wydanie Linux Magazine jest na Allegro w wersji drukowanej (z dystrybucją Kali Linux na DVD) i elektronicznej.

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



Komentarze

Odpowiedz