Firewall-/IDS-Umgehung und -Täuschung

Viele Internet-Pioniere hatten die Vision eines globalen, offenen Netzwerks, in dem ein universeller IP-Adressraum virtuelle Verbindungen zwischen zwei beliebigen Knoten erlaubt. Dadurch können Hosts als echte, gleichberechtigte Partner agieren und Information untereinander senden und empfangen. Die Menschen könnten von ihrer Arbeitsstelle auf all ihre Systeme daheim zugreifen, die Einstellungen der Klimaanlage ändern oder die Türen für verfrühte Gäste aufsperren. Diese Vision einer universellen Konnektivität wurde durch eine Verknappung im Adressraum und Sicherheitsbedenken abgewürgt. In den frühen 1990er Jahren begannen Organisationen mit der Aufstellung von Firewalls mit dem ausdrücklichen Zweck einer Reduktion der Konnektivität. Riesige Netzwerke wurden mit Anwendungs-Proxies, NAT (Network Address Translation)-Geräten und Paketfiltern vom ungefilterten Internet abgeriegelt. Der ungehinderte Fluss von Informationen hat einer strengen Regulierung von zugelassenen Kommunikationskanälen und der darüber ausgetauschten Inhalte Platz gemacht.

Netzwerkhindernisse wie Firewalls können die Analyse eines Netzwerks außerordentlich schwer machen. Und leichter wird es nicht werden, da das Verhindern von Ausspähungen oft ein Schlüsselziel beim Einsatz dieser Geräte ist. Trotzdem bietet Nmap viele Eigenschaften, um beim Verständnis dieser komplexen Netzwerke zu helfen und um zu überprüfen, dass diese Filter arbeiten wie gewünscht. Es bietet sogar Mechanismen zur Umgehung schlechter Abwehrstrategien. Eine der besten Methoden, Ihre Lage in puncto Netzwerksicherheit zu verstehen, ist die, sie anzugreifen. Versetzen Sie sich selbst in die Denkweise eines Angreifers und wenden Sie Verfahren aus diesem Kapitel gegen Ihr Netzwerk an. Starten Sie einen FTP-Bounce-Scan, Idle-Scan, Fragmentierungsangriff, oder versuchen Sie durch einen Ihrer eigenen Proxies zu tunneln.

Zusätzlich zur Beschränkung der Netzwerkaktivität überwachen Firmen ihren Datenverkehr immer mehr mit Intrusion-Detection-Systemen (IDS). Alle wichtigen IDS werden mit Regeln ausgeliefert, die entworfen wurden, um Nmap-Scans zu erkennen, weil Scans manchmal Vorboten von Angriffen sind. Viele dieser Produkte haben sich in Intrusion-Prevention-Systeme (IPS) verwandelt, die für böswillig gehaltenen Datenverkehr aktiv blockieren. Dummerweise ist es für Netzwerkadministratoren und IDS-Hersteller eine sehr schwierige Aufgabe, böswillige Absichten durch die Analyse von Paketdaten zuverlässig zu erkennen. Angreifer mit Geduld, Geschick und der Hilfe bestimmter Nmap-Optionen können meist unerkannt an einem IDS vorbeikommen. Währenddessen müssen Administratoren mit riesigen Mengen falscher positiver Ergebnisse kämpfen, bei denen eine nicht böswillige Aktivität fehldiagnostiziert wird und Alarm schlägt oder blockiert wird.

Ab und zu schlagen Leute vor, dass Nmap keine Eigenschaften für die Umgehung von Firewallregeln oder IDS enthalten sollte. Ihr Argument ist, dass diese Eigenschaften genauso wahrscheinlich von Angreifern missbraucht werden wie von Administratoren, die die Sicherheit verbessern. Das Problem bei dieser Logik ist, dass diese Methoden trotzdem von Angreifern benutzt würden, die einfach andere Werkzeuge finden oder die Funktionalität in Nmap einbauen würden. Zugleich wäre es für Administratoren sehr viel schwerer, ihren Job zu machen. Das Aufstellen nur moderner, gepatchter FTP-Server ist eine wesentlich bessere Verteidigung als der Versuch, die Verbreitung von Werkzeugen zu verhindern, die einen FTP-Bounce-Angriff implementieren.

