Unterscheidung zwischen offenen und gefilterten UDP-Ports
Im Fall des Felix-Scans waren alle bis auf die dreiopen|filtered
Ports closed
, so dass der Scan die potenziell offenen Ports noch auf eine Handvoll eingrenzen konnte. Das ist nicht immer der Fall. Beispiel 5.5 zeigt einen UDP-Scan gegen die stark gefilterte Site Scanme.
Beispiel 5.5. Beispiel für einen UDP-Scan
krad# Starting Nmap ( http://nmap.org )All 1000 scanned ports on scanme.nmap.org (64.13.134.52) are open|filteredNmap done: 1 IP address (1 host up) scanned in 5.50 seconds
In diesem Fall hat der Scan die offenen Ports überhaupt nicht eingegrenzt. 1000 sind alle open|filtered
. Eine neue Strategie ist gefragt.
Tabelle 5.3, „Wie Nmap Antworten auf eine UDP-Sonde interpretiert“, zeigt, dass der Zustand open|filtered
auftritt, wenn Nmap keine Antworten von seinen UDP-Sonden auf einen bestimmten Port erhält, aber auch, dass in seltenen Fällen der UDP-Dienst, der auf einem Port zuhört, in gleicher Weise antwortet, was beweist, dass der Port offen ist. Der Grund, warum diese Dienste oft nicht antworten, ist, dass die leeren Pakete, die Nmap sendet, als ungültig angesehen werden. Leider definieren UDP-Dienste in der Regel ihre eigene Paketstruktur und halten sich nicht an ein allgemeines Format, das Nmap immer senden könnte. Ein SNMP-Paket sieht völlig anders aus als ein SunRPC-, DHCP- oder DNS-Anfragepaket.
Um das richtige Paket für jeden beliebten UDP-Dienst zu senden, bräuchte Nmap eine große Datenbank, in der die Sondenformate definiert sind.Glücklicherweise hat Nmap das in Form vonnmap-service-probes
, das Teil des Subsystems zur Erkennung von Diensten und Versionen ist, das in Kapitel 7, Erkennung von Diensten und Anwendungsversionen, beschrieben wird.
Wenn die Versionsprüfung mit -sV
(oder-A
) aktiviert ist, sendet es UDP-Sonden an jedenopen|filtered
-Port (sowie an bekannteopen
). Wenn einer der Probes eine Antwort von einem open|filtered
-Port auslöst, wird der Status auf open
geändert. Die Ergebnisse des Hinzufügens von-sV
zum Felix-Scan sind in Beispiel 5.6 dargestellt.
Beispiel 5.6. Verbesserung der UDP-Scan-Ergebnisse von Felix mit Versionserkennung
krad# Starting Nmap ( http://nmap.org )Nmap scan report for felix.nmap.org (192.168.0.42)Not shown: 997 closed portsPORT STATE SERVICE VERSION53/udp open domain ISC BIND 9.2.167/udp open|filtered dhcpserver111/udp open rpcbind 2 (rpc #100000)MAC Address: 00:02:E3:14:11:02 (Lite-on Communications)Nmap done: 1 IP address (1 host up) scanned in 1037.57 seconds
Dieser neue Scan zeigt, dass Port 111 und 53 definitiv offen sind. Das System ist jedoch nicht perfekt – Port 67 ist immer nochopen|filtered
. In diesem speziellen Fall ist der Port offen, aber Nmap hat keine funktionierende Version der Sonde für DHCP.Ein weiterer schwieriger Dienst ist SNMP, der normalerweise nur antwortet, wenn der richtige Community-String angegeben wird. Viele Geräte sind mit der Community-Zeichenfolge public
konfiguriert, aber nicht alle. Obwohl diese Ergebnisse nicht perfekt sind, ist es dennoch hilfreich, den wahren Status von zwei der drei getesteten Ports zu erfahren.
Nachdem Felix die Ergebnisse erfolgreich disambiguiert hat, wendet er seine Aufmerksamkeit wieder Scanme zu, der beim letzten Mal alle Ports als open|filtered
aufgelistet hat. Er versucht es erneut mit der Versionserkennung, wie in Beispiel 5.7 gezeigt.
Beispiel 5.7. Verbesserung der UDP-Scanergebnisse von Scanme mit Versionserkennung
krad# Starting Nmap ( http://nmap.org )Nmap scan report for scanme.nmap.org (64.13.134.52)Not shown: 999 open|filtered portsPORT STATE SERVICE VERSION53/udp open domain ISC BIND 9.3.4Nmap done: 1 IP address (1 host up) scanned in 3691.89 seconds
Ereet hat zwar den offenen Port gefunden, aber er hat den Fehler gemacht, seine Nmap-Version nicht zuerst zu aktualisieren. Nmap Version 5.10BETA1 und neuer haben ein Nutzlastsystem, das richtige Dienstprotokollanfragen an mehr als drei Dutzend bekannte UDP-Ports sendet, wenn sie für Port-Scans oder Host-Ermittlungen ausgewählt werden. Es ist zwar nicht so umfassend wie die Versionserkennung, aber es hätte den offenen Port 53 in Beispiel 5.5 schnell identifiziert.
Dieses Ergebnis hat eine Stunde gedauert, im Gegensatz zu fünf Sekunden für den vorherigenScanme-Scan, aber diese Ergebnisse sind tatsächlich nützlich. Ereets Lächeln wird breiter und seine Augen funkeln angesichts dieses Beweises für einen offenen ISC BINDnameserver auf einem Rechner, den er kompromittieren will. Diese Software hat eine lange Geschichte von Sicherheitslücken, vielleicht kann er also eine Schwachstelle in dieser neuen Version finden.
Ereet wird seine UDP-Angriffe auf Port 53 konzentrieren, da er als offen bestätigt wurde, aber er vergisst auch nicht die anderen 999 Ports, die alsopen|filtered
aufgeführt sind. Wie wir am Beispiel des Ports dhcpserver auf Felix gesehen haben, können sich bestimmte offene UDP-Dienste sogar vor der Erkennung durch die Nmap-Version verstecken. Außerdem hat er bisher nur die Standard-Ports gescannt, es gibt 64529 andere, die möglicherweise offen sein könnten. Zum Beispiel ist 53 der einzige offene UDP-Port auf Scanme.
Während diese Technik der Versionserkennung die einzige Möglichkeit für Nmap ist, open|filtered
Ports automatisch zu disambiguieren, gibt es ein paar Tricks, die manuell ausprobiert werden können. Manchmal kann ein spezieller Traceroute helfen. Sie könnten einen Traceroute gegen einen bekannten offenen TCP- oder UDP-Port mit Nmap oder einem Tool wie Nping durchführen und dann dasselbe gegen den fraglichen UDP-Port versuchen. Unterschiede in der Anzahl der Sprünge können offene von gefilterten Ports unterscheiden. Ereet versucht dies mitScanme in Beispiel 5.8. Der erste Befehl führt einen UDP-Traceroute gegen den bekannten offenen Port 53 durch. Der zweite Befehl führt dasselbe für den vermutlich geschlossenen Port 54 durch. Die ersten paar Hops wurden aus Platzgründen weggelassen.
Beispiel 5.8. Versuch der Disambiguierung von UDP-Ports mit TTL-Diskrepanzen
krad# Starting Nping ( http://nmap.org/nping )SENT (7.0370s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=8 id=4826 iplen=28RCVD (7.1010s) ICMP 4.69.134.222 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=248 id=38454 iplen=56SENT (8.0400s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=9 id=38166 iplen=28RCVD (8.1050s) ICMP 4.68.18.204 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=247 id=39583 iplen=56SENT (9.0420s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=10 id=6788 iplen=28RCVD (9.1080s) ICMP 4.59.4.78 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=246 id=59897 iplen=56SENT (10.0440s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=11 id=366 iplen=28RCVD (10.1100s) ICMP 69.36.239.221 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=243 id=42710 iplen=56SENT (11.0470s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=12 id=63478 iplen=28SENT (12.0490s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=13 id=56653 iplen=28Max rtt: 73.003ms | Min rtt: 0.540ms | Avg rtt: 48.731msRaw packets sent: 13 (364B) | Rcvd: 10 (560B) | Lost: 3 (23.08%)Tx time: 12.02836s | Tx bytes/s: 30.26 | Tx pkts/s: 1.08Rx time: 13.02994s | Rx bytes/s: 42.98 | Rx pkts/s: 0.77Nping done: 1 IP address pinged in 13.05 secondskrad# Starting Nping ( http://nmap.org/nping )SENT (7.0370s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=8 id=56481 iplen=28RCVD (7.1130s) ICMP 4.69.134.214 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=248 id=22437 iplen=56SENT (8.0400s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=9 id=23264 iplen=28RCVD (8.1060s) ICMP 4.68.18.76 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=247 id=50214 iplen=56SENT (9.0430s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=10 id=9101 iplen=28RCVD (9.1070s) ICMP 4.59.4.78 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=246 id=880 iplen=56SENT (10.0450s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=11 id=35344 iplen=28RCVD (10.1110s) ICMP 69.36.239.221 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=243 id=44617 iplen=56SENT (11.0470s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=12 id=53857 iplen=28SENT (12.0490s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=13 id=986 iplen=28Max rtt: 76.488ms | Min rtt: 0.546ms | Avg rtt: 48.480msRaw packets sent: 13 (364B) | Rcvd: 11 (616B) | Lost: 2 (15.38%)Tx time: 12.02908s | Tx bytes/s: 30.26 | Tx pkts/s: 1.08Rx time: 13.03165s | Rx bytes/s: 47.27 | Rx pkts/s: 0.84Nping done: 1 IP address pinged in 13.05 seconds
In diesem Beispiel war Ereet nur in der Lage, Hop elf der offenen und geschlossenen Ports zu erreichen. Diese Ergebnisse können also nicht zur Unterscheidung der Portzustände bei diesem Host verwendet werden. Es war einen Versuch wert und funktioniert in einer beträchtlichen Anzahl von Fällen. Es ist wahrscheinlicher, dass es in Situationen funktioniert, in denen die Screening-Firewall mindestens ein oder zwei Sprünge vor dem Zielhost liegt. Scanme hingegen betreibt seine eigene Linuxiptableshost-basierte Firewall. Es gibt also keinen Unterschied in der Anzahl der Sprünge zwischen gefilterten und offenen Ports.
Eine andere Technik besteht darin, anwendungsspezifische Tools gegen gängige Ports einzusetzen. Zum Beispiel könnte ein Brute-Force-SNMP-Community-String-Cracker an Port 161 ausprobiert werden. Da Nmaps Versionserkennungs-Sondendatenbank wächst, verringert sich die Notwendigkeit, seine Ergebnisse mit externen, spezialisierten Tools zu ergänzen. Sie sind immer noch nützlich für spezielle Fälle, wie SNMP-Geräte mit einem benutzerdefinierten Community-String.