
Emuliert offene Ports und Dienstsignaturen über alle 65535 TCP-Ports, um Aufklärung zu verlangsamen, Scanner zu verwirren und Angreiferressourcen mit überzeugenden Fake-Diensten und Tarpitting zu verschwenden.
Portspoof emuliert offene Ports und Dienst-Signaturen über alle 65535 TCP-Ports und verwandelt die Aufklärungsphase von einem schnellen Scan in einen langen, ressourcenintensiven Prozess. Scanner sehen tausende überzeugender, aber gefälschter Dienste, sodass es unpraktikabel wird, die tatsächliche Angriffsfläche zu identifizieren.
Das Hauptziel von Portspoof ist es, die Aufklärung für Angreifer langsam, kostspielig und unzuverlässig zu machen. Anstelle eines standardmäßigen 5-Sekunden-Nmap-Scans, der jeden tatsächlichen Dienst auf einem System kartiert, sieht ein Angreifer, der Portspoof gegenübersteht, 65535 offene Ports, von denen jeder wie ein anderer legitimer Dienst aussieht. Es gibt keine schnelle Möglichkeit zu erkennen, welche echt sind.
SYN+ACK zurück.nmap -sV -p-) überschreitet bei weitem die praktischen Grenzen.Beispiel Nmap-Scan:
$ nmap -p 1-20 target
Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for target
Host is up (0.00016s latency).
PORT STATE SERVICE
1/tcp open tcpmux
2/tcp open compressnet
3/tcp open compressnet
4/tcp open unknown
5/tcp open rje
6/tcp open unknown
7/tcp open echo
8/tcp open unknown
9/tcp open discard
10/tcp open unknown
11/tcp open systat
12/tcp open unknown
13/tcp open daytime
14/tcp open unknown
15/tcp open netstat
16/tcp open unknown
17/tcp open qotd
18/tcp open unknown
19/tcp open chargen
20/tcp open ftp-data
Portspoof antwortet auf Dienst-Sondierungen mit gültigen, dynamisch generierten Signaturen, die auf einer massiven Datenbank regulärer Ausdrücke basieren. Dadurch kann ein Angreifer nicht mehr feststellen, welche Portnummern Ihr System tatsächlich verwendet.
Beispiel Versionsscan (Ports 1–100):
$ nmap -sV -p 1-100 target
Nmap scan report for target
Host is up (0.00016s latency).
PORT STATE SERVICE VERSION
1/tcp open tcpmux?
2/tcp open irc ircu ircd
3/tcp open tcpwrapped
5/tcp open http Polycom CMA Global Address Book (GAB) httpd
10/tcp open http PGP Universal httpd
11/tcp open http SnapStream Media Beyond TV PVR http config
12/tcp open pop3 Novell GroupWise pop3d
13/tcp open http micro_httpd
15/tcp open ssh OpenSSH r (protocol 8; NCSA GSSAPI authentication patch)
16/tcp open ftp QMS/Minolta Magicolor 2200 DeskLaser printer ftpd
17/tcp open smtp Network Box smtpd
21/tcp open ftp?
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
23/tcp open tcpwrapped
25/tcp open smtp?
27/tcp open http BMC/Marimba Management http config
37/tcp open http Indy httpd qlRKjiF
39/tcp open pop3
41/tcp open ftp VSE ftpd WhH
43/tcp open imap Scalix imapd 6
46/tcp open telnet AXIS webcam telnetd 96747 (Linux)
49/tcp open smtp Openwave Email Mx smtpd
50/tcp open http 3Ware web interface 3v (RAID storage)
51/tcp open ftp WebStar 4dftp ...
53/tcp open tcpwrapped
55/tcp open webdav Tonido WebDAV
56/tcp open tor-control Tor control port (Authentication required)
59/tcp open irc ircu ircd
60/tcp open rtsp GStreamer rtspd
64/tcp open http BaseHTTPServer CAxoE (Mercurial hg serve; Python LDkW)
66/tcp open telnet Slirp PPP/SLIP-on-terminal emulator telnetd
70/tcp open smtp qpsmtpd
71/tcp open smtp Microsoft Exchange smtpd
73/tcp open http Avaya IP Office VoIP PBX httpd
77/tcp open smtp Zeus SMTPS smtpd
79/tcp open ftp Sambar ftpd
80/tcp open tcpwrapped
81/tcp open imap-proxy nginx imap proxy
82/tcp open ssh (protocol 811)
83/tcp open http peercast.org
88/tcp open csta Alcatel OmniPCX Enterprise
90/tcp open http WASD httpd
91/tcp open http Fortinet FortiGate 50B firewall http config
93/tcp open imap ModusMail imapd 4
98/tcp open ssh Sysax Multi Server sshd 7 (protocol 940)
99/tcp open http 2Wire HomePortal http config 5473
100/tcp open newacct?
Zusammengefasst bedeuten diese Techniken:
nmap -sV -p-) mit den Standard-Tarpit-Einstellungen dauert über 10 Stunden und erzeugt hunderte Megabyte an nutzlosen Daten.Echte Dienste (SSH, SMTP, FTP, HTTP) senden ein Banner und halten die Verbindung offen, während sie auf Eingaben des Clients warten. Eine überzeugende Emulation bedeutet, dasselbe zu tun: akzeptieren, senden, halten. Aber ein Thread-pro-Client-Modell verbraucht Speicher und CPU durch Kontextwechsel, und im großen Maßstab gehen dem Verteidiger die Ressourcen aus, bevor dem Angreifer die Geduld ausgeht. Das Täuschungswerkzeug wird zu einem Selbst-DOS-Vektor.
Der Ansatz: eine single-threaded epoll Ereignisschleife. Jeder Port bekommt beim Start einen Zustellungsmodus zugewiesen: einige senden sofort ein Banner, einige warten, bis der Client Daten sendet, bevor sie antworten, und einige bleiben stumm. Die Haltezeiten sind über Größenordnungen verteilt (Zehntelsekunden bis Minuten) mit einem Jitter pro Verbindung, sodass wiederholte Sondierungen am selben Port nicht die gleiche Zeitmessung zurückgeben.
Das ist wichtig, denn ohne diese Maßnahme kann ein Angreifer Müll an jeden Port senden und die Antwortzeit messen: echte Dienste schließen schnell (falsches Protokoll), während eine naive Tarpit Sekunden lang hält. Mit gemischten Modi und einer breiten zeitlichen Streuung schließen tausende gefälschte Ports ebenfalls im gleichen Bereich wie echte Dienste. Es gibt keine saubere Schwelle, nach der gefiltert werden kann.
Die Ökonomie funktioniert aufgrund der Asymmetrie:
Die Zustellungsmodi pro Port sind für die Lebensdauer des Prozesses festgelegt, aber über Neustarts hinweg unvorhersehbar. Die Haltezeiten haben eine verbindungsspezifische zufällige Komponente, sodass wiederholte Sondierungen eine natürliche Varianz zeigen, ähnlich wie echte Dienste unter Last.
v2.0 ersetzt das ursprüngliche Banner-und-Schließen-Verhalten, das anfällig für einen Verbindungsschluss-Bypass war (siehe Vicarius/Hored1971 Blogbeitrag). Die Tarpit-Engine hält alle Verbindungen mit gemischtem Timing offen und vereitelt Verbindungsschluss-Filterung, Timing-Fingerprinting, Banner-Analyse und statistische Mustererkennung.
Stellen Sie sicher, dass ein C++-Compiler und CMake (3.10+) installiert sind.
mkdir build && cd build
cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc ..
make
sudo make install
Portspoof läuft im Benutzermodus, ist aber auf System-Firewall-Regeln angewiesen, um den für andere Ports bestimmten Datenverkehr abzufangen.
Leiten Sie den gesamten eingehenden TCP-Datenverkehr (Ports 1-65535) auf den Portspoof-Port (Standard 4444) um.
Linux (iptables):
# Exclude real services first, then redirect the rest to Portspoof
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
Hinweis: Ersetzen Sie eth0 durch Ihr Netzwerk-Interface. Fügen Sie für jeden Port, der einen echten Dienst betreibt, eine RETURN-Regel hinzu.
Um dies dauerhaft zu machen, können Sie Ihre iptables-Regeln speichern oder die iptables-config im Verzeichnis system_files verwenden.
Sie können Portspoof zu Ihren Startskripten hinzufügen, indem Sie die Beispiele in system_files/init.d/ verwenden.
Dieser Modus generiert und versorgt Port-Scanner mit gefälschten Dienst-Signaturen.
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
Mit benutzerdefinierten Tarpit-Zeiten (jede Verbindung zwischen 10 und 60 Sekunden halten):
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
Dieser Modus gibt lediglich einen OPEN-Status für jeden Verbindungsversuch zurück, ohne Dienst-Banner zu senden. Verbindungen werden weiterhin tarpitted.
portspoof -D
Portspoof kann verwendet werden, um Scan-Tools zu fuzzen, indem zufällige oder auf Wortlisten basierende Payloads gesendet werden.
Fuzzen mit internem Generator:
# Generates random payloads of random size
portspoof -1 -v
Fuzzen mit einer Wortliste:
portspoof -f payloads.txt -v
Die grundlegende REDIRECT-Regel oben funktioniert, aber ein aggressiver Scanner kann immer noch versuchen, Portspoof mit Verbindungen zu überlasten. Das folgende Regelset fügt Ratenbegrenzung und automatisches Bannen für Hosts hinzu, die die Verbindungsschwelle überschreiten. Ports, die echte Dienste hosten (in diesem Beispiel SSH), werden von der Weiterleitung ausgeschlossen, sind aber weiterhin durch die globale Bann-Regel geschützt.
# --- NAT: redirect everything except real services ---
# add a RETURN rule for each port you actually use (SSH, HTTP, etc.)
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 4444
# --- FILTER: defense in depth ---
# allow loopback (critical: prevents breaking local services)
iptables -A INPUT -i lo -j ACCEPT
# if this IP was flagged as abusive, drop everything (silent, no RST)
iptables -A INPUT -m recent --name PORTSCAN --rcheck --seconds 60 -j DROP
# rate-limit new SYNs per source IP
iptables -A INPUT -p tcp --syn -m hashlimit \
--hashlimit-above 10/sec --hashlimit-burst 30 \
--hashlimit-mode srcip --hashlimit-name syn_throttle -j DROP
# if a single IP holds 100+ connections to portspoof, flag and drop
iptables -A INPUT -p tcp --syn --dport 4444 -m connlimit \
--connlimit-above 100 --connlimit-mask 32 \
-m recent --name PORTSCAN --set -j DROP
# allow established traffic and new connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --syn -j ACCEPT
iptables -A INPUT -j DROP
Für Umgebungen mit hohem Datenverkehr erhöhen Sie die Größe der xt_recent-Liste:
echo "options xt_recent ip_list_tot=10000" > /etc/modprobe.d/xt_recent.conf
Und passen Sie das Kernel-Verbindungs-Tracking an:
sysctl -w net.netfilter.nf_conntrack_max=131072
sysctl -w net.core.somaxconn=4096
Portspoof Pro skaliert die Täuschung von einem einzelnen Host auf ein ganzes Netzwerk. Ein einzelner Sensor emuliert vollständige /16-Netzwerke: Tausende IPs, jede mit einzigartigen Diensten über alle Ports, die zustandsbehaftete mehrstufige Konversationen führen.
Autor: Piotr Duszyński (@drk1wi)
Lizenz: GNU General Public License v2.0 (GPLv2). Siehe die Datei LICENSE für Details.
Für kommerzielle, legitime Anwendungen kontaktieren Sie bitte den Autor für die entsprechenden Lizenzierungsvereinbarungen.
Wenn Sie auf Fehler stoßen oder Funktionswünsche haben, melden Sie diese bitte im GitHub Issue Tracker oder kontaktieren Sie den Autor per E-Mail unter piotr [at] duszynski.eu.