Nmap – Portscanner, Hacking-Tool, Alleskönner [Teil III]

Im dritten und letzten Teil unserer Nmap-Reihe betrachten wir neben einigen Tuning-Parametern auch die Möglichkeiten von Nmap, Firewalls und IDS/IPS auszutricksen bzw. zu umgehen. Weiterhin lernen Sie die Grundlagen der Nmap Scripting Engine (NSE) kennen, die aus Nmap einen Alleskönner macht, da nahezu beliebige Funktionen integriert werden können. Den Abschluss bildet ein Blick auf Zenmap, das graphische Frontend von Nmap, mit dem Scans übersichtlicher organisiert und verwaltet werden können.
Timing und Performance
Im Rahmen der verschiedenen Features von Nmap sind wir in Teil 2 auch schon auf Tuning-Möglichkeiten eingegangen. An dieser Stelle lernen Sie einige weitere, wichtige Stellschrauben kennen, mit denen Sie Ihren Nmap-Scan weiter optimieren können und damit die Dauer für einen umfangreichen Scan reduzieren können. Die meisten der nachfolgend vorgestellten Optionen wirken sich in erster Linie bei umfangreichen Scans größerer IP-Adressbereiche aus.
Timeout-Werte steuern
Versendet Nmap ein Paket, so dauert es eine gewisse Zeit (die Round Trip Time, kurz: RTT), bis die Antwort kommt – oder auch nicht. In letzterem Fall muss Nmap entscheiden, wie lange es auf die Antwort warten soll. Dies ist der Timeout-Wert. Er wird anhand der bisherigen Antwortzeiten dynamisch angepasst und kann – bei entsprechenden Latenzen im Netzwerk – durchaus auf einige Sekunden anwachsen.
Nmap beginnt mit einem sehr hohen Timeout-Wert und tastet sich teilweise nur langsam an das Optimum heran. Daher kann es zur Performance- und Geschwindigkeitssteigerung durchaus sinnvoll sein, den Wert --initial-rtt-timeout festzulegen, um den Startwert herabzusetzen. Diesen ergänzen wir häufig durch den Wert --max-rtt-timeout. Mit diesen beiden Werten können Sie dafür sorgen, dass die Timeout-Werte den Scan nicht unnötig ausbremsen.
Während Sie im LAN in der Regel mit Werten von 100 ms als maximalem RTT-Timeout-Wert auf der sicheren Seite sind (normale Antwortzeiten liegen bei 1-30 ms), so können Sie bei Internet-Scans einen Ping oder ein anderes Antwortpaket (z. B. mit hping3) provozieren, um beispielsweise aus zehn Antworten die Durchschnitts-RTT zu ermitteln. Für --initial-rtt-timeout verdoppeln wir die Werte, für --max-rtt-timeout verdreifachen wir den Wert. Hier ein paar Beispiele:
Tabelle 1: Best Practice-Timeoutwerte zur Performance-Optimierung
RTT | --initial-rtt-timeout | --max-rtt-timeout |
---|---|---|
1-30 ms (LAN) | 50 ms | 100ms |
100 ms | 200 ms | 300 ms |
250 ms | 500 ms | 750-900 ms |
Wie in der letzten Zeile zu sehen ist, müssen wir bei größeren RTT-Werten etwas mehr Raum geben, da die Schwankungen auch größer ausfallen können. Für einen Scan im LAN könnte der Einsatz dieser Parameter also z. B. folgendermaßen aussehen:
nmap –F --initial-rtt-timeout 50ms --max-rtt-timeout 100ms 192.168.8.0/24
Sie können die Angaben in Millisekunden (ms, Default), Sekunden (s) oder Minuten (m) machen. Auf mehr als 1000ms sollten Sie aber in halbwegs stabilen Netzwerken nicht gehen, da der Scan ansonsten übermäßig in die Länge gezogen werden kann. Im Übrigen gibt es natürlich auch eine Option --min-rtt-timeout, die jedoch in normalen Umgebungen nicht genutzt wird. Sie ist nur dann relevant, wenn ein Netzwerk sehr unsicher und instabil ist, um sicherzustellen, dass Nmap nicht zu früh aufgibt.
Ein verwandter Wert ist --host-timeout. Er bezieht sich auf einzelne zu scannende Hosts und legt eine Maximalzeit fest, innerhalb derer der Scanprozess eines einzelnen Hosts abgeschlossen sein muss. Mit --host-timeout 30m setzen Sie diesen Zeitrahmen z. B. auf 30 Minuten. Für Hosts, die bis zu diesem Zeitpunkt nicht abschließend gescannt werden konnten, erzeugt Nmap keine Ausgabe. In diesem Zusammenhang können wir den Wert --max-retries <Anzahl> setzen, um die maximale Anzahl an erneuten Sendeversuchen für Portscans festzulegen. Je nach der Reaktion der gescannten Systeme setzt Nmap diesen Wert auf bis zu zehn Wiederholungen. Meistens jedoch, bei performanten Netzwerken ohne grundsätzliche Probleme, führt Nmap nur eine Wiederholung durch, so dass dieser Wert in vielen Szenarien gar keine Bedeutung hat. Falls Sie sicherstellen wollen, dass Sie nicht zu viel Zeit verlieren, können Sie den Scanvorgang z. B. mit --max-retries 3 auf drei Wiederholungen beschränken.
Weitere Perfomance-Werte
Die Nmap-Tuning-Optionen sind zahlreich. In diesem Abschnitt schauen wir uns noch ein paar wichtige an.
Scan-Delay
Normalerweise sind Sie natürlich daran interessiert, dass ein Scan schnellstmöglich beendet wird – dazu dienen die weiter oben vorgestellten Optionen und Parameter, bei denen wir möglichst viele Pakete in kurzer Zeit versendet haben. Allerdings gilt in einigen Szenarien der alte Spruch: "Weniger ist mehr!" Dies gilt insbesondere in zwei Fällen:
- Ein UDP-Scan ist auf ICMP-Typ-3-Rückmeldungen angewiesen und der Zielhost limitiert die Antworten auf z. B. eine pro Sekunde (viele unix-artige Plattformen reagieren so).
- Sie möchten einen Schwellenwert eines IDS/IPS unterschreiten, um einer Entdeckung zu entgehen.
Um die Paketrate anzupassen, können Sie die Option --scan-delay nutzen. Bei einem UDP-Scan versucht Nmap die Paketrate selbständig anzupassen. Dies kann zu deutlichen Verzögerungen und sehr langsamen Scans führen. Falls Sie hier einen Höchstwert für die maximale Zeit zwischen zwei Testpaketen festlegen wollen, können Sie die Option --max-scan-delay nutzen. Seien Sie jedoch vorsichtig beim Experimentieren, da dies zu verzerrten Ergebnissen führen kann, falls das Ziel eine Ratenbeschränkung auf einen Wert oberhalb Ihres festgelegten Maximalwertes hat. Nachfolgend ein Beispiel für die Verwendung der oben genannten Optionen:
root@kali:~# nmap -sU --scan-delay 1s --max-scan-delay 3s scanme.nmap.org
Dies verzögert die Zeit zwischen zwei Paketen dieses UDP-Scans auf mindestens eine Sekunde, während die Maximalverzögerung bei drei Sekunden liegt. Auf die Problematik der Umgehung von IDS/IPS und anderen Monitoring-Systemen kommen wir etwas später in diesem Artikel noch zurück.
RST-Ratelimit
Tatsächlich ist nicht nur der UDP-Scan von möglichen Ratenbeschränkungen der Rückmeldungen betroffen, sondern auch die TCP-Scans. Mittlerweile gibt es Hosts, die die Rate an RST-Paketen pro Sekunde limitieren. Da Nmap auf derartige Beschränkungen mit einer – teils deutlichen – Reduzierung der eigenen Paketrate reagiert, können Scans in einem solchen Szenario mitunter sehr lang dauern. Führen Sie aber beispielsweise einen TCP-SYN-Scan durch und interessieren sich nur für die offenen Ports, so kann der Scan unter Umständen deutlich beschleunigt werden, wenn Sie die Option --defeat-rst-ratelimit nutzen. Damit ignoriert Nmap die Ratenbeschränkung und passt die Paketrate nicht an.
Der Nachteil ist, dass Ports, die nicht rechtzeitig mit einem RST-Paket reagieren, gegebenenfalls als filtered und nicht als closed angezeigt werden. Geht es Ihnen allerdings – wie meistens üblich – nur um die offenen Ports, dann kann diese Option den Scan, je nach Szenario, deutlich beschleunigen.
Scan-Templates nutzen
Ist Ihnen die Fummelei zur Optimierung eines Scans vielleicht verwirrend und zu unübersichtlich? Dies ist durchaus nachvollziehbar, da dutzende Stellschrauben existieren und alle manuell einzustellen sehr viel Geduld und Zeit zum Austesten verlangt. Im Zweifelsfall benötigt die Zeit zum Optimieren des Scans länger als der (unoptimierte) Scan selbst.
Falls Sie sich das Leben leichter machen wollen, können Sie mit Nmap-Templates arbeiten. Dazu stellt Nmap mit der Option –T<Template> sechs Templates zur Verfügung, die Sie entweder über die Bezeichnung oder über die Nummer angeben können:
- paranoid (0): Dies setzt eine komplette Serialisierung des Scans um. Es wird immer nur ein Port gescannt, und die Zeit zwischen zwei Testpaketen beträgt 5 Minuten. Dies dient in erster Linie zur Umgehung eines IDS/IPS. Die Scanzeit ist entsprechend sehr lang.
- sneaky (1): Dient auch primär der Vermeidung einer Entdeckung durch ein IDS/IPS. Die Zeit zwischen zwei Testpaketen beträgt hier allerdings "nur" 15 Sekunden. Dies scheint ein vernünftiger Ansatz für einen Stealth-Scan, auch wenn IDS/IPS hier natürlich auch die Regeln von Nmap kennen.
- polite (2): Ein Scan der Stufe 2 sendet nur alle 0,4 Sekunden ein Testpaket. Dies bremst den Scan deutlich aus und dürfte für die meisten IDS/IPS leicht zu erkennen sein. Andererseits argumentieren Befürworter von Stufe 2-Scans, dass damit Ziel-Systeme seltener abstürzen, was wohl in der Praxis auch bei aggressiven Portscans kaum der Fall sein dürfte. Da könnten eher andere, tiefere Tests (Versionserkennung & Co.) für eine Gefahr der Systemstabilität sorgen.
- normal (3): Dies entspricht dem normalen Verhalten von Nmap. Mit dieser Option bewirken Sie also – nichts. Sie wurde vermutlich nur als Einordnung der anderen Scans eingeführt.
- aggressive (4): Mit dem aggressiven Scan werden einige der oben vorgestellten Optionen auf moderat kürzere Werte gesetzt, um den Scan zu optimieren. Dieser Modus ist für normale, stabile und zuverlässige Verbindungen oftmals empfehlenswert. Über die manuell einstellbaren Werte hinaus optimiert dieser Modus weitere, interne Parameter
- insane (5): Dieser Modus perfektioniert die Geschwindigkeitsoptimierung und sollte vermutlich nur in schnellen, stabilen LAN-Umgebungen eingesetzt werden. Ansonsten könnten die sehr aggressiv gesetzten Timeout- und Retry-Werte zu unnötigen Fehlern führen.
In der Regel nutzen Sie die Nummer des Templates. Damit könnte die Verwendung dieser Option z. B. folgendermaßen aussehen:
nmap -T4 scanme.nmap.org
Tatsächlich beschleunigt dies den Scan des Testsystems in unserer Umgebung von ca. 35 Sekunden ohne –T4 auf ca. 25 Sekunden mit –T4. Die Angaben können, je nach Ausgangssituation, stark schwanken. Möchten Sie einen umfangreichen Test durchführen, so ergänzen Sie –A, so dass der Scan folgendermaßen gestartet wird:
nmap –A -T4 scanme.nmap.org
Wie wir gelernt haben, involviert dies unter anderem die Versions- und Betriebssystem-Erkennung und die Nmap Scripting Engine und entspricht durchaus schon Best Practice. Doch es gibt noch mehr zu bedenken. Dies betrachten wir im nächsten Abschnitt.
Firewalls und IDS/IPS umgehen
Tatsche ist, dass Nmap eine Reihe von Funktionen mitbringt, die es ermöglichen, Firewalls sowie Intrusion-Detection-Systeme (IDS) bzw. Intrusion-Prevention-Systeme (IPS) zu umgehen und auszutricksen. Aber: Ist es sinnvoll, in einem Sicherheitstool wie Nmap Funktionen einzubauen, die das Umgehen von Sicherheitsmechanismen ermöglichen? Bedeutet das nicht, dass Black-Hat-Hacker einfacher in fremde Netzwerke einbrechen können? Welchen Vorteil hat es, offiziell und in bester Absicht Tools bereitzustellen, die Black-Hat-Techniken implementieren?
Die Antwort ist eine Frage der Philosophie: Die Frage muss doch lauten: Ist es sicherer, derartige Technologien nicht in Nmap einzubauen? Und die wahrscheinliche Antwort ist: Nein! Einfach vor dem Hintergrund, dass Angreifer diese Techniken ohnehin anwenden würden – mit oder ohne Nmap. Wenn aber das Sicherheitstool des Administrators bzw. White-Hat-Hackers oder Pentesters ebendiese Technologien zur Verfügung stellt, ist es einfacher möglich, Schwachstellen in der eigenen Verteidigung ausfindig zu machen und zu beseitigen. Hier greift wieder die alte Weisheit: "Security through obscurity funktioniert nicht!" Das Verstecken von effektiven Techniken für den Einbruch vor den "Guten Jungs" hilft nicht viel – auch auf die Gefahr hin, dass Wissen missbraucht werden könnte, sollten die Verteidiger mit denselben Mitteln ausgestattet werden, wie die Angreifer. Ein wenig nach dem Motto: "Angriff ist die beste Verteidigung!"
Und vor diesem Hintergrund enthält auch Nmap einige Funktionen, die dem Angreifer helfen, die gewünschten Informationen trotz entsprechender Schutzmechanismen zu erhalten. In diesem Abschnitt schauen wir uns einige wichtige an.
Pakete fragmentieren
Intrusion-Detection-Systeme (IDS) beobachten den Netzwerk-Verkehr und versuchen, Eindringungsversuche zu entdecken und zu melden. Deren Weiterentwicklung sind die Intrusion-Prevention-Systeme (IPS), die vermeintlich schädliche Kommunikationsversuche selbständig blockieren. Beide Systeme arbeiten nach demselben Prinzip und untersuchen das Netzwerk auf verdächtige Aktivitäten. Ein Portscan ist eine solche Aktivität und wird ggf. von einem IDS gemeldet oder von einem IPS blockiert. Um den Portscan zu verstecken, können Sie die Testpakete mit der Option –f fragmentieren. Dabei wird die Nutzlast des IP-Pakets in 8 Bytes große Stücke zerlegt. Das bedeutet, dass ein TCP-Header – bestehend aus 20 Bytes – in drei Teile aufgeteilt wird (s. Abb .1).
Diese einzelnen, fragmentierten IP-Pakete sind sehr viel schwieriger zu prüfen und zu erkennen, als ein vollständiges Paket. Zwar werden gute Firewalls und IDS/IPS die Pakete zusammensetzen und erkennen können, aber da dieser Vorgang viele Ressourcen verbraucht, wird häufig auf eine Reassemblierung der Fragmente verzichtet. Die Chancen sind also gar nicht mal so schlecht, damit ein IDS/IPS auszutricksen. Nutzen Sie die Option –f erneut im selben Nmap-Kommando, so werden Fragmente mit 16 Bytes Größe erstellt und versendet. Hier ein Beispiel, wie Sie mit 16 Bytes Größe arbeiten können:
Listing 1: Ein Stealth-Scan mit 16 Bytes Payload-Größe
root@kali:~# nmap -f -f 192.168.8.1 Starting Nmap 7.40 ( nmap.org ) at 2017-05-25 19:04 CEST Nmap scan report for router.movistar (192.168.8.1) Host is up (0.00066s latency). Not shown: 997 closed ports PORT STATE SERVICE 53/tcp open domain 80/tcp open http 443/tcp open https MAC Address: F4:CB:52:8C:87:38 (Huawei Technologies) Nmap done: 1 IP address (1 host up) scanned in 15.81 seconds
Die Pakete werden fragmentiert und dann ganz normal versendet. Ansonsten funktioniert der Scan wie gewohnt.
Dies können Sie auch sehr schön in Wireshark verfolgen, wobei Wireshark immer ein echtes, fragmentiertes Paket anzeigt und anschließend das reassemblierte, vollständige TCP-Paket, das aus einem 16-Byte- und einem 4-Byte-Fragment besteht (s. Abb. 2).
Beachten Sie, dass die Fragmentierung nur für Ping-Scans und Port-Scans durchgeführt werden kann. Versionserkennung und Betriebssystem-Erkennung ist hiervon ausgenommen. Außerdem sind derartige Manipulationen nur mit rohen IP-Paketen möglich, also nur dann, wenn Nmap selbst die Pakete zusammensetzt (dazu müssen Sie Nmap als Administrator bzw. root ausgeführt haben!) und nicht auf den TCP/IP-Stack des Betriebssystems zurückgreifen muss.
Die Fragmentierung sorgt dafür, dass das Zielsystem die Pakete zunächst wieder zusammensetzen muss, bevor der Inhalt interpretiert werden kann. Dies kann vereinzelt zu Problemen führen, da einige Plattformen nicht gut mit fragmentierten Paketen umgehen können. Ein Scan mit fragmentierten Paketen sollte also nur dann durchgeführt werden, wenn die Umgehung der Sicherheitsinfrastruktur ernsthaft geprüft werden soll.
Die Herkunft verschleiern
Kennen Sie den Film Top Gun? Dort geht es um die Jagdfliegerausbildung. Wird ein Flugzeug von einem anderen angegriffen und läuft Gefahr, abgeschossen zu werden, so verschießt es so genannte Täuschkörper, im Englischen decoy flare genannt. Durch rasche Manöver ist es dann häufig möglich, anfliegenden Raketen auszuweichen, da diese sich auf die Täuschkörper konzentrieren.
Decoy-Adressen festlegen
Ganz ähnlich können Sie vorgehen, um ein IDS/IPS zu täuschen und unentdeckt zu bleiben. Dazu täuschen Sie mehrere Scans von unterschiedlichen (natürlich falschen) IP-Adressen an und verstecken sich zwischen diesen. Mit –D können Sie mehrere Adressen angeben, wobei Sie Ihre eigene IP mit ME optional in der Reihenfolge platzieren können. Falls Sie dies nicht tun, wird Nmap Ihre Adresse zufällig in dieser Liste einordnen. In der Reihenfolge dieser Liste werden dann Testpakete mit den genannten Decoy-Absenderadressen gesendet. Nachfolgend ein Beispiel:
nmap -D 10.2.15.1,192.168.22.17,10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.4,ME,10.125.12.245 192.168.8.1
Es hat sich als nützlich erwiesen, seine eigene Adresse (ME) an die sechste Stelle oder später zu stellen, da so einige Scan-Detektoren die eigene Adresse gar nicht mehr anzeigen. Falls Sie unkreativ sind bzw. keine Lust haben, sich Decoy-Adressen auszudenken, können Sie über RND:<Anzahl> zufällige, nicht reservierte Adressen von Nmap generieren lassen, wie das folgende Beispiel verdeutlicht:
nmap -D RND:5 192.168.8.1
Dies erstellt fünf Decoy-Adressen. Die eigene Adresse wird dabei zufällig in die Liste einsortiert.
Vorsicht: Verraten Sie sich nicht!
Bei der Zufallsfunktion ist Vorsicht geboten: Die IP-Adressen sind tatsächlich völlig zufällig und stammen daher in der Regel aus dem Kreis öffentlicher Adressbereiche. Falls aus dem Internet regulär überhaupt kein Zugriff auf ein Zielsystem möglich ist (z. B. weil die Kommunikation interner Systeme mit dem Internet grundsätzlich über Proxies läuft), würde dies auffallen, wenn Ihre eigene Adresse eine private IP-Adresse ist – vielleicht nicht dem Scan-Detektor, aber definitiv dem wachsamen Admin, der die Logdaten auswertet.
Denken Sie bitte auch an Folgendes: Wenn Sie einen großen Adressraum scannen und Decoy-Adressen angeben, die tatsächlich live und erreichbar sind, dann werden diese mit diversen Antwortpaketen bombardiert. Besser ist es also, darauf zu achten, dass die Decoy-Adressen noch nicht belegt sind.
Source-IP festlegen
Für den Fall, dass Sie aus bestimmten Gründen einige manuelle Scans durchführen wollen und die Spur auf eine andere IP-Adresse legen wollen, können Sie die Absenderadresse auch direkt "spoofen", also fälschen. Dazu nutzen Sie die Option –S <Spoof-Adresse>. Dies wird in der Regel mit der Option –e <ausgehendes Interface> und mit –PN kombiniert, da wir den Ping-Scan in diesem Fall auslassen müssen – schließlich erhalten wir keine Antwort vom Zielsystem, da die Absenderadresse nicht zu uns führt. Eine mögliche Anwendung dieser Option sieht folgendermaßen aus:
nmap -PN -e eth0 -S 192.168.8.111 192.168.8.1
Dabei tun wir so, als ob der Scan von der gespooften Adresse 192.168.8.111 stammt. Das ausgehende Interface ist eth0.
Source-Port festlegen
Es gibt nicht wenige schwache Firewall-Konfigurationen, bei denen bestimmte Ports für die Kommunikation von außen generell freigeschaltet werden. Hierzu zählt z. B. der Port 53/udp (DNS) und der Port 20/tcp (TCP-Data für aktive FTP-Verbindungen). Sei es, weil der Admin es nicht besser weiß, oder weil er eine provisorische Lösung implementieren möchte, bis er (später) eine bessere Lösung konfiguriert und es dann schlicht vergisst.
Paketfilter- und Stateful-Firewalls
Während Stateful-Firewalls lediglich eine Regel für die initiale Verbindungsaufnahme benötigen und die Antwortpakete aus dem externen Netzwerk automatisch entsprechend der sogenannten "State-Table" zuordnen und durchlassen, müssen bei einem einfachen Paketfilter ggf. Regeln für den Hin- und Rückweg erstellt werden. Dies macht das Regelwerk deutlich anfälliger für Konfigurationsfehler (siehe oben).
Bei einigen Firewall-Implementationen (z. B. Cisco ASA) ist es auch möglich, Regeln auf Interfaces anzuwenden. Dies impliziert für einige weniger versierte Administratoren, dass es sich bei der ASA um einen Paketfilter-Mechanismus handelt, der beide Richtungen berücksichtigen muss. Also auch bei eigentlich guten und zuverlässigen Firewall-Plattformen ist die Qualität der Filterung nur so gut wie der Admin, der die Regeln erstellt.
Werden derartig elementare Konfigurationsfehler wie oben beschrieben gemacht, kann eine Firewall sehr einfach ausgehebelt werden, indem Sie die Option --source-port <Portnummer> nutzen. Dadurch wird Nmap in vielen Fällen versuchen, die angegebene Portnummer als Source-Port zu verwenden. Dies geht nicht bei allen Tests, aber erhöht die Wahrscheinlichkeit, trotz Firewall an verwertbare Informationen zu gelangen. Hier ein Beispiel:
nmap --source-port 20 192.168.8.1
Mit diesem Scan versuchen wir, die Firewall über Port 20/tcp zu knacken. Für einen erfolgversprechenden Ansatz können Sie schrittweise die wichtigsten Ports beider Protokolle (TCP und UDP) mit dem entsprechenden Scan-Typ (z.B. –sS, –sA oder –sU) durchtesten.
Weitere Optionen
Schauen wir uns abschließend noch zwei weitere Optionen an, mit denen wir unseren Scan besser verstecken können.
Zufällige Daten anhängen
Nmap erzeugt normalerweise leere TCP- und UDP-Pakete für die Scans. Dies kann auffällig sein und daher zu einer Entdeckung führen. Mit --data-length <Bytes> können Sie Nmap veranlassen, die angegebene Anzahl an Bytes durch Zufallswerte zu ergänzen, um den Scan unauffälliger zu machen. Dies erhöht zwar den Zeitaufwand, reduziert aber auch die Gefahr der Entdeckung. Hier ein Beispiel:
nmap --data-length 173 192.168.8.1
Hier werden an jedes Paket 173 Bytes zufälliger Daten angehängt, die nicht interpretierbar sind. Schöner wäre es, wenn Nmap hier verschieden große Pakete erzeugen könnte, aber eine solche Option ist derzeit nicht implementiert.
Zufällige Host-Reihenfolge beim Scannen
Um bei größeren Scans die Reihenfolge der Hosts innerhalb einer Hostgruppe zufälliger zu gestalten, können Sie --randomize-hosts nutzen. Dies führt dazu, dass Scans schwerer entdeckt werden können, da diese weniger offensichtlich sind. Sie können dies mit einer der oben vorgestellten Timing-Optionen so kombinieren, dass die Scans zudem besonders langsam durchgeführt werden.
Tipp: Es gibt viele Wege nach Rom
Es existiert nicht DER eine richtige Weg, um die Sicherheitsinfrastruktur eines Netzwerks zu umgehen. Je mehr Sie über das Zielnetzwerk wissen, desto einfacher wird es, geeignete Maßnahmen und Optionen zu finden, die erfolgversprechend sind.
Andererseits erfordert es viel Übung und Erfahrung, Nmap effektiv in verschiedenen Szenarien einzusetzen. Von daher wieder unsere Empfehlung: Werfen Sie die Was-passiert-dann-Maschine an und testen Sie Nmap so gründlich wie möglich in verschiedenen Umgebungen aus – natürlich nur, wenn Sie die Erlaubnis dazu haben!
Nmap Scripting Engine
Nmap stellt eine eigene Schnittstelle für selbstgeschriebene Skripte bereit – die Nmap Scripting Engine, kurz: NSE. Sie basiert auf der Programmiersprache LUA. Damit ist es möglich, Nmap um diverse Funktionen und Tests zu erweitern, so dass Nmap als Security-Scanner zum Allrounder wird.
Grundlagen
Vor einigen Jahren, als ich einen Artikel über die neue NSE für ein einschlägiges Linux-Magazin schrieb, war die NSE noch ganz frisch und es gab nur wenige Skripte. Auch der damalige Aufruf dieses Magazins an die Leser, eigene Skripte einzureichen, war nicht übermäßig erfolgreich – mehr als eine Handvoll Skripte gingen bei der Redaktion nicht ein.
Heute dagegen existieren über 550 offizielle Skripte für NSE, die mit Nmap ausgeliefert werden. Sie liegen bei Kali Linux unter /usr/share/nmap/scripts und haben die Endung .nse. Um sie besser verwalten zu können, sind die Skripte in Kategorien eingeteilt. Diese sind nicht exklusiv, so dass einzelne Skripte auch in mehreren Kategorien auftauchen können:
- auth – enthält alles rund um Authentifizierung.
- broadcast – umfasst den Versuch, weitere, nicht angegebene Systeme zu finden.
- brute – alles rund um Bruteforce-Angriffe, um Zugangsdaten (Credentials) zu erlangen.
- default – die standardmäßig ausgeführten Skripte bei Aufruf mit –sC (siehe unten) oder –A. Damit ein Skript den Weg in die Default-Liste findet, muss es diversen Kriterien entsprechen. Hierzu gehören Stabilität, Zuverlässigkeit und ein hoher Nutzwert. Zielsysteme dürfen durch das Skript nicht in ihrer Stabilität beeinträchtigt werden.
- discovery – diese Kategorie umfasst alle Skripte, die versuchen, zusätzliche Informationen über die gescannten Hosts zu ermitteln, wie öffentliche Datenbanken, SNMP-Abfragen, etc.
- dos – umfasst sehr aggressive Skripte zum Testen von Denial-of-Service-Schwachstellen. Diese sollten mit Bedacht eingesetzt werden.
- exploit – Skripte, die bekannte Schwachstellen ausnutzen wollen.
- external – Skripte, die nicht nur mit dem Zielsystem direkt, sondern auch mit externen Systemen kommunizieren, z.B. zur Abfrage von externen Datenbanken.
- fuzzer – umfasst Skripte, die mit unerwarteten bzw. zufälligen Daten versuchen, einen Dienst aus dem Konzept zu bringen, um damit evtl. unbekannte Schwachstellen zu finden. Ebenfalls als aggressiv einzustufen und mit Vorsicht zu genießen.
- intrusive – diese Überkategorie grenzt sich zu der Alternative safe ab und enthält Skripte anderer Kategorien, die als nicht-sicher gelten.
- malware – Skripte dieser Kategorie versuchen Malware und Backdoors zu erkennen.
- safe – die Alternative Überkategorie zu intrusive. Sie enthält Skripte, die von den Nmap-Entwicklern als sicher für die Integrität des Zielsystems und des Netzwerks eingestuft wurden und nicht unter intrusive fallen.
- version – Skripte in dieser Kategorie ergänzen die Funktionen der Versionserkennung.
- vuln – umfasst die Suche nach Verwundbarkeiten und Schwachstellen (Vulnerabilities), nutzt diese aber nicht aus, sondern berichtet nur darüber.
Die Skripte werden entsprechend ihrer Konfiguration an verschiedenen Stellen gestartet:
- Prerule Scripts starten vor der Scan-Phase und umfassen allgemeine Aufgaben, die nicht auf vorhandenen Scan-Ergebnissen beruhen.
- Host Scripts starten während des Scan-Vorgangs für jeden Host, auf den die jeweils enthaltene Funktion hostrule zutrifft, die die zu scannenden Hosts filtert.
- Service Scripts laufen gegen bestimmte Dienste auf dem Zielsystem. So enthält Nmap z.B. unzählige HTTP-Skripte, die gegen Webserver gestartet werden können.
- Postrule Scripts werden nach Abschluss des Scans aufgerufen und dienen der Weiterverarbeitung und Formatierung der Daten.
Wie bereits in der Kategorie default erwähnt, starten Sie einen Skript-Scan explizit mit der Option –sC. Damit werden alle Skripte der Kategorie default ausgeführt. Dies ist äquivalent zu --script=default. Auf diese Option kommen wir gleich noch näher zu sprechen. Achten Sie darauf, dass einige der in dieser Kategorie enthaltenen Skripte als aufdringlich angesehen werden und der Einsatz mit dem Auftraggeber des Penetrationtests abgeklärt sein sollte.
Neben des expliziten Aufrufs der NSE-Skripte können Sie auch mit –A einen umfangreichen Scan anstoßen, der unter anderem –sC als Option beinhaltet. Die Option –-script=<Skripte> können Sie in jedem Fall involvieren. Und unter anderem diese Option müssen wir uns jetzt etwas näher anschauen.
NSE-Skripte einsetzen
Die Skript-Engine zu aktivieren ist eine Sache, die passenden Skripte zu identifizieren und einzusetzen eine ganz andere. Die Option, um einzelne Skripte oder Skriptkategorien auszuwählen, lautet --script. Sie ist sehr flexibel und nimmt Skript-Dateinamen, Kategorien, Verzeichnisse oder sogar bestimmte Ausdrücke entgegen. Das Gleichheitszeichen kann durch ein Leerzeichen ersetzt werden, was wir im Folgenden tun werden. Einzelne Angaben werden durch Kommata voneinander getrennt.
Die nachfolgenden Beispiele für die Auswahl der Skripte entstammen der (sehr guten!) Nmap-Dokumentation, das Ziel des Scans (z. B. scanme.nmap.org) wird in der Befehlszeile nicht angegeben und muss ergänzt werden:
nmap --script default,safe
Dies wählt alle Skripte in den Kategorien default und safe aus.
nmap --script smb-os-discovery
Dies wählt ausschließlich das Skript smb-os-discovery. Die Angabe der Endung (.nse) ist hierbei nicht notwendig – ebenso wie der Pfad zum Skript, solange das Skript sich im Standard-Pfad /usr/share/nmap/scripts (bei Kali Linux) befindet.
nmap --script default,banner,/home/user/customscripts
Dies lädt alle Skripte der Kategorie default, darüber hinaus das Skript banner und alle Skript-Dateien mit der Endung .nse aus dem angegebenen Benutzerverzeichnis. Dies setzt voraus, dass das Benutzerverzeichnis existiert und die entsprechenden Skripte dort abgelegt sind.
nmap --script "http-*"
Dies lädt alle Skripte, die mit http- beginnen. Dazu gehören derzeit schon weit über 100 Skripte, wie z. B. http-apache-server-status oder http-brute. Die beiden Beispiele deuten auch an, dass darunter Skripte völlig unterschiedlicher Kategorien fallen. Seien Sie also vorsichtig beim Einsatz eines solchen Arguments!
Mit and, or und not können Sie eine weitere, detaillierte Auswahl der gewünschten Skripte vornehmen und entsprechende Ausdrücke generieren, wobei not die höchste Priorität hat, gefolgt von and und dann or. Erneut ein paar Beispiele, die der Nmap-Dokumentation entlehnt wurden:
nmap --script "not intrusive"
Dies aktiviert alle Skripte außer denen, die der Kategorie intrusive zugeordnet wurden.
nmap --script "default or safe"
Damit werden alle Skripte, die entweder in der Kategorie default oder safe sind, aktiviert.
nmap --script "default and safe"
Dies involviert die Skripte die sowohl in der Kategorie default sind, als auch in der Kategorie safe. Es geht noch weitaus komplexer, doch für unsere Zwecke soll diese Übersicht erst einmal reichen.
Die richtigen Skripte auswählen
Wollen Sie NSE-Skripte effektiv einsetzen und mehr als nur die Standard-Informationen ermitteln, so führt kein Weg daran vorbei, die gewünschten Skripte manuell auszuwählen. Die Optionen, mit denen Sie dies bewerkstelligen können, haben Sie im vorhergehenden Abschnitt kennengelernt. Nun schauen wir einmal genauer auf die Dokumentation der NSE-Skripte.
Unter nmap.org/nsedoc/ finden Sie zunächst die gesamte Liste aller mit Nmap mitgelieferten Skripte in alphabetischer Reihenfolge:
Links in der Navigation können Sie auch einzelne Kategorien auswählen, um die angezeigte Liste der Skripte einzugrenzen. Diese enthält den Namen des Skripts und eine Kurzbeschreibung. Klicken Sie auf den Namen, um sich die Details zum jeweiligen Skript anzeigen zu lassen. Hier am Beispiel des Skripts http-default-accounts gezeigt:
Wir lernen also, dass dieses Skript Default-Logindaten auf Webzugängen prüft. Dazu kann unter anderem die Gerätekategorie (z. B. routers) als Argument mitgegeben werden, um die Tests zu optimieren und auf die relevanten Credentials zu reduzieren. Unter Script Arguments finden Sie alle Werte, die das Skript entgegennimmt. Sie werden mit --script-args angehängt:
Für das Setzen der Kategorie benötigen wir http-default-accounts.category. Hier ein Beispiel, wie dies aussehen könnte:
nmap --script http-default-accounts --script-args http-default-accounts.category=router 192.168.1.254
Wir definieren zunächst das Skript, welches wir zum Einsatz bringen wollen, und ergänzen anschließend die Kategorie router. In dieser Art können Sie z. B. einmal Ihren Home-Office-Router auf Schwachstellen testen. Findet das Skript etwas, sieht das Ergebnis ungefähr folgendermaßen aus:
Listing 2: Ein Default-Account wurde gefunden
8180/tcp open unknown | http-default-accounts: | [Apache Tomcat] at /manager/html/ |_ tomcat:tomcat
Der Port 8180/tcp stellt offensichtlich eine Tomcat-Anwendung bereit, die die Standard-Logindaten nutzt. Dieses Ergebnis stammt übrigens von einem Scan einer Metasploitable-Installation. Wir gehen im folgenden Workshop gleich noch näher darauf ein. Ob und welche Argumente Sie angeben können oder müssen, ist vom jeweiligen Skript abhängig. Im Übrigen finden Sie weiter unten in der Dokumentation des jeweiligen Skripts auch noch ein Beispiel, wie das Skript eingesetzt wird und welchen Output es erzeugt.
Zenmap nutzen
Auch wenn Profis in erster Linie in der Kommandozeile mit Nmap arbeiten, so gibt es doch mit Zenmap eine grafische Oberfläche, die durchaus auch ihre Reize hat. Mit Zenmap können Sie grundsätzlich genauso wie mit Nmap auf der Kommandozeile arbeiten. Zenmap peppt die Ausgabe von Nmap noch ein bisschen auf, schafft bei umfangreichen Scans eine bessere Übersicht und erleichtert die Analyse und Verwaltung der Scans.
Zenmap wird mit Nmap mitgeliefert und steht sowohl unter Windows als auch unter Linux zur Verfügung. Sie starten es entweder über eine Verknüpfung auf dem Desktop unter Windows oder durch Eingabe von zenmap in der Kommandozeile bzw. im Ausführen-Feld (Windows+R). In Kali Linux geben wir im Terminal ebenfalls schlicht zenmap ein, um die GUI zu starten. Die nachfolgenden Screenshots stammen von Kali, bis auf Details in der Optik gibt es aber keine Unterschiede zwischen den Windows- und Linux-Versionen von Zenmap (s. Abb. 6).
Oben links werden die Ziele in derselben Art angegeben, wie es auf der Kommandozeile der Fall ist. Rechts daneben können Sie eines der vorgefertigten Profile auswählen (s. Abb. 7).
Dies ist jedoch keine Blackbox: Der jeweilige Nmap-Befehl steht in der Zeile darunter. Standardmäßig bietet Zenmap das Profil Intense Scan an, das für nmap –T4 –A –v steht. Geben Sie ein Ziel ein, wird dieses im Befehl automatisch ergänzt (s. Abb. 8).
Falls Ihnen keines der vorgefertigten Profile zusagt, können Sie die Befehlszeile jederzeit selbst gestalten, ohne dass Zenmap Ihnen das übel nimmt. Hinter der Oberfläche arbeitet ohnehin Nmap, da Zenmap tatsächlich nur ein Frontend ist. Sind Sie mit Ihrer Auswahl zufrieden, klicken Sie auf Scan rechts neben dem Profil. Zenmap zeigt Ihnen zunächst die Ausgabe von Nmap inklusive Farbcodierung zur besseren Lesbarkeit (s. Abb. 9).
Links finden Sie die gescannten Hosts inklusive Darstellung des ermittelten Betriebssystems. Führen Sie weitere Scans innerhalb einer Zenmap-Sitzung durch, wird diese Liste entsprechend ergänzt. Sie können über den Button Dienste die ermittelten Dienste anzeigen lassen. Wählen Sie einen Dienst aus, sehen Sie im Hauptfenster, welche Hosts des Scans den jeweiligen Dienst anbieten (s. Abb. 10).
Dies ist bei einem Scan eines einzelnen Systems natürlich herzlich witzlos. Führen Sie jedoch mehrere Scans durch bzw. scannen Sie einige hundert oder mehr Systeme, werden Sie für diese Übersichten dankbar sein. Entsprechend können Sie über die Register oberhalb des Hauptfensters verschiedene Details zu unterschiedlichen Aspekten des Scans anzeigen lassen. Hier ist insbesondere das Register Netzstruktur interessant, wenn Sie viele Hosts scannen. Die Übersicht ist interaktiv und ermöglicht es, Details zu jedem gescannten Host aufzurufen (s. Abb. 11).
Klicken Sie auf Steuerungen, um weitere Optionen zur Ansicht zu erhalten. Welche Bedeutung die einzelnen Symbole haben, erfahren Sie über Klick auf den Button Legend oben rechts. Über einen Klick auf den Button Rechnerbetrachter können Sie sich spezifische Informationen zum jeweils aktiven Host anzeigen lassen (links im Bild).
Scans speichern
Über das Menü Scan|Scan speichern (alternativ: STRG+S) können Sie die Scanergebnisse speichern, was im Rahmen eines Pentests zur Dokumentation in jedem Fall erfolgen sollte. Selbstverständlich steht diese Funktion auch in der kommandozeilen-basierten Version zur Verfügung. Hier geben Sie -oN <Dateiname> für die Speicherung des Scan-Ergebnisses in Textformat an oder -oX <Dateiname>, wenn Sie das Ergebnis in XML-Format speichern möchten. Obwohl Nmap mit -oG noch ein weiteres Format anbietet, das insbesondere für die Weiterverarbeitung mit grep, sed, awk & Co. gedacht ist, gilt dieses Format als veraltet.
Fazit
Nmap ist eines der beliebtesten Tools im Rahmen der Analyse der Netzwerk-Infrastruktur. Es bietet nicht nur Host-Discovery- und Portscanning-Funktionen, sondern darüber hinaus noch viele weitere Features, die es nicht nur für Netzwerk-Administratoren, sondern insbesondere auch für Hacker und Penetrationtester interessant machen.
Durch die NSE-Schnittstelle kann die Funktionalität von Nmap nahezu beliebig erweitert werden. Damit ist es eines der mächtigsten Tools im Werkzeugkasten von Hackern und Penetrationtestern, die im Rahmen der Informationsbeschaffung einen Überblick über lohnende Ziele im Netzwerk erhalten, um das weitere Vorgehen zu planen. Netzwerk-Admins liefert Nmap eine Übersicht über das tatsächliche Geschehen im Netzwerk, und nicht selten erlebt der Admin die eine oder andere Überraschung, welche unerwarteten Hosts bzw. Dienste in seinem Netzwerk laufen.
Neuen Kommentar schreiben