Der Network Mapper, besser bekannt unter seinem Kürzel Nmap [1], ist einer der beliebtesten Security-Scanner für Linux und andere Plattformen. System-Administratoren und Security-Spezialisten setzen Nmap dafür ein, offene Ports von Servern zu scannen oder im Netz laufende Geräte zu finden. Für diese Zwecke erweist sich Nmap als praktisch, aber es kann auch bei der Fehlersuche im Netz helfen. Es lässt sich beispielsweise damit feststellen, ob ein Host läuft und selbst die Version eines Dienstes überprüfen. Mittels Fingerprinting kann Nmap sogar Protokolle und Programme identifizieren, die auf einem Rechner laufen.
Weil Nmap für die Kommandozeile gedacht ist, lässt es sich sehr gut in ShellSkripten oder zusammen mit Skript-Tools wie Perl, Sed oder Awk verwenden. Darüber hinaus besitzt Nmap aber auch eine eingebaute Möglichkeit für Skripte: Die Nmap Skripting Engine (NSE) bietet gegenüber der Verarbeitung mit der Shell einige Vorteile:
Die Nmap-Skriptsprache basiert auf Lua, einer "leistungsfähigen, schnellen und leichtgewichtigen" Programmiersprache, wie deren Homepage [2] feststellt. Sie wird aufgrund dieser Features oft in Computerspielen als Skriptsprache eingesetzt, etwa bei World of Warcraft [3] oder auch im Fotoverarbeitungsprogramm Lightroom der Firma Adobe. Eine große Zahl von NSE-Skripten ist online unter [4] verfügbar. Einige von ihnen werden auch bereits mit Nmap ausgeliefert. Wenn man im entsprechenden Installationsverzeichnis nachsieht, findet man die schon installierten NSE-Skripte (Listing 1). Der Nmap Reference Guide gibt eine Übersicht über die mit Nmap ausgelieferten kleinen Programme [5].
Listing 1
Lokal installierte NSE-Skripte
Nmap durchläuft beim Scannen fünf Phasen (Abbildung 1). NSE-Skripte werden üblicherweise anhand dieser Phasen kategorisiert:
prerules
«
.hostrules
«
.portrules
«
identifiziert sie.postrules
«
-Skripte zum Aufräumen, für Reports und Ähnliches verwendet.NSE-Skripte selbst sind in vier Abschnitte gegliedert: Description, Categories, Phase und Action. Der Description-Abschnitt gibt eine kurze Beschreibung dessen, was die Aufgabe des NSE-Skriptes ist. Der Text folgt, in doppelte eckige Klammern eingeschlossen, hinter einem Gleichheitszeichen:
Description = [[ Beispiel für NSE-Skripting ]]
Der Categories-Abschnitt legt die Kategorie eines Skriptes fest. Existierende Kategorien listet der Kasten "Kategorisch" auf. Ein Skript mit einer Kategorie zu verbinden, erlaubt es, das Skript im Rahmen eines Kategorien-Scans auszuführen. Ein Skript kann auch zu mehreren Kategorien gehören. Das Format sieht so aus:
categories = {"default", "safe"}
Das damit eingeteilte Skript wird immer dann ausgeführt, wenn der Administrator die Default- oder Safe-Kategorie auswählt.
Kategorisch
Die Nmap-Community klassifiziert ihre Skripte in Kategorien. Wer ein bestimmtes Skript sucht oder sein eigenes Skript in die passende Kategorie einordnen möchte, sollte die dahinter stehende Methode verstehen:
Im Phase-Abschnitt steht der Code für die jeweilige Verarbeitungsphase, wie bereits erklärt: »hostrule
«
, »portrule
«
, »postrule
«
oder »prerule
«
. Hinter der Zuweisung folgt die Definition einer Lua-Funktion, die mit dem Schlüsselwort »function
«
eingeleitet wird. Die Funktionen für »hostrule
«
und »portrule
«
verlangen noch weitere Parameter, die Skripting Engine beim Aufruf übergibt. Der Phase-Abschnitt endet mit der Lua-Anweisung »end
«
.
Listing 2 zeigt den »portrule
«
-Code des Skriptes »html-title.nse
«
. Die übergebenen Parameter sind hier der Host und der Port des Dienstes. Die Portrule in Listing 2 legt die beiden Variablen »svc.std
«
and »svc.ssl
«
als assoziative Arrrays an und prüft zuerst, ob das verwendete Protokoll auch TCP ist (Zeile 4). Falls nicht, gibt es »false
«
zurück. Analog dazu überprüft es, ob die Ports für HTTP und HTTPS geöffnet sind. Für den Fall, dass der Host HTTPS anbietet, aber Nmap keinen SSL-Support besitzt, gibt es Skript ebenfalls »false
«
zurück.
Listing 2
Portrule
Der Action-Abschnitt enthält die eigentliche Skript-Logik, die abläuft, wenn der Phase-Abschnitt abgearbeitet ist. Hier hat man Zugriff auf Standard-Syntax und -Funktionen von Lua. Die spezifischen Nmap-Bibliotheken, die auch zur Verfügung stehen, ersparen es, Netzwerkfunktionen wie die Verbindung zu einem bestimmten Port und so weiter von Hand zu programmieren. Der Code in Listing 3, der aus dem Nmap-Skript »ftp-anon.nse
«
stammt, zeigt wie leicht man eine Socket-Verbindung aufbauen, darüber Daten verschicken und den Status-Code abfragen kann.
Listing 3
Sockets