27. Januar 2015

nmap Ergebnisse open, closed, open|filtered – eine Übersicht

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:

  • Code 1 „Host Unreachable“
  • Code 2 „Protocol Unreachable“
  • Code 3 „Port Unreachable“
  • Code 9 „Communication with Destination Network is Administratively Prohibited“
  • Code 10 „Communication with Destination Host is Administratively Prohibited“
  • Code 13 „Communication Administratively Prohibited“

ICMP Nachricht Typ 3 mit einem der folgenden Codes erhalten:

  • Code 0 „Net Unreachable“
  • Code 1 „Host Unreachable“
  • Code 2 „Protocol Unreachable“
  • Code 9 „Communication with Destination Network is Administratively Prohibited“
  • Code 10 „Communication with Destination Host is Administratively Prohibited“
  • Code 13 „Communication Administratively Prohibited“
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.