Es gibt keine Wunderlösung (oder Nmap-Option) zur Erkennung und Umgehung von Firewalls und IDS-Systemen. Es braucht Kompetenz und Erfahrung. Eine Anleitung dazu würde den Rahmen dieses Referenz-Handbuches sprengen, das nur die wichtigsten Optionen auflistet und beschreibt, was sie machen.

-f (Pakete fragmentieren); --mtu (benutzt angegebene MTU)

Die Option -f bewirkt, dass der gewünschte Scan (inklusive Ping-Scans) winzig fragmentierte IP-Pakete benutzt. Die Idee dabei ist, den TCP-Header über mehrere Pakete aufzuteilen, um es Paketfiltern, Intrusion-Detection-Systemen und anderen Ärgernissen schwerer zu machen, Ihre Aktivitäten zu durchschauen. Seien Sie dabei vorsichtig! Manche Programme haben Mühe, mit diesen winzigen Paketen umzugehen. Ein Sniffer alter Schule namens Sniffit ist beim Erhalt des ersten Fragments sofort mit einem Segmentation-Fault-Fehler abgestürzt. Wenn Sie diese Option einmal angeben, spaltet Nmap die Pakete in acht Bytes oder weniger nach dem IP-Header auf. Das heißt, ein 20 Byte langer TCP-Header würde in drei Pakete aufgeteilt, zwei mit acht Bytes des TCP-Headers und eines mit den restlichen vier. Natürlich hat jedes Fragment auch einen IP-Header. Geben Sie erneut -f an, um 16 Bytes pro Fragment zu benutzen (was die Anzahl der Fragmente verkleinert). Oder Sie geben eine eigene Offset-Größe mit der Option --mtu (für engl. maximum transmission unit) an. Wenn Sie --mtu angeben, sollten Sie nicht auch -f angeben. Das Offset muss ein Vielfaches von acht sein. Zwar kommen fragmentierte Pakete nicht durch Paketfilter und Firewalls durch, die alle IP-Fragmente in eine Warteschlange stellen, wie z.B. die Option CONFIG_IP_ALWAYS_DEFRAG im Linux-Kernel, aber einige Netzwerke können sich den damit verbundenen Performance-Einbruch nicht leisten und lassen sie folglich deaktiviert. Andere können sie nicht aktivieren, weil die Fragmente auf verschiedenen Routen in ihre Netzwerke kommen könnten. Manche Quellsysteme defragmentieren hinausgehende Pakete im Kernel. Ein Beispiel dafür ist Linux mit dem Verbindungsmodul iptables. Führen Sie einen Scan aus, während ein Sniffer wie z.B. Wireshark läuft, um sicherzustellen, dass die gesendeten Pakete fragmentiert sind. Falls Ihr Host-Betriebssystem Probleme macht, probieren Sie die Option --send-eth aus, um die IP-Schicht zu umgehen und rohe Ethernet-Rahmen zu schicken.

Eine Fragmentierung wird von Nmap nur für rohe Pakete unterstützt, die man mit TCP- und UDP-Port-Scans (außer beim Connect-Scan und FTP-Bounce-Scan) und der Betriebssystemerkennung benutzen kann. Merkmale wie die Versionserkennung und die Nmap Scripting Engine unterstützen im Allgemeinen keine Fragmentierung, weil sie sich auf den TCP-Stack Ihres Hosts verlassen, um mit anderen Zielen zu kommunizieren.

-D <decoy1>[,<decoy2>][,ME][,...] (verdeckt einen Scan mit Ködern)

Führt einen Decoy-Scan durch, was für den entfernten Host den Anschein erweckt, dass der oder die Hosts, die Sie als Köder angeben, das Zielnetzwerk ebenfalls scannen. Deren IDS kann also 5–10 Port-Scans von eindeutigen IP-Adressen verzeichnen, aber es weiß nicht, welche IP sie gescannt hat und welche unschuldige Köder waren. Das kann man zwar bekämpfen, indem man Router-Pfade mitverfolgt, Antworten verwirft oder weitere aktive Mechanismen anwendet, aber im Allgemeinen ist es eine wirksame Methode zum Verbergen Ihrer IP-Adresse.

