- Portspoof lässt alle 65.535 TCP-Ports so erscheinen, als wären sie offen, und emuliert Service-Signaturen. Dadurch wird die Reconnaissance-Phase eines Angreifers von einem schnellen Scan in eine lange und teure Aufgabe verwandelt.
- Es gibt bei jedem Verbindungsversuch
SYN+ACK zurück und lässt jeden Port mithilfe von mehr als 9.000 Regex-basierten dynamischen Service-Signaturen wie einen anderen legitimen Dienst antworten.
- Beim Start werden pro Port gemischte Übertragungsmodi wie sofortiger Banner, verzögerte Antwort oder dauerhaft keine Antwort zugewiesen; Jitter bei der Haltezeit von Verbindungen erschwert timingbasierte Filterung.
- Ein vollständiger Versionsscan
nmap -sV -p- dauert mit der Standard-Tarpit-Konfiguration mehr als 10 Stunden und kann Hunderte MB an Fake-Daten erzeugen; dabei werden Zeit und Threads der Scanner des Angreifers verbraucht.
- Die Implementierung nutzt eine Single-Thread-
epoll-Event-Loop, läuft im User Space ohne Root-Rechte und bindet pro laufender Instanz nur einen TCP-Port.
Welches Problem Portspoof lösen will
- Ziel von Portspoof ist es, die Reconnaissance von Angreifern langsam, teuer und unzuverlässig zu machen.
- Statt dass ein typischer 5-Sekunden-Nmap-Scan die echten Dienste eines Systems abbildet, erscheinen vor Portspoof alle 65.535 Ports als offen.
- Jeder Port sieht wie ein anderer legitimer Dienst aus, und das Design soll verhindern, dass sich schnell erkennen lässt, welcher Port tatsächlich einen echten Dienst bereitstellt.
Kernfunktionen
-
Antwort, als wären alle 65.535 TCP-Ports offen
- Statt einen Port als
CLOSED oder FILTERED zu melden, wird auf jeden Verbindungsversuch SYN+ACK zurückgegeben.
-
Service-Emulation
- Verwendet mehr als 9.000 Regex-basierte dynamische Service-Signaturen.
- Jeder Port antwortet auf Scanner-Probes mit einer anderen überzeugenden Service-Identität.
-
Gemischte Übertragungsmodi
- Jeder Port erhält beim Start ein anderes Verhaltensprofil.
- Sofortige Banner-Ausgabe, verzögerte Antworten und dauerhaftes Schweigen werden gemischt.
- Haltezeiten sind über einen breiten Bereich verteilt, sodass eine Versionserkennung über den gesamten Portbereich mit
nmap -sV -p- praktische Grenzen überschreitet.
-
Offensive Verteidigung
- Kann als „Exploitation Framework Frontend“ genutzt werden, das auf Schwachstellen in den Scanning-Tools des Angreifers selbst abzielt.
-
Leichtgewichtiges Ausführungsmodell
- Läuft im User Space.
- Benötigt keine Root-Rechte.
- Bindet pro laufender Instanz nur einen TCP-Port.
- CPU- und Speicherverbrauch sind gering.
Wie Scanner und Versionserkennung verwirrt werden
- Bei einfachen Portscans erscheinen selbst kleine Bereiche wie Port 1 bis 20 vollständig als
open.
- In Beispielausgaben werden Dienstnamen wie
tcpmux, compressnet, echo, daytime und ftp-data gemischt angezeigt.
- Bei Scans zur Versionserkennung werden gültige dynamische Signaturen auf Service-Probes zurückgegeben.
- In einem Beispiel für Port 1 bis 100 erscheinen verschiedene Dienste und Versionsstrings wie
irc, http, pop3, ssh, ftp, smtp, telnet und tor-control.
- Dadurch wird es für Angreifer schwierig zu beurteilen, welche Portnummern das System tatsächlich nutzt.
- Ein vollständiger Versionsscan
nmap -sV -p- dauert mit der Standard-Tarpit-Konfiguration mehr als 10 Stunden und erzeugt Hunderte MB an Fake-Daten.
- Der Scanner verbraucht Zeit und Threads für Verbindungen, die zu keinen echten Ergebnissen führen.
Designansatz: Single-Thread-epoll-Tarpit
- Echte Dienste wie SSH, SMTP, FTP und HTTP senden Banner, halten Verbindungen offen und warten auf Client-Eingaben.
- Eine überzeugende Emulation muss demselben Ablauf aus accept, send, hold folgen.
- Ein Modell mit einem Thread pro Client verbraucht Speicher und CPU; durch die Kosten von Context Switching kann zuerst der Verteidiger seine Ressourcen erschöpfen.
- Portspoof nutzt eine Single-Thread-
epoll-Event-Loop.
- Jeder Port erhält beim Start einen Übertragungsmodus.
- Manche Ports senden sofort einen Banner, manche antworten erst nach Client-Daten, andere bleiben stumm.
- Haltezeiten sind über mehrere Größenordnungen verteilt, von Dutzenden Millisekunden bis zu mehreren Minuten.
- Jede Verbindung enthält Jitter, sodass wiederholte Erkennung desselben Ports nicht dasselbe Timing liefert.
- Dieser Ansatz erschwert Angriffe, bei denen Garbage-Daten an alle Ports gesendet und Antwortzeiten gemessen werden.
- Bei einer einfachen Tarpit kann der Unterschied entstehen, dass sie Verbindungen einige Sekunden festhält, während echte Dienste bei falschem Protokoll schnell schließen.
- Mit gemischten Modi und breiter Timing-Verteilung schließen auch Tausende Fake-Ports in einem Bereich, der echten Diensten ähnelt.
- Es gibt keinen sauberen Schwellwert mehr, der sich zum Filtern verwenden ließe.
Kostenasymmetrie
- Die Kosten für den Verteidiger liegen bei etwa 1–2 KB Kernel-Speicher pro inaktiver Verbindung.
- Die
epoll-Loop ist Single-Threaded und hat daher keinen Context-Switching-Overhead.
- Auch durchschnittliche Hardware kann mehr als 10.000 gleichzeitige Verbindungen verkraften.
- Die Kosten des Angreifers verschieben sich auf Zeit und Aufwand.
- Allein durch Portscans erscheinen alle Ports offen, sodass kaum verwertbare Informationen entstehen.
- Um echte Dienste zu finden, sind Versionserkennung über alle 65.535 Ports und Protokoll-Level-Erkennung bei plausiblen Zielen nötig.
- Ein 5-Sekunden-Scan wird zu mehr als 10 Stunden aktiver Arbeit, während die Ergebnisse weiterhin im Heuhaufen verborgen bleiben.
Änderungen in v2.0
- v2.0 löst sich vom bisherigen Ansatz, nach dem Senden eines Banners die Verbindung zu schließen.
- Der bisherige Ansatz war anfällig für die in einem Vicarius/Hored1971-Blogbeitrag beschriebene Umgehung über Verbindungsabbrüche.
- Die neue Tarpit-Engine hält alle Verbindungen mit gemischtem Timing offen.
- Dieser Ansatz soll Filterung nach Verbindungsabbrüchen, Timing-Fingerprinting, Banner-Analyse und statistische Mustererkennung verhindern.
Installation und Grundeinstellungen
- Für den Build werden ein C++-Compiler und CMake 3.10+ benötigt.
- Der Build aus dem Quellcode erfolgt wie folgt:
mkdir build && cd build
cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc ..
make
sudo make install
- Portspoof läuft im User Space, aber zum Abfangen von Traffic, der an andere Ports gerichtet ist, sind System-Firewall-Regeln erforderlich.
- Der Standardport ist 4444; echte Service-Ports werden zuerst ausgenommen, danach wird der übrige TCP-Traffic zu Portspoof umgeleitet.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --to-ports 4444
eth0 muss durch das tatsächliche Netzwerkinterface ersetzt werden.
- Für jeden Port, auf dem ein echter Dienst läuft, muss eine
RETURN-Regel hinzugefügt werden.
- Für dauerhafte Anwendung können iptables-Regeln gespeichert oder
iptables-config aus dem Verzeichnis system_files verwendet werden.
- Für Startskripte können die Beispiele unter
system_files/init.d/ verwendet werden.
Ausführungsmodi
- Der empfohlene Modus ist der Service-Emulation-Modus.
- Er erzeugt Fake-Service-Signaturen und liefert sie an Portscanner aus.
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
- Benutzerdefiniertes Tarpit-Timing wird mit
-t und -T angegeben.
- Das Beispiel hält jede Verbindung 10 bis 60 Sekunden offen.
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
- Open Port Mode gibt ohne Service-Banner bei allen Verbindungsversuchen nur den Status
OPEN zurück.
- Die Verbindung wird dennoch als Tarpit behandelt.
portspoof -D
- Fuzzing Mode kann genutzt werden, um zufällige oder wortlistenbasierte Payloads an Scanning-Tools zu senden.
portspoof -1 -v
portspoof -f payloads.txt -v
Härtung auf iptables-Basis
- Schon die einfache
REDIRECT-Regel funktioniert, aber aggressive Scanner können Portspoof durch viele Verbindungen unter Druck setzen.
- Härtungsregeln ergänzen Rate Limiting und automatisches Blockieren.
- Echte Service-Ports werden von der Umleitung ausgenommen.
- Im Beispiel wird SSH-Port 22 ausgenommen.
- Globale Blockierregeln gelten auch für echte Dienste.
- Beispielregeln enthalten folgende Elemente:
- Loopback erlauben
- als
PORTSCAN markierte IPs 60 Sekunden lang droppen
- neue SYNs pro Quell-IP auf 10 pro Sekunde begrenzen, bei Burst über 30 droppen
- wenn eine einzelne IP mehr als 100 Verbindungen zum Portspoof-Port 4444 offen hält, markieren und anschließend droppen
- established/related Traffic und neue SYNs erlauben, danach den Rest droppen
- Bei Deployments mit hohem Traffic kann die Listengröße von
xt_recent erhöht werden.
echo "options xt_recent ip_list_tot=10000" > /etc/modprobe.d/xt_recent.conf
- Auch Kernel-Connection-Tracking und Backlog-Einstellungen können angepasst werden.
sysctl -w net.netfilter.nf_conntrack_max=131072
sysctl -w net.core.somaxconn=4096
Portspoof Pro
- Portspoof Pro erweitert Deception von einem einzelnen Host auf die Ebene eines gesamten Netzwerks.
- Ein einzelner Sensor emuliert ein komplettes
/16-Netzwerk.
- Er stellt Tausende IPs bereit.
- Jede IP hat auf allen Ports eigene Dienste.
- Zustandsbehaftete mehrstufige Dialoge werden beibehalten.
- Es bietet netzwerkweite Deception-Funktionen.
- Dark-IP-Räume und ungenutzte Subnetze werden in ein aktives Deception Grid verwandelt.
- Jeder emulierte Host zeigt je nach Quell-IP eigene Dienste mit unterschiedlicher Persönlichkeit.
- Eine aktive Tarpit erschöpft den Socket-Pool des Angreifers und drosselt Automatisierungstools.
- Es unterstützt Scan-Erkennung und Tool-Fingerprinting.
- Erkennt SYN-, FIN-, NULL-, XMAS- und ACK-Scan-Techniken.
- Führt Fingerprinting von Nmap, Masscan, ZMap und Custom-Scannern durch.
- Streamt strukturierte JSON-Telemetrie mit MITRE-ATT&CK-Mapping an ein SIEM.
- Es berücksichtigt Deployments in Betriebsumgebungen.
- Läuft in einer Sandbox-Umgebung neben Production-Traffic.
- Routing-Policies senden Deception-Traffic an den Sensor.
- Es wird darauf hingewiesen, dass es keinen Inline-Tap und kein Risiko für echte Workloads gibt.
- Unterstützt NIS2, DORA, ISO 27001, NIST CSF und CIS Controls.
Lizenz und Issue-Meldung
- Portspoof steht unter der GNU GPLv2.
- Für kommerzielle und legitime Anwendungen wird empfohlen, den Autor wegen geeigneter Lizenzvereinbarungen zu kontaktieren.
- Bugs und Feature Requests können über den GitHub Issue Tracker oder per E-Mail gemeldet werden.
1 Kommentare
Meinungen auf Hacker News
Es gibt 65.536 Ports, und Port 0 ist auf manchen Betriebssystemen ebenfalls ein Port, auf dem man einen aus dem Internet erreichbaren Dienst bereitstellen kann.
Und falls ein MariaDB-Entwickler das liest: Die Standardeinstellung, eine Datenbank auf Port 0 lauschen zu lassen, um Internetzugriff zu verhindern, verhindert auf ziemlich vielen Systemen tatsächlich nicht, dass die DB aus dem Internet erreichbar ist.
if (mysqld_port)bedeutet, dassmysqld_portungleich 0 ist, und dieses Verhalten scheint es mindestens seit MariaDB 5.5 zu geben.Computersicherheit scheint sich letztlich zwangsläufig weiter in Richtung aktiver Verteidigung dieser Art zu entwickeln.
Wenn man sieht, wie komplex und vielschichtig das Immunsystem ist, werden Computer oder Netzwerke wohl irgendwann ähnlich aussehen.
Irgendwann wird IT ein hinreichend ausgereiftes Fachgebiet sein, aber heute ist es noch nicht so weit.
Wenn man diesen Aspekt einbezieht, sieht man allerdings sogar eine eher beunruhigende Parallele.
Um E-Mail-Harvesting-Spambots aufzuhalten, habe ich einmal eine Webseite gebaut, die unendlich viele zufällige E-Mail-Adressen erzeugt: http://web.archive.org/web/20020610054821/http://www.sourtim...
Wenn man so etwas laufen lässt, könnte es passieren, dass jemand meine Maschine scannt und mir Dutzende Bug-Bounty-Anfragen schickt, weil dort angeblich „eine bekannte verwundbare Version von X“ läuft.
Mitte der 90er gab es ein Honeypot-Produkt namens CyberCop Sting, das Ballista von Secure Networks vorausging.
CyberCop Sting konnte TCP/UDP-Dienste verschiedener Implementierungen simulieren und, wenn ich mich richtig erinnere, auch das Verhalten des TCP/IP-Stacks so konfigurieren, dass es wie unterschiedliche Betriebssysteme aussah. Für vor fast 30 Jahren war das ziemlich innovativ.
[1] https://theswissbay.ch/pdf/Gentoomen%20Library/Security/0321...
[2] https://news.ycombinator.com/item?id=26440139
Natürlich ist es etwas, das wohl irgendjemand gemacht haben dürfte; trotzdem finde ich es ein wenig überraschend, dass es mir vorher nie in den Sinn gekommen ist, und noch überraschender, dass ich von dieser Idee zum ersten Mal höre.
Ich vermute, dass das am Ende dazu führt, dass Hacker oder Bots den Server genauer untersuchen oder zumindest mehr Traffic darauf landet.
Ich glaube nicht, dass die meisten Script Kiddies in ihren Tools potenzielle Honeypots oder solche Vorrichtungen herausfiltern.
Aber nachdem man weiß, dass der Host lebt, ist die Frage, welchen Port man anfasst. Wenn man annimmt, dass die Kosten fürs Scannen oder Angreifen jedes Ports auf jedem Server ähnlich sind, ist es selbst dann, wenn man gespoofte Ports erkennen kann, besser, eine andere Maschine mit höherer Erfolgswahrscheinlichkeit zu suchen. Man könnte portspoof lokal auf 127.0.0.35 laufen lassen, um Antwortdaten oder Timing-Unterschiede zu vergleichen, aber der Suchraum wird plötzlich etwa 5000-mal größer als die wenigen Ports, die normalerweise offen sind, und Ports auf anderen Servern könnten erfolgversprechender wirken.
Die meisten Tools berücksichtigen nicht den Fall, dass alle Ports offen sind und dadurch False Positives entstehen. Bei Penetrationstests ist das eine häufige Situation und kann Zeit verschwenden, aber ich möchte Angreifern keinen Grund geben, sich meine Infrastruktur genauer anzusehen. Ich bevorzuge eher Port Knocking, also fast das genaue Gegenteil dieses Ansatzes.
Gegen breit angelegte Angriffe müsste es auf zig Millionen Hosts verteilt sein, um eine gewisse Wirkung zu haben; erst dann würde es für Angreifer unpraktisch, nur Honeypots zu finden und mit ihnen zu interagieren. Bei einem gezielten Angriff auf ein bestimmtes Ziel kann es zwar etwas verzögern, weil der Angreifer versucht, Honeypot-Ports auszunutzen, aber wenn man einen verwundbaren Dienst betreibt, wird man am Ende trotzdem kompromittiert. Und wenn man Anbieter ist, muss man unter Umständen sehr lästige Sicherheitsfragebögen beantworten, wenn das Sicherheitsteam eines potenziellen Kunden scannt.
Ich mache auf meiner Website etwas Ähnliches. https://bini.wales gibt für alle Endpunkte 200 zurück und protokolliert alle Versuche, wodurch es zu einem ganz brauchbaren Honeypot gegen automatisierte Angriffe wird.
Meistens fängt es Massen-Scans nach verwundbaren WordPress-Plugins oder zurückgelassenen Backdoors ab. Ähnlich imitiert https://varun.ch/login eine WordPress-Seite mit einem kleinen Twist.
Gut. Ich bin froh, dass das Wort „Honeypot“ kein einziges Mal vorkam.
Ich habe früher einmal einen „echten“ Honeypot geerbt und mir angesehen: Es waren etwa 30 Ports offen, und ich sagte tatsächlich laut: „Was ist das denn für ein Mist?“
Man lässt Ports offen, damit Script-Kiddies glauben, sie hätten etwas erreicht, und sich freuen, obwohl es in Wirklichkeit nichts ist. Ein abgeschlossener Honeypot wirkt an dem Punkt nicht besonders honeypot-artig.
Honeypots dienen dazu, Angreifer anzulocken und zu erkennen; üblicherweise werden ihr Verhalten und ihre Muster protokolliert, analysiert oder blockiert. Bei diesem Tool wären mehr Logging-Funktionen als nur iptables schön, und für sich genommen ist es kein Honeypot, aber die Idee ist nicht weit davon entfernt. Dass die GitHub-Seite behauptet, damit werde die „OS-Sicherheit erhöht“, überzeugt mich allerdings überhaupt nicht. Es bietet vielleicht etwas Verschleierung gegen automatisierte Service-Scanner, aber wenn ein MySQL-Server auf 3306 lauscht und ein Angreifer sich mit 3306 verbindet, spricht er immer noch mit MySQL. Ob die restlichen 65534 Ports Müllantworten liefern, ist egal.
Dort steht, dass es „pro laufender Instanz nur an einen TCP-Port bindet“; ich frage mich, wie das funktioniert.
Muss man 65535 Instanzen starten, um alle Ports abzudecken?
Anschließend wird
getsockoptaufgerufen, um herauszufinden, welcher Port ursprünglich gemeint war: https://github.com/drk1wi/portspoof/blob/c3f3c34531c59df229e...Die tatsächlichen Hard Limits oder den Speicherverbrauch kenne ich nicht, aber vermutlich ist Port-Redirect einfacher.
Könnte das potenziell ein DoS-Verstärker sein?
Wenn man passend gefälschte Pakete sendet, kann man dann viele Pakete an die scheinbare Quelladresse zurückschicken lassen?
Bei UDP könnte das wirklich absurd werden.