端口仿真是指一个特定的端口是开放的,可以连接到,但它并不是真正的服务,也无法提供核心功能,仅在连接时模拟类似或相同的问候消息。
端口仿真通常被大公司用来保护网络基础设施,防止服务和漏洞的扫描。简单来说,它会误导端口扫描器,并常常导致扫描尝试时卡住。
在本指南中,我们将安装 PortSpoof 服务,并为除实际使用的服务端口(22、80、443)外的所有端口配置仿真。
当只有三个端口开放,其余端口关闭时,全范围的端口扫描只需几秒钟,任何人都可以通过扫描服务器的 IP 地址来识别可用的服务。
然而,如果我们模拟所有端口的状态——使它们在 1 到 65535 的整个范围内都显示为开放,扫描将需要大约 65,535 秒,相当于约 18 小时。获得的信息几乎没有价值,这将显著增加寻找漏洞的难度。
1. 安装 PortSpoof
apt install git cmake build-essential autoconf automake libtool nano
git clone https://github.com/drk1wi/portspoof.git
cd portspoof
chmod +x configure
./configure --sysconfdir=/etc/
make -j$(nproc)
make install
1.1 创建日志文件
mkdir -p /var/log/portspoof
touch /var/log/portspoof/alerts.log
chmod 644 /var/log/portspoof/alerts.log
1.2 创建服务文件
nano /etc/systemd/system/portspoof.service
内容如下:
[Unit]
Description=Portspoof Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/portspoof \
-c /etc/portspoof.conf \
-p 4444 \
-s /etc/portspoof_signatures \
-d \
-l /var/log/portspoof/alerts.log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
1.3 验证 PortSpoof 二进制文件路径
which portspoof
确保它与服务文件中的路径一致。
1.4 启动服务
systemctl daemon-reexec
systemctl daemon-reload
systemctl enable portspoof
systemctl start portspoof
检查状态:
systemctl status portspoof
1.5 测试设置
telnet <IP 地址> 4444
Trying 89.xx.187.xx...
Connected to 89.xx.187.xx.
Escape character is '^]'.
这表明连接成功。现在需要配置防火墙以重定向其余端口。
2. 安装 iptables 并设置持久规则
apt install iptables iptables-persistent
在 IPv4 和 IPv6 的交互窗口中按“是”。
2.1 设置规则
我们创建了几个规则来排除我们的服务(22、80、443)。根据你的服务进行相应调整。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1:21 -j REDIRECT --to-ports 4444
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 23:79 -j REDIRECT --to-ports 4444
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 81:442 -j REDIRECT --to-ports 4444
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 444:65535 -j REDIRECT --to-ports 4444
添加允许我们服务的规则:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
保存规则以在服务器重启后生效:
netfilter-persistent save
或:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
完成!现在你可以尝试连接到范围内的任何端口并检查其输出。我们使用了 Windows 上的免费端口扫描工具 Advanced Port Scanner。
可以看到,端口根据两个配置文件返回问候消息:
- portspoof.conf - 列出特定端口及其响应。你可以添加端口和响应,或者为空响应,指定端口号和 ""。
- portspoof_signatures - 包含未在配置文件中列出的所有端口的签名信息。
响应(横幅)来自这两个配置文件。
编辑文件后,只需重启服务:
systemctl restart portspoof
每个端口都有自己的响应。如果扫描未及时停止,程序可能会因端口数量过多而挂起。
特定端口的响应可以掩盖操作系统,导致扫描器将服务器误认为是路由器甚至打印机。
3. 附加步骤
要禁用端口问候消息,请将签名文件替换为空文件:
mv /etc/portspoof_signatures /etc/portspoof_signatures_orig
touch /etc/portspoof_signatures
在 EOF 前添加新行,否则服务无法启动:
printf "\n" > /etc/portspoof_signatures
重启服务:
systemctl restart portspoof
现在,未在 portspoof.conf 中明确指定的端口将返回空响应。要对所有端口应用此设置,请注释掉 portspoof.conf 中的相关行并重启服务。
对于大量端口来说,空响应是更好的解决方案,因为它避免了泄露哪个服务响应的信息。
然而,如果你的目标是伪装设备,端口响应很重要,但对所有端口都这样做太明显了。
成功连接后,连接会断开。要扫描大范围的端口,最好使用 nmap 工具。
4. 使用 nmap 进行端口扫描
apt install nmap
4.1 基本扫描
nmap -p 1-65535 <IP 地址>
4.2 更快的扫描
nmap -p 1-65535 -T4 <IP 地址>
4.3 显示服务信息
nmap -p 1-65535 -sV <IP 地址>
4.4 将结果保存到文件
nmap -p 1-65535 -oN result.txt <IP 地址>