Trennen Sie alle Köder mit Kommata voneinander, wobei Sie optional ME als einen der Köder angeben können, um die Position Ihrer echten IP-Adresse zu bestimmen. Falls Sie ME an sechster Stelle oder später setzen, zeigen einige verbreitete Port-Scan-Detektoren (wie z.B. der hervorragende Scanlogd von Solar Designer) Ihre IP-Adresse wahrscheinlich überhaupt nicht an. Wenn Sie kein ME angeben, setzt es Nmap an eine zufällig gewählte Position. Sie können auch RND benutzen, um eine zufällige, nicht-reservierte IP-Adresse zu erzeugen, oder RND:<number>, um <number> Adressen zu erzeugen.

Beachten Sie, dass die Hosts, die Sie als Köder benutzen, eingeschaltet sein sollten, sonst könnten Sie versehentlich einen SYN-Flood-Angriff auf Ihre Ziele auslösen. Außerdem lässt sich der scannende Host sehr einfach bestimmen, wenn nur einer davon im Netzwerk eingeschaltet ist. Vielleicht möchten Sie IP-Adressen statt -Namen benutzen (damit die Köder-Netzwerke Sie nicht in ihren Nameserver-Protokollen sehen).

Köder werden sowohl im initialen Ping-Scan (mit ICMP, SYN, ACK oder was auch immer) als auch während der eigentlichen Port-Scan-Phase benutzt. Auch bei der Erkennung entfernter Betriebssysteme (-O) werden Köder benutzt. Bei der Versionserkennung oder beim TCP-Connect-Scan funktionieren Köder jedoch nicht. Falls eine Scan-Verzögerung stattfindet, wird sie zwischen zwei Stapeln vorgetäuschter Testpakete erzwungen, nicht zwischen einzelnen Testpaketen. Weil Köder stapelweise auf einmal gesendet werden, können sie vorübergehend die Beschränkungen der Überlastungssteuerung verletzen.

Man sollte hierbei noch erwähnen, dass beim Einsatz von zu vielen Ködern Ihr Scan sich verlangsamen und sogar ungenauer werden kann. Manche ISPs filtern außerdem Ihre vorgetäuschten Pakete, aber viele beschränken solche vorgetäuschten IP-Pakete in keinster Weise.

-S <IP_Address> (Quelladresse vortäuschen)

Unter gewissen Umständen kann Nmap eventuell Ihre Quelladresse nicht bestimmen (wenn dem so ist, dann sagt Ihnen Nmap Bescheid). Benutzen Sie in diesem Fall -S mit der IP-Adresse der Schnittstelle, über die Sie die Pakete senden möchten.

Eine weitere mögliche Anwendung dieses Flags ist eine Vortäuschung des Scans, um die Ziele glauben zu machen, dass jemand anderes sie scannt. Stellen Sie sich eine Firma vor, die wiederholt von einem Mitbewerber gescannt wird! Bei dieser Art von Anwendung werden im Allgemeinen die Optionen -e und -PN benötigt. Beachten Sie, dass Sie normalerweise Antwortpakete zurückbekommen (sie werden an die IP adressiert, die Sie vortäuschen), d.h. Nmap kann keinen sinnvollen Bericht produzieren.

-e <interface> (angegebene Schnittstelle benutzen)

Sagt Nmap, auf welcher Schnittstelle es Pakete senden und empfangen soll. Nmap sollte das automatisch erkennen können, sagt Ihnen aber Bescheid, wenn nicht.

--source-port <portnumber>; -g <portnumber> (Quell-Portnummer vortäuschen)

Eine Fehlkonfiguration, die überraschend häufig vorkommt, ist es, dem Netzwerkverkehr allein auf Basis der Quell-Portnummer zu vertrauen. Wie das zustande kommt, kann man leicht verstehen. Ein Administrator setzt eine glänzende neue Firewall auf und wird sofort mit Beschwerden von undankbaren Benutzern überflutet, deren Anwendungen nicht mehr laufen. Vor allem DNS könnte einen Aussetzer haben, weil die UDP-DNS-Antworten von externen Servern nicht länger ins Netzwerk hineinkommen. Ein weiteres häufiges Beispiel ist FTP. Bei aktiven FTP-Übertragungen versucht der entfernte Server, eine Verbindung zurück zum Client herzustellen, um die gewünschte Datei zu übertragen.

