Die Nmap Skripting Engine

Gescannt

Der Security-Scanner Nmap besitzt eine eingebaute Skripting-Engine, die auf der Programmiersprache Lua basiert. Mit der Kenntnis der nötigen Konzepte und Grundlagen lassen sich die mitgelieferten Skripte verwenden oder gar eigene dafür schreiben.
Mit E-Mail-Diensten muss sich jeder Administrator früher oder später einmal beschäftigen. Das zur CeBIT erscheinende ADMIN 02/2012 gibt dazu Praxis-Tipps und ... (mehr)

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:

  • Verarbeitungsphasen: Wie dieser Artikel später noch genauer erklärt, durchläuft Nmap beim Scannen einige Phasen. NSE kennt diese Phasen und erlaubt Programmierern, sich in die gewünschte Verarbeitungsstufe einzuklinken.
  • Portable Skripte: Die NSE-Skriptsprache ist auf allen Plattformen die gleiche, während etwa ein Bash-Skript normalerweise nur auf Linux funktioniert, aber nicht ohne Weiteres unter Windows.
  • Community-Support: Skripte, die für die NSE geschrieben sind, lassen sich innerhalb der Nmap-Community leicht austauschen.

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-Skripte

Nmap durchläuft beim Scannen fünf Phasen ( Abbildung 1 ). NSE-Skripte werden üblicherweise anhand dieser Phasen kategorisiert:

Abbildung 1: NSE teilt den Scan-Prozess in fünf Phasen auf.
  • Pre-Rules-Skripte werden ausgeführt, bevor Nmap überhaupt mit dem Scan begonnen hat. Pre-Rules-Skripte können sich um die Vorbereitung kümmern, zum Beispiel Tabellen anlegen, Umgebungsvariablen auslesen oder eine Liste von Hosts erzeugen, um die sich Nmap kümmern soll. Das dafür verwendete Kürzel lautet »prerules« .
  • Host-Skripte werden für jeden einzelnen Host ausgeführt, wenn dessen Scan abgeschlossen ist. Ein solches Skript könnte etwa nach dem Scannen eines Subnetzes die MAC-Adresse jedes Geräts auslesen. Sie werden nur für existierende Hosts ausgeführt und firmieren unter dem Kürzel »hostrules« .
  • Service-Skripte führt NSE nach den Host-Skripte und nur für existierende Dienste aus. Nmap bringt schon viele Service-Skripte mit, die in der Community beliebt sind. Der Ausdruck »portrules« identifiziert sie.
  • Post-Rules-Skripte schließlich führt NSE nach allen anderen Phasen aus. Typischerweise werden die »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:

  • Die Auth-Kategorie enthält mehr als 30 Skripte, die Authentifizierungs-Protokolle testen. Die meisten von ihnen führen in Brute-Force-Tests Einbruchsversuche durch, deshalb sollte man sie nur in Umgebungen einsetzen, in denen dies auch erlaubt ist.
  • Die Broadcast-Kategorie ist mit sechs Skripten relativ klein. Mit Broadcast- und Multicast-Methoden versuchen sie, im Netzwerk Informationen aufzuspüren, etwa Dropbox-Clients zu identifieren oder versteckte Services zu finden.
  • In der sogenannten Default-Kategorie finden sich mehr als 50 Skripte. Das Nmap-Team zieht sechs Kriterien heran, um ein Skript in die Default-Kategorie zu stecken: Geschwindigkeit, Nutzen, Ausführlichkeit, Verlässlichkeit, Intrusiveness und Privacy.
  • Die Discovery-Kategorie beherbergt diejenigen Skripte, die Netzwerk- und Betriebssysteminformationen dazu heranziehen, die Netzwerktopologie zu finden. Mehr als 70 solcher Skripte bringt Nmap schon mit.
  • In der DoS-Kategorie sind Skripte eingeordnet, die einen Dienst lahmlegen können, also sogenannte Denial-of-Service-Angriffe durchführen. Es gibt derzeit nur zwei solche Skripte.
  • Exploit-Skripte, von denen es derzeit nur eines gibt, versuchen sich mittels eines bekannten Exploits Zugriff zu einem System zu verschaffen.
  • Die External-Kategorie enthält Skripte, die mit anderen Hosts kommunizieren, etwa um mit einem Datenbank-Server die gesammelten Daten zu speichern.
  • Fuzzer-Skripte werden beispielsweise dazu verwendet, neue Sicherheitslücken zu finden. Dazu schicken sie meist zufällig erzeugte Daten an einen Dienst.
  • Intrusive-Skripte verbrauchen entweder eine Menge Bandbreite oder legen einen Dienst komplett lahm, wenn man sie anwendet.
  • Malware-Skripte dienen dazu, Schadsoftware zu finden, die auf dem gescannten Host installiert ist.
  • In der Safe-Kategorie finden sich Skripte, die das Netzwerk nicht übermäßig belasten und auch ansonsten keinen Schaden anrichten.
  • Version-Skripte können die Versionsstände der installierten Serverdienste identifizieren.
  • Die Vuln-Skripte schließlich finden zwar Sicherheitslücken eines Rechners, nutzen sie aber nicht aus.

Nächste Phase

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

 

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023