sfan5/fi6s

GitHub: sfan5/fi6s

fi6s 是一个专为互联网规模 IPv6 网络发现设计的快速端口扫描器,通过异步原始数据包处理实现高速扫描。

Stars: 179 | Forks: 26

# fi6s:快速的 IPv6 扫描器 fi6s 是一个 IPv6 端口扫描器,旨在实现快速扫描,主要用于互联网扫描和发现。 这是通过异步发送和处理原始数据包来实现的。 其设计和目标与 [Masscan](https://github.com/robertdavidgraham/masscan) 非常相似, 尽管功能没有那么全面。 请注意查看本项目的[许可证](./LICENSE)。 最后声明:这是一个安全研究工具,您(用户)在使用时 必须全权负责遵守当地法规并在必要时获得相关许可。 ## 编译 在任何最新的 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 ``` 这个示例将会: * 扫描 `2001:db8::/120` 子网,即总共 256 个 IP * 扫描 TCP 端口 80 以及 8000 到 8100,即总共 102 个端口 * 每秒最多发送 170 个数据包 * 将扫描结果以 "`list`" 格式输出到标准输出(隐式默认) 还有更多指定扫描地址范围的不同方法。 如果你不确定接下来会发生什么,可以使用 `--print-summary` 来快速获取扫描的概览,或者使用 `--print-hosts` 来打印所有潜在的目标 IP。 有关更多高级功能和额外说明,请查阅 `fi6s --help` 的输出。 ## 收集 banners 远程主机在响应新连接或探测请求时发送的数据称为“banner”。fi6s 让收集它们变得非常简单。 你需要做的就是传入 `--banners` 选项: ``` # ./fi6s -p 22 --banners 2001:db8::xx ``` ### UDP 在你的命令行中添加 `--udp` 标志: ``` # ./fi6s -p 53 --banners --udp 2001:db8:xx::1 ``` 请注意,与 TCP 不同的是,只有当你扫描的端口协议受到 fi6s 探测支持时, 你才能获得有用(或任何)的结果。 请使用 `fi6s --list-protocols` 来查看支持列表。 ### 源端口和 IP 协议栈 由于 fi6s 自带了最小化的 TCP/IP 协议栈,因此必须阻止操作系统尝试在 fi6s 使用的同一端口上进行 TCP 通信,否则会破坏扫描过程。 默认情况下,fi6s 会要求操作系统保留一个临时端口,并在整个扫描期间使用它。这仅在 Linux 上有效。 如果此操作失败,或者你使用的是其他平台(*fi6s 会提示你!*), 你必须选定一个源端口,并配置防火墙以丢弃该端口上的所有流量,例如: ``` # ipfw add 1000 deny tcp from any to any 12345 in ip6 or: # ip6tables -A INPUT -p tcp -m tcp --dport 12345 -j DROP and then: # ./fi6s -p 22 --banners --source-port 12345 2001:db8::xx ``` 由于 UDP 是无连接的,因此无需执行此操作,但这仍然是防止发送不必要的 ICMPv6 响应的一个好习惯。 fi6s 默认也会这么做。 ### 选择源 IP IPv6 的一个巨大优势是地址空间非常大,避免上述问题的另一种方法就是直接使用不同的源 IP。 此 IP 不应分配给你的本地机器,但它**必须**静态路由到你的机器,因为 fi6s 不会响应 NDP 查询。 要检查你的设置是否正常工作,你可以直接 ping 一个已知的公共 IP,例如: ``` # ./fi6s --icmp --source-ip ${chosen_src_ip} 2001:4860:4860::8888 ``` ## ICMP 使用 `--icmp` 执行 ICMPv6 Ping 扫描: ``` # ./fi6s --icmp 2001:xxx0::1 ``` 往返时间将不会被测量。 ## 限制 为了支持 fi6s 的设计,对网络环境做出了一些假设。这些假设完全不会影响典型使用,但为了完整性,在此一并列出。 这意味着在以下情况下,fi6s 可能无法按预期执行,甚至完全无法工作: * 你拥有一个非平凡的路由表 - 它将被忽略。fi6s 期望只有一个网关 * 你正在扫描本地网络中的目标 - fi6s 不进行邻居发现 * 你拥有一个带连接跟踪的防火墙(无论是 iptables 还是外部设备) - 它很可能会被大量的“连接”所淹没 * 你的主机或网关的 IP 或 MAC 在扫描中途发生更改 ¯\\\_(ツ)_/¯ * 你的网络存在持续的丢包 * 目标使用了任何 IPv6 扩展报头(包括分片) 关于 banner 收集,请注意 fi6s 并没有配备类似于真正 TCP 协议栈的功能。 它仅支持发送一个查询并读取随后的响应数据。 未实现重发或窗口逻辑。 ### 被扫描 IP 与响应 IP 虽然 fi6s 使用端口和序列号来确保你获得的结果与当前具体的扫描相关,但它**没有**检查探测发送的目标 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`,这是默认设置)远非完美。 它将会: * 以 8192 个为一批随机打乱 IP * 在扫描期间均匀分布多个目标(类似轮询调度) * 然而仍然会*按顺序*遍历子网 例如,如果你扫描 `3fff::/108`,`3fff::1`、`3fff::20` 和 `3fff::300` 的顺序将是随机的。 但是 `3fff::0:*` 中的所有地址都会在 `3fff::1:*` 之前被扫描,然后是 `3fff::2:*`,以此类推。
标签:Banner抓取, DNS枚举, IPv6, Masscan替代, Maven构建, PowerShell, TCP扫描, 二进制发布, 互联网扫描, 原始套接字, 可视化仪表盘, 实时处理, 客户端加密, 密码管理, 开源工具, 异步数据包, 插件系统, 数据统计, 服务器安全, 端口扫描, 网络协议分析, 网络发现, 网络安全工具, 网络资产测绘