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扫描, 二进制发布, 互联网扫描, 原始套接字, 可视化仪表盘, 实时处理, 客户端加密, 密码管理, 开源工具, 异步数据包, 插件系统, 数据统计, 服务器安全, 端口扫描, 网络协议分析, 网络发现, 网络安全工具, 网络资产测绘