fi6s 是一款旨在快速运行的 IPv6 端口扫描器,面向互联网扫描与发现。它通过异步发送和处理原始数据包来实现这一目标。
其设计与目标与 Masscan 非常相似,但功能不如其全面。
请注意 许可证。
最后:这是一款安全研究工具,您(用户)有全部责任在使用时遵守当地法规并在必要时获得许可。
在任何较新的 Linux 系统上构建 fi6s 都非常简单,例如在 Ubuntu 上:
# apt install gcc make git libpcap-dev
$ git clone https://github.com/sfan5/fi6s.git
$ cd fi6s
$ make BUILD_TYPE=release
可执行文件将生成在 ./fi6s。
请注意,fi6s 仅在 Linux 上进行开发与测试。其他类 UNIX 平台应该可以工作,但 Windows 不行。
fi6s 会自动检测脏网络细节(源、路由器 MAC 和 IP),因此您可以立即开始扫描:
# ./fi6s -p 80,8000-8100 --max-rate 170 2001:db8::/120
此示例将:
list" 格式(隐式默认)输出扫描结果至标准输出还有多种不同的方式来指定要扫描的地址范围。如果您不确定将要发生什么,可以使用 --print-summary 快速查看扫描概览,或使用 --print-hosts 打印所有潜在目标 IP。
有关更高级的功能和更多说明,请查阅 fi6s --help 的输出来。
远程主机在响应新连接或探测请求时发送的数据称为“横幅”。fi6s 可以轻松收集它们。
您只需传递 --banners 选项:
# ./fi6s -p 22 --banners 2001:db8::xx
在命令行中添加 --udp 标志:
# ./fi6s -p 53 --banners --udp 2001:db8:xx::1
请注意,与 TCP 不同,只有扫描的端口协议受 fi6s 探测支持时,您才会获得有意义(或任何)的结果。使用 fi6s --list-protocols 查看列表。
由于 fi6s 自带了一套最简化的 TCP/IP 协议栈,操作系统必须被阻止在 fi6s 使用的同一端口上进行 TCP 通信,否则会破坏扫描过程。
默认情况下,fi6s 会请求操作系统保留一个临时端口,并在扫描期间使用它。这仅在 Linux 上有效。
如果此操作失败,或者您处于其他平台(fi6s 会告诉您!),您必须自行决定一个源端口,并配置防火墙丢弃该端口上的所有流量,例如:
# ipfw add 1000 deny tcp from any to any 12345 in ip6
或者:
# ip6tables -A INPUT -p tcp -m tcp --dport 12345 -j DROP
然后:
# ./fi6s -p 22 --banners --source-port 12345 2001:db8::xx
由于 UDP 是无连接的,因此无需执行此操作,但防止发送不必要的 ICMPv6 响应仍然是一个好主意。fi6s 默认也会这样做。
IPv6 的一大优势在于其巨大的地址空间,另一种避免上述问题的方法是直接使用不同的源 IP。
此 IP 不应分配给本地机器,但它必须通过静态路由指向您的机器,因为 fi6s 不会回应 NDP 查询。
要检查您的设置是否正常工作,您可以简单地 ping 一个已知的公网 IP,例如:
# ./fi6s --icmp --source-ip ${chosen_src_ip} 2001:4860:4860::8888
使用 --icmp 进行 ICMPv6 Ping 扫描:
# ./fi6s --icmp 2001:xxx0::1
不会测量往返时间。
为了允许 fi6s 的设计,必须对网络环境做出一些假设。这些假设不会影响典型使用,但为了完整性列举在此。
这意味着 fi6s 可能无法按预期工作或完全无法工作,如果:
对于横幅收集,请注意 fi6s 并未提供类似于真正 TCP 协议栈的功能。它仅支持发送一次查询并读取后续的响应数据。重传或窗口逻辑未实现。
虽然 fi6s 使用端口和序列号来确保您获得的结果与当前运行的扫描相关,但它没有进行 IP 比较,以验证探测发送到的 IP 与实际响应的 IP 是否一致。
这意味着在扫描期间运行例如任何类型的 traceroute 不会干扰扫描结果。
然而,如果某个扫描目标使用不同的 IP 进行回复,那么有可能一个不在输入列表中的 IP 会出现在扫描结果中。这一特性在实践中可能有用,因为一些路由器会在零网络地址上接受 SNMP 或 DNS 查询,但会使用其主要 IPv6 地址进行应答。
示例:扫描 3fff:1234:1234:44xx:: -> 收到来自 3fff:1234:1234:44a3:e2a:86ff:fe12:3456 的响应
fi6s 随机化扫描 IP 的方式(--randomize-hosts 1,默认值)远非完美。
它会:
例如,如果您扫描 3fff::/108,则 3fff::1、3fff::20 和 3fff::300 的顺序将是随机的。但 3fff::0:* 中的所有地址将在 3fff::1:* 之前扫描,然后才是 3fff::2:*,依此类推。