Portspoof 在所有 65535 个 TCP 端口上模拟开放端口和服务指纹,将侦查阶段从快速扫描转变为一个漫长且资源密集的过程。扫描器会看到数千个令人信服但虚假的服务,使得识别真实攻击面变得不切实际。
Portspoof 的主要目标是让攻击者的侦查过程变得缓慢、代价高昂且不可靠。与标准的 5 秒 Nmap 扫描就能映射系统上每个真实服务不同,面对 Portspoof 的攻击者会看到 65535 个开放端口,每个看起来都像一个不同的合法服务。没有快速的方法来判断哪些是真实的。
SYN+ACK。nmap -sV -p-)将远超实际可行限制。示例 Nmap 扫描:
$ 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 会使用基于海量正则表达式数据库动态生成的、有效的签名来响应服务探测。因此,攻击者将无法确定你的系统真正使用了哪些端口号。
示例版本扫描(端口 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?
结合这些技术意味着:
nmap -sV -p-)需要 10 小时以上,并生成数百兆字节的伪造数据。真实服务(SSH、SMTP、FTP、HTTP)会发送一个横幅并保持连接打开,等待客户端输入。令人信服的模拟意味着做同样的事情:接受、发送、保持。但每个客户端一个线程的模型会消耗内存和 CPU 进行上下文切换,而且在大规模情况下,防御者的资源会在攻击者失去耐心之前耗尽。这种欺骗工具变成了一个自我 DOS 的向量。
方法: 一个单线程的 epoll 事件循环。每个端口在启动时被分配一个交付模式:有的立即推送横幅,有的等待客户端发送数据后才响应,还有的保持静默。保持时间跨数量级分布(几十毫秒到几分钟),并带有每连接抖动,因此对同一端口的重复探测不会返回相同的时序。
这一点很重要,因为如果没有它,攻击者可以向每个端口发送垃圾数据并测量响应时间:真实服务会快速关闭(错误协议),而天真的诱捕会保持数秒。通过混合模式和较宽的时序分布,数千个虚假端口也会在真实服务的相同范围内关闭。没有清晰的阈值可供过滤。
这种经济性源于不对称性:
每个端口的交付模式在进程生命周期内固定,但重启后不可预测。保持时间具有每连接随机分量,因此重复探测会显示自然变化,类似于负载下的真实服务。
v2.0 取代了原有的“横幅后关闭”行为,该行为容易受到连接关闭绕过的影响(参见 Vicarius/Hored1971 的博客文章)。诱捕引擎使用混合时序保持所有连接打开,从而击败了连接关闭过滤、时序指纹、横幅分析和统计模式建模。
确保已安装 C++ 编译器和 CMake(3.10+)。
mkdir build && cd build
cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc ..
make
sudo make install
Portspoof 在用户空间运行,但依赖系统防火墙规则来拦截发往其他端口的流量。
将所有传入 TCP 流量(端口 1-65535)重定向到 Portspoof 端口(默认 4444)。
Linux(iptables):
# 首先排除真实服务,然后将其余流量重定向到 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
注意:将 eth0 替换为你的网络接口。为每个运行真实服务的端口添加一条 RETURN 规则。
要使其持久化,你可以保存 iptables 规则,或使用 system_files 目录中提供的 iptables-config。
你可以使用 system_files/init.d/ 中的示例将 Portspoof 添加到启动脚本中。
此模式生成并向端口扫描器提供虚假的服务签名。
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
使用自定义诱捕时间(保持每个连接 10 到 60 秒):
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
此模式仅对每个连接尝试返回 OPEN 状态,而不发送服务横幅。连接仍会被诱捕。
portspoof -D
Portspoof 可用于通过发送随机或基于词表的载荷来模糊测试扫描工具。
使用内部生成器进行模糊测试:
# 生成随机大小的随机载荷
portspoof -1 -v
使用词表进行模糊测试:
portspoof -f payloads.txt -v
上面的基本 REDIRECT 规则有效,但激进的扫描器仍可能试图用连接压垮 Portspoof。以下规则集增加了速率限制,并自动禁止超过连接阈值的主机。托管真实服务(此例中为 SSH)的端口不被重定向,但仍受全局禁止规则保护。
# --- NAT:排除真实服务后重定向所有流量 ---
# 为你实际使用的每个端口(SSH、HTTP 等)添加一条 RETURN 规则
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 4444
# --- FILTER:深度防御 ---
# 允许环回(关键:防止破坏本地服务)
iptables -A INPUT -i lo -j ACCEPT
# 如果该 IP 被标记为滥用,丢弃所有数据包(静默,不发送 RST)
iptables -A INPUT -m recent --name PORTSCAN --rcheck --seconds 60 -j DROP
# 限制每个源 IP 的新 SYN 速率
iptables -A INPUT -p tcp --syn -m hashlimit \
--hashlimit-above 10/sec --hashlimit-burst 30 \
--hashlimit-mode srcip --hashlimit-name syn_throttle -j DROP
# 如果单个 IP 与 portspoof 保持 100+ 连接,标记并丢弃
iptables -A INPUT -p tcp --syn --dport 4444 -m connlimit \
--connlimit-above 100 --connlimit-mask 32 \
-m recent --name PORTSCAN --set -j DROP
# 允许已建立的流量和新连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --syn -j ACCEPT
iptables -A INPUT -j DROP
对于高流量部署,增加 xt_recent 列表大小:
echo "options xt_recent ip_list_tot=10000" > /etc/modprobe.d/xt_recent.conf
并调整内核连接跟踪:
sysctl -w net.netfilter.nf_conntrack_max=131072
sysctl -w net.core.somaxconn=4096
Portspoof Pro 将欺骗从单个主机扩展到整个网络。单个传感器即可模拟整个 /16 网络:数千个 IP,每个 IP 在所有端口上拥有独特的服务,并保持有状态的多步骤会话。
作者: Piotr Duszyński(@drk1wi)
许可: GNU 通用公共许可证 v2.0(GPLv2)。详情请参见 LICENSE 文件。
如需商业合法应用,请联系作者获取适当的许可安排。
如果你遇到任何错误或有功能请求,请在 GitHub Issue Tracker 上报告,或通过电子邮件 piotr [at] duszynski.eu 联系作者。