nmap ist eines der bekanntesten Werkzeuge, das sowohl von Administratoren, als auch Penetrationstestern geschätzt wird. Und hey „If it’s good enough for Trinity, then it’s good enough for you“. Kurz gesagt lässt sich mit nmap über ein Netzwerk eine Adresse ansprechen und überprüfen, welche Dienste über diese Adresse erreichbar sind, so z. B. ein Webserverdienst oder ein Mailserverdienst. Bei Penetrationstests wird nmap eingesetzt, um an Zieladressen Dienste zu erkennen und auf dieser Basis weitere Prüfungen vorzunehmen. Insofern ist die Verlässlichkeit der nmap-Ergebnisse für den Gesamtverlauf einer Prüfung sehr wichtig.
Im Falle von Diensten, die per TCP bereitgestellt werden gibt es mehrere Methoden (SYN-Scan, Full-Scan, etc) die aufgrund der Eigenschaften von TCP recht verlässlich sind. TCP ist ein verbindungsorientiertes Protokoll, bei dem über das Protokoll selbst sichergestellt wird, dass alle Daten ihr Ziel erreichen und falls nicht, die fehlenden Pakete automatisch nachgefordert werden. Hierfür findet zunächst ein Verbindungsaufbau statt, der sogenannte TCP 3-Way-Handshake. Man erhält auf die initiale Anfrage in Form eines SYN-Pakets eine Antwort, wenn
- ein SYN-ACK-Paket zurückkommt (hier ist ein Dienst, weiter geht es)
- ein RST-ACK-Paket zurückkommt (hier ist kein Dienst)
Erhält man kein Paket zurück, lauscht zumindest für die Quelladresse kein Dienst (OK, es könnten noch Mechanismen wie Portknocking vorhanden sein, aber das ist aufwändig zu prüfen).
UDP hingegen ist ein verbindungsloses Protokoll, verfügt also über keine Sicherungsmechanismen. Es gibt auch keinen Verbindungsaufbau. Man sendet ein Datagramm an eine Zieladresse samt Port und erhält eine Antwort, wenn
- ein Dienst an Zieladresse und Port lauscht
- das Datagramm sein Ziel erreicht hat
- das Datagramm inhaltlich vom Dienst auf der Gegenseite verstanden wurde
- eine Antwort vorgesehen ist
- das Zielsystem bzw. eine Firewall auf dem Weg zwischen Quell- und Zielsystem ICMP-Nachrichten zurücksendet und auf die Unzustellbarkeit über ICMP Typ 3-Nachrichten hinweist
Erhält man kein Datagramm zurück ist also entweder kein Dienst vorhanden, oder man hat das falsche Paket verschickt. UDP-Ergebnisse sind also grundsätzlich deutlich unzuverlässiger.
Darüber hinaus hat nmap eine aus meiner Sicht nicht stringente Art die Ergebnisse darzustellen. Ein TCP-Port wird als „filtered“ angezeigt, wenn nmap keine Antwort erhalten hat. Klingt nachvollziehbar. Ein UDP-Port wird als „filtered“ angezeigt, wenn nmap eine ICMP-Nachricht vom Typ 3 mit Code 0, 1, 2, 9, 10 oder 13 zurückerhalten hat. Das führt in der Praxis regelmäßig zu Missverständnissen beim Interpretieren der Ergebnisse eines Scans.
Daher zum besseren Verständnis hier eine Übersicht der häufigsten nmap-Statusmeldungen und der Grund der Meldung
nmap-Status | TCP | UDP |
open | SYN-ACK erhalten | Datagramm erhalten |
closed | RST-ACK erhalten | ICMP Nachricht Typ 3 Code 3 „Port Unreachable“ erhalten |
filtered | Keine Antwort erhalten
oder ICMP Nachricht Typ 3 mit einem der folgenden Codes erhalten:
|
ICMP Nachricht Typ 3 mit einem der folgenden Codes erhalten:
|
open|filtered | – | Keine Antwort erhalten |
Der Stolperstein ist offensichtlich der Status „filtered“ im Falle UDP. Aufgrund der Ergebnisse von TCP-Ports geht man zunächst davon aus, dass auch hier keine Antwort zurückgekommen ist. Da bei UDP wie beschrieben „keine Antwort“ nicht heißt, dass kein Dienst lauscht, sondern man vielleicht schlicht das falsche Datagramm an den Zielport gesendet hat, ist der Status „open|filtered“ durchaus nachvollziehbar. Die Verteilung der ICMP Typ3 Codes auf die Rückmeldungen „closed“ und „filtered“ hingegen, wirkt nicht stringent.