parse-nmap.py
Di 03 Mai 2016 by Christoph Bleß de en Tags nmap / Python / parse-nmap / parse-nmap.pyParse-nmap ist ein Tool zum parsen von nmap Scanergebnissen (nur XML), welches es ermöglicht die Scanergebnisse zu filtern (z.B.: nach Plattform oder IP), Target-Listen zu erstellen oder die Ergebisse als LaTeX Tabelle zu exportieren (diese Option habe ich verwendet um die Tabellen für den OSCP-Report zu erzeugen). In diesem Beitrag werde ich einige dieser Optionen etwas genauer vorstellen. Das Script ist in meinem Account auf bitbucket.org zu finden.
Für die folgenden Beispiele wird davon ausgegangen, dass ein nmap-Scan über die TOP 20 TCP Ports gemacht und dieses Ergebnis in der Datei lab-top-ports gespeichert wurde (siehe erstes Code-Beispiel).
prompt$ nmap -sS -sV --top-ports 20 -oA lab-top-ports <IPs>
Display Optionen
Übersicht
Das folgende Beispiel zeigt, wie mit Hilfe von parse-nmap eine Übersicht aller in der XML-Datei enthaltenen Hosts angeizeigt wird. Die ersten vier Zeilen zeigen lediglich Informationen zur Anzahl der in der Datei vorhandenen Hosts und der Anzahl an Hosts nach Anwendung der Filter. Diese Übersicht enthält drei Spalten pro Host. Die erste ist die IP, gefolgt von Hostnamen (localhost, falls dieser nicht Verfügbar ist) und einer Spalte mit Informationen zum Betriebssystem (falls vorhanden).
prompt$ parse-nmap.py lab-top-ports.xml
# number of hosts in the report: 6
# number of hosts after IP filter: 6
# number of hosts after OS and IP filter: 6
# number of hosts after OS, IP and port filter: 6
192.168.56.10 localhost Microsoft Windows XP SP2 or SP3
192.168.56.101 localhost Linux 2.6.32 - 3.10
192.168.56.102 localhost Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, or Windows 8
192.168.56.103 localhost Linux 2.4.9 - 2.4.18 (likely embedded)
192.168.56.200 localhost Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, or Windows 8
192.168.56.250 localhost Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, or Windows 8
print-ports
Die Option -p zeigt neben IP, Hostname und Betriebssysteminformationen auch die offenen Ports für jeden Host.
prompt$ parse-nmap.py -p lab-top-ports.xml
# number of hosts in the report: 6
# number of hosts after IP filter: 6
# number of hosts after OS and IP filter: 6
# number of hosts after OS, IP and port filter: 6
#===============================================================================
IP: 192.168.56.10
Hostname: localhost
OS: Microsoft Windows XP SP2 or SP3
#-------------------------------------------------------------------------------
135 tcp msrpc product: Microsoft Windows RPC ostype: Windows
139 tcp netbios-ssn
445 tcp microsoft-ds product: Microsoft Windows XP microsoft-ds ostype: Windows
#===============================================================================
IP: 192.168.56.101
Hostname: localhost
OS: Linux 2.6.32 - 3.10
#-------------------------------------------------------------------------------
22 tcp ssh product: OpenSSH version: 6.6.1 extrainfo: protocol 2.0
80 tcp http product: Apache httpd version: 2.4.6 extrainfo: (CentOS) PHP/5.4.16
8080 tcp tcpwrapped
Filter Optionen
Filter open TCP and UDP ports
Mit parse-nmap ist es möglich nach offenen TCP (Option -t oder --tcp) oder UDP (Option -u oder --udp) Ports zu filtern. Das folgende Beispiel zeigt, die Verwendung eines TCP-Filters, der dafür sorgt, dass nur Hosts mit einem offenen TCP-Port 22 angezeigt werden.
prompt$ parse-nmap.py -p -t 22 lab-top-ports.xml
# number of hosts in the report: 6
# number of hosts after IP filter: 6
# number of hosts after OS and IP filter: 6
# number of hosts after OS, IP and port filter: 2
#===============================================================================
IP: 192.168.56.101
Hostname: localhost
OS: Linux 2.6.32 - 3.10
#-------------------------------------------------------------------------------
22 tcp ssh product: OpenSSH version: 6.6.1 extrainfo: protocol 2.0
80 tcp http product: Apache httpd version: 2.4.6 extrainfo: (CentOS) PHP/5.4.16
8080 tcp tcpwrapped
#===============================================================================
IP: 192.168.56.103
Hostname: localhost
OS: Linux 2.4.9 - 2.4.18 (likely embedded)
#-------------------------------------------------------------------------------
22 tcp ssh product: OpenSSH version: 3.1p1 extrainfo: protocol 1.99
Filter hosts by platform
Zusätzlich zum Port-Filter ist es auch möglich Hosts auf Basis der Plattform (z.B.: Windows oder Linux) zu filtern. Diese Plattform oder Betriebssystemfamilie kann durch Angabe der Option -f oder --os-familiy spezifiziert werden.
prompt$ parse-nmap.py -p -f Windows lab-top-ports.xml
# number of hosts in the report: 6
# number of hosts after IP filter: 6
# number of hosts after OS and IP filter: 4
# number of hosts after OS, IP and port filter: 4
#===============================================================================
IP: 192.168.56.10
Hostname: localhost
OS: Microsoft Windows XP SP2 or SP3
#-------------------------------------------------------------------------------
135 tcp msrpc product: Microsoft Windows RPC ostype: Windows
139 tcp netbios-ssn
445 tcp microsoft-ds product: Microsoft Windows XP microsoft-ds ostype: Windows
#===============================================================================
IP: 192.168.56.102
Hostname: localhost
OS: Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, or Windows 8
#-------------------------------------------------------------------------------
135 tcp msrpc product: Microsoft Windows RPC ostype: Windows
139 tcp netbios-ssn
445 tcp netbios-ssn
1025 tcp msrpc product: Microsoft Windows RPC ostype: Windows
...
Filter by IP
Um Hosts anhand der IP zu filtern, kann der Remote-Host mit der Option -r angegeben werden.
prompt$ parse-nmap.py -p -r 192.168.56.10 lab-top-ports.xml
# number of hosts in the report: 6
# number of hosts after IP filter: 1
# number of hosts after OS and IP filter: 1
# number of hosts after OS, IP and port filter: 1
#===============================================================================
IP: 192.168.56.10
Hostname: localhost
OS: Microsoft Windows XP SP2 or SP3
#-------------------------------------------------------------------------------
135 tcp msrpc product: Microsoft Windows RPC ostype: Windows
139 tcp netbios-ssn
445 tcp microsoft-ds product: Microsoft Windows XP microsoft-ds ostype: Windows
parse-nmap mit anderen Tools nutzen
Target-Listen generieren
Mit parse-nmap ist es möglich Target-Listen für andere Tools zu erzeugen. Das Standard-Trennzeichen zwischen den IPs ist ein Leerzeichen, dieses lässt sich allerdings mit der Option -d oder --list-delimiter ändern. Die folgenden Beispiele zeigen, wie eine Target-Liste für alle Windows Rechner mit einem offenen TCP-Port 445 erzeugt wird. Das erste Beispiel nutzt das Standard-Trennzeuchen, das zweite Beispiel nutzt ein Komma als Trennzeichen.
prompt$ parse-nmap.py -f Windows -t 445 --list lab-top-ports.xml
192.168.56.10 192.168.56.102 192.168.56.200 192.168.56.250
prompt$ parse-nmap.py -f Windows -t 445 --list -d "," lab-top-ports.xml
192.168.56.10,192.168.56.102,192.168.56.200,192.168.56.250
Target-Listen als Datei speichern
Wenn eine Target-Liste benötigt wird, die für jede IP eine seperate Zeile nutzt (z.B.: bei Verwendung von onesixtyone), kann die Option --list-file genutzt werden. Angenommen ein Nmap-Scan über UDP-Port 161 wurde in der Datei udp.xml gespeichert und es soll für onesixtyone eine Target-Liste mit allen Hosts erstellt werden, bei denen der Port offen ist. Dies ist mit folgendem Kommando möglich.
prompt$ parse-nmap.py -u 161 --list-file targetlist udp.xml
parse-nmap als Eingabe für nmap
Das folgende Beispiel nutzt parse-nmap als Input für nmap um einen vulnscan bei allen Windows Rechnern auf Port 445 durchzuführen.
prompt$ nmap -sV -p 445 --script=vuln --script-args=unsafe=1 $(parse-nmap.py -f Windows -t 445 --list lab-top-ports.xml)