Für diese Probleme existieren sichere Lösungen, oftmals in Form von Proxies auf Anwendungsebene oder Protokoll-parsenden Firewall-Modulen. Leider gibt es auch einfachere, unsichere Lösungen. Viele Administratoren haben beobachtet, dass DNS-Antworten von Port 53 und aktive FTP-Antworten von Port 20 kommen, und sind in die Falle getappt, eingehenden Datenverkehr nur von diesen Ports zu erlauben. Oft gehen sie davon aus, dass kein Angreifer solche Firewall-Lecks bemerken und ausbeuten würde. In anderen Fällen betrachten das Administratoren als kurzfristige Überbrückungsmaßnahme, bis sie eine sicherere Lösung implementieren können. Und dann vergessen sie diese Sicherheitsaktualisierung.

Aber nicht nur überarbeitete Netzwerkadministratoren tappen in diese Falle. Zahlreiche Produkte wurden mit diesen unsicheren Regeln ausgeliefert. Sogar Microsoft hat sich schuldig gmacht. Die IPsec-Filter, die mit Windows 2000 und Windows XP ausgeliefert wurden, enthalten eine implizite Regel, die jeden TCP- oder UDP-Datenverkehr von Port 88 (Kerberos) erlaubt. Ein weiterer bekannter Fall sind Versionen der Zone Alarm Personal-Firewall bis 2.1.25, die alle empfangenen UDP-Pakete vom Quell-Port 53 (DNS) oder 67 (DHCP) erlauben.

Nmap bietet die Optionen -g und --source-port (sind äquivalent), um diese Schwächen auszunutzen. Geben Sie einfach eine Portnummer an, und Nmap wird, wenn möglich, Pakete von diesem Port senden. Damit es richtig funktioniert, muss Nmap für bestimmte Betriebssystemerkennungstests verschiedene Portnummern benutzen, und DNS-Anfragen ignorieren das --source-port-Flag, weil Nmap sich bei ihnen auf System-Bibliotheken verlässt. Die meisten TCP-Scans, inklusive dem SYN-Scan, unterstützen die Option vollständig, ebenso wie der UDP-Scan.

--data-length <number> (Zufallsdaten an gesendete Pakete anfügen)

Normalerweise sendet Nmap minimale Pakete, die nur einen Header enthalten. Daher haben seine TCP-Pakete im Allgemeinen nur 40 Bytes und die ICMP Echo-Requests nur 28. Mit dieser Option sagen Sie Nmap, dass es die angegebene Anzahl von zufälligen Bytes an die meisten gesendeten Pakete hinzufügen soll. Pakete für die Betriebssystemerkennung (-O) sind davon nicht betroffen, weil dort aus Genauigkeitsgründen konsistente Pakete verlangt werden, aber die meisten Ping- und Port-Scan-Pakete unterstützen das. Das kann den Scan etwas verlangsamen, aber auch etwas unauffälliger machen.

--ip-options <S|R [route]|L [route]|T|U ... >; --ip-options <hex string> (sendet Pakete mit angegebenen IP-Optionen)

Laut IP-Protokoll können in den Paket-Headern mehrere Optionen enthalten sein. Anders als die allgegenwärtigen TCP-Optionen sieht man IP-Optionen aus Gründen der praktischen Anwendbarkeit und Sicherheit nur selten. Tatsächlich blockieren die meisten Internet-Router die gefährlichsten Optionen wie Source Routing sogar. Dennoch können diese Optionen in manchen Fällen nützlich sein, um die Netzwerk-Route zu Zielrechnern zu bestimmen und zu manipulieren. Sie können z.B. vielleicht die Option Record Route dazu benutzen, einen Pfad zum Ziel sogar dann zu bestimmen, wenn traditionellere, traceroute-artige Ansätze versagen. Oder wenn Ihre Pakete von einer bestimmten Firewall verworfen werden, können Sie mit den Optionen Strict oder Loose Source Routing möglicherweise eine andere Route angeben.

Die meisten Möglichkeiten bei der Angabe von IP-Optionen hat man, wenn man einfach Werte als Argumente für --ip-options angibt. Stellen Sie vor jede Hex-Zahl ein \x und zwei Ziffern. Einzelne Zeichen können Sie wiederholen, indem Sie ihnen ein Sternchen und dann die Anzahl der Wiederholungen nachstellen. So ist z.B. \x01\x07\x04\x00*36\x01 ein Hex-String mit 36 NUL-Bytes.

Nmap bietet auch einen verkürzten Mechanismus für die Angabe von Optionen. Geben Sie einfach die Buchstaben R, T oder U an, um jeweils Record Route, Record Timestamp oder beide Optionen gemeinsam anzugeben. Loose oder Strict Source Routing kann man mit L bzw. S, gefolgt von einem Leerzeichen und einer mit Leerzeichen getrennten Liste von IP-Adressen angeben.

Wenn Sie die Optionen in den gesendeten und empfangenen Paketen sehen möchten, geben Sie --packet-trace an. Mehr Informationen und Beispiele zum Einsatz von IP-Optionen mit Nmap finden Sie unter https://seclists.org/nmap-dev/2006/q3/0052.html.

--ttl <value> (setzt IP-Time-to-live-Feld)

Setzt bei IPv4 das Time-to-live-Feld in gesendeten Paketen auf den angegebenen Wert.

--randomize-hosts (randomisiert Reihenfolge der Zielhosts)

Verlangt von Nmap, dass es alle Gruppen von bis zu 16.384 Hosts durcheinanderwürfelt, bevor es sie scannt. Das kann den Scan für verschiedene Netzwerk-Überwachungssysteme weniger offensichtlich machen, besonders dann, wenn Sie ihn mit einer langsamen Timing-Option kombinieren. Wenn Sie größere Gruppen randomisieren möchten, müssen Sie PING_GROUP_SZ in nmap.h erhöhen und neu kompilieren. Eine alternative Lösung ist es, die Liste der Ziel-IPs mit einem List-Scan (-sL -n -oN <filename>) zu erzeugen, dann z.B. mit einem Perl-Script zu randomisieren, um sie schließlich als Ganzes mit -iL an Nmap zu übergeben.

--spoof-mac <MAC address, prefix, or vendor name> (MAC-Adresse vortäuschen)

Verlangt von Nmap, dass es in allen gesendeten rohen Ethernet-Rahmen die angegebene MAC-Adresse benutzt. Diese Option impliziert --send-eth, um sicherzustellen, dass Nmap tatsächlich Pakete auf Ethernet-Ebene sendet. Die MAC-Adresse kann in mehreren Formaten angegeben werden. Wenn es einfach die Zahl 0 ist, wählt Nmap eine völlig zufällige MAC-Adresse für diese Sitzung. Falls der angegebene String aus einer geraden Anzahl von Hexadezimalziffern besteht (in dem Paare optional mit Doppelpunkten getrennt sein können), benutzt Nmap diese als MAC. Werden weniger als 12 Hexadezimalziffern angegeben, dann füllt Nmap die restlichen sechs Bytes mit zufälligen Werten. Falls das Argument weder null noch ein Hex-String ist, schaut Nmap in nmap-mac-prefixes nach, um einen Herstellernamen zu finden, der den angegebenen String enthält (unabhängig von der Schreibweise). Wird eine Übereinstimmung gefunden, benutzt Nmap die OUI dieses Herstellers (einen drei Byte langen Präfix) und füllt die verbleibenden drei Bytes mit Zufallswerten. Gültige Beispiele für Argumente von --spoof-mac sind Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2 und Cisco. Diese Option betrifft nur Scans mit rohen Paketen wie den SYN-Scan oder die Betriebssystemerkennung, keine verbindungsorientierten Merkmale wie die Versionserkennung oder die Nmap Scripting Engine.

--badsum (sendet Pakete mit falschen TCP/UDP-Prüfsummen)

Verlangt von Nmap, bei den an Zielhosts gesendeten Paketen ungültige TCP- oder UDP-Prüfsummen zu benutzen. Da so gut wie alle Host-IP-Stacks solche Pakete verwerfen, kommen eventuelle Antworten sehr wahrscheinlich von einer Firewall oder einem IDS, das sich nicht die Mühe macht, die Prüfsumme zu überprüfen. Mehr Details zu dieser Methode finden Sie unter https://nmap.org/p60-12.html.