重新端口可用于主动探测防火墙以枚举传出或传入阻止规则。正确使用它,您将能够获取防火墙的配置。
我开发它主要是为了帮助我解决我目前正在开发的分布式网络扫描仪的问题。
这段代码只是一个 PCAP 解析器,这意味着您必须为其提供正确获取的网络数据包转储才能使其正常工作。然后,该工具将打印出(根据 PCAP)被防火墙阻止的端口。
为了使用它,您至少需要访问两台机器。一个位于您要测试的防火墙后面,另一个位于另一侧。
有两种可能的用例:
您将需要 tcpdump、tshark 或wireshark 等工具来捕获和保存网络流量(或任何其他嗅探器),以及 nmap 或 Masscan 等工具来制作和发送探测数据包。在下面的示例中,我将使用masscan和tcpdump。
如果外部计算机前面还有一个防火墙(而不是您要测试的防火墙后面的防火墙),最好了解什么是就地规则。但这不是强制性的,您仍然可以通过从不同位置进行更多测试来找出答案。
遵循以下步骤将帮助您获得准确的结果。
假设我们想要枚举传出规则,因为我们计划稍后在该计算机上运行网络扫描仪,因此我们希望确保我们的出口防火墙不会阻止任何传出流量。
防火墙后面的机器的 IP 地址为aaaa
而外部机器的 IP 地址为bbbb
。第二台机器将是我们运行数据包嗅探器(在本例中为tcpdump
)的机器,也是我们要配置的第一台机器。
投射式电容采集
我们需要在这里启动一个数据包嗅探器,以便查看哪些探测数据包不会到达目的地。考虑到该机器具有与网络接口eth0
关联的公共 IP bbbb
,并且没有运行防火墙。我们运行 tcpdump 如下
tcpdump -ni eth0 -w re-port.pcap src host a.a.a.a
将生成一个文件re-port.pcap
,在我们完成测试后,该文件就是我们将传递给该工具的文件。但我们稍后会看到这部分。
探测流量
我们将从防火墙后面的机器生成 65535 个SYN
数据包并将它们发送到bbbb
。
为此,我使用masscan
。它允许我们使用--rate
选项设置速率,并使用--retries
选项设置每个指定端口的数据包数量。这两个选项对我们来说都很重要,因为我们必须确保所有可以到达目的地的数据包都会到达目的地。根据您在源/目标数据包上拥有的带宽,可能会由于发送高速率而丢失。对于这个测试,我们需要缓慢而安全地进行。在意大利,我们有一句谚语:走得慢,走得远,这对我来说似乎很合适。
masscan -Pn -n -p 1-65535 --wait 5 -e eth0 --rate 350 --retries 2 --open b.b.b.b
通过一些测试,我发现每个端口每秒发送 350 个数据包两次,总计 131072 (128k) 个数据包,大约需要 9 分钟而不丢失数据包。
枚举防火墙规则
此时我们可以使用Re-port
来获取关闭端口的列表。返回到第一台计算机,停止数据包嗅探器CTRL+C
并将re-port.pcap
复制到拥有 Re-port 工具的目录。您现在可以按如下方式运行它:
./enumerate.py re-port.pcap
前面的示例枚举了 TCP 阻止规则。如果您想要所有被阻止的 UDP 端口的列表,请按照上述步骤更改命令,如下所示:
# Machine with b.b.b.b IP
tcpdump -ni eth0 -w re-port.pcap src host a.a.a.a
# Machine with a.a.a.a IP
masscan -Pn -n -p U:1-65535 --wait 5 -e eth0 --rate 350 --retries 2 --open b.b.b.b
# Re-port
./enumerate.py re-port.pcap --udp
运行 ./enumerate.py --help 显示所有选项
$./enumerate.py --help
usage: enumerate.py [-h] [--address ADDRESS] [--open] [--version] [-u] [-v] pcap
Re-port is a tool to actively enumerate firewall rules.
positional arguments:
pcap PCAP dump of receiving scan traffic
optional arguments:
-h, --help show this help message and exit
--address ADDRESS scanners's IP address. If unset, all the packets in the
PCAP will be used to enumerate closed ports
--open print open ports instead of closed ones
--version show program's version number and exit
-u, --udp search for UDP open ports instead of TCP
-v, --verbose increase output verbosity
Report 是一个Python 类,您可以根据需要使用/扩展它。
它是可迭代的,您可以在with
语句中使用它。
with Report('dump.pcap') as r:
r.enumerate_ports('tcp', '127.0.0.1')
r.print_ports()
或者
r = Report('dump.pcap')
r.enumerate_ports('tcp', '127.0.0.1')
for port in r:
print('Open %d' % port)
@r4d10n:这个工具背后的简单想法。