IPBUF/ipbufscan
GitHub: IPBUF/ipbufscan
互联网规模的高速异步端口扫描器,单机每秒可发送千万级数据包,支持 Banner 抓取和多数据库直接输出。
Stars: 1 | Forks: 0
# IPBufScan: 大规模 IP 端口扫描器
版本 1.6.0
这是一个互联网规模的端口扫描器。它可以在 5 分钟内扫描整个互联网,从单台机器上每秒发送 1000 万个数据包。
它的用法(参数、输出)类似于最著名的端口扫描器 `nmap`。
如果有疑问,可以尝试其中的一些功能——支持对多台机器进行广泛扫描的功能都受支持,而对单台机器的深度扫描则不受支持。
在内部,它使用异步传输,类似于 `scanrand`、`unicornscan` 和 `ZMap` 等端口扫描器。它更加灵活,允许任意端口和地址范围。
注意:ipbufscan 使用其自己的**专用 TCP/IP 栈**。除了简单的端口扫描之外的任何操作都可能与本地 TCP/IP 栈发生冲突。这意味着你需要使用 `--src-ip` 选项从不同的 IP 地址运行,或者使用 `--src-port` 配置 ipbufscan 使用哪些源端口,然后配置内部防火墙(如 `pf` 或 `iptables`),将这些端口与操作系统的其他部分隔离。
# 构建
在 Debian/Ubuntu 上,构建过程大致如下。除了 C 编译器(如 `gcc` 或 `clang`)之外,它实际上没有任何依赖。
```
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/ipbuf/ipbufscan.git
cd ipbufscan
make
```
这会将程序放在 `ipbufscan/bin` 子目录中。
要在(Linux 上)安装它,请运行:
```
make install
```
源代码由许多小文件组成,因此使用多线程构建会使构建过程快得多。这在树莓派上需要超过 2G 的内存(并且会崩溃),因此你可能会使用较少的线程数,例如 `-j4`,而不是使用所有可能的线程。
```
make -j
```
虽然 Linux 是主要的目标平台,但该代码在许多其他系统(Windows、Mac OS X 等)上也能很好地运行。以下是一些额外的构建信息:
* 带 Visual Studio 的 Windows:使用 VS10 项目
* 带 MingGW 的 Windows:只需键入 `make`
* 带 cygwin 的 Windows:无法工作
* 带 XCode 的 Mac OS X:使用 XCode4 项目
* 带命令行的 Mac OS X:只需键入 `make`
* FreeBSD:键入 `gmake`
* 其他:尝试将所有文件编译在一起,`cc src/*.c -o bin/ipbufscan`
在 macOS 上,x86 二进制文件在 ARM 模拟下运行得一样快。
# 用法
用法类似于 `nmap`。要扫描某个网段的多个端口:
```
# ipbufscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
```
这将会:
* 扫描 `10.x.x.x` 子网和 `2603:3001:2d00:da00::x` 子网
* 在这两个子网上扫描端口 80 和 8000 到 8100 的范围,共计 102 个端口
* 将输出打印到 ``,可重定向到文件
要查看完整的选项列表,请使用 `--echo` 功能。这会转储当前配置并退出。此输出可用作程序再次输入:
```
# ipbufscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# ipbufscan -c xxx.conf --rate 1000
```
## Banner 检查
Ipbufscan 不仅能检测端口是否开放。它还可以完成 TCP 连接,并与该端口上的应用程序进行交互,以获取简单的“banner”信息。
Ipbufscan 支持以下协议的 banner 检查:
* FTP
* HTTP
* IMAP4
* memcached
* POP3
* SMTP
* SSH
* SSL
* SMBv1
* SMBv2
* Telnet
* RDP
* VNC
* Redis
* MySQL
* MSSQL
问题在于 ipbufscan 包含自己独立的 TCP/IP 栈,与运行它的系统相分离。当本地系统收到来自被探测目标的 SYN-ACK 时,它会响应一个 RST 数据包,在 ipbufscan 获取 banner 之前就终止了连接。
防止这种情况的最简单方法是为 ipbufscan 分配一个单独的 IP 地址。类似于以下示例之一:
```
# ipbufscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# ipbufscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
```
你选择的地址必须位于本地子网中,且未被其他系统使用。Ipbufscan 会警告你犯了错误,但你可能已经干扰了另一台机器的通信达数分钟之久,所以要小心。
在某些情况下(例如 WiFi),这是不可能的。在这些情况下,你可以对 ipbufscan 使用的端口设置防火墙。这可以防止本地 TCP/IP 栈看到数据包,但 ipbufscan 仍然能看到它,因为它绕过了本地协议栈。对于 Linux,类似于这样:
```
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# ipbufscan 10.0.0.0/8 -p80 --banners --source-port 61000
```
你可能希望选择与 Linux 可能选择作为源端口不冲突的端口。你可以通过查看以下文件来了解 Linux 使用的范围,并重新配置该范围:
```
/proc/sys/ipv4/ip_local_port_range
```
在最新版本的 Kali Linux(2018 年 8 月)上,该范围是 32768 到 60999,因此你应该选择低于 32768 或 61000 及以上的端口。
设置 `iptables` 规则只能维持到下次重新启动。你需要查找如何根据你的发行版(例如使用 `iptables-save` 和/或 `iptables-persistent`)保存配置。
在 Mac OS X 和 BSD 上,也有类似的步骤。要找出应避免的范围,请使用类似以下的命令:
```
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
```
在 FreeBSD 和较旧的 MacOS 上,使用 `ipfw` 命令:
```
# sudo ipfw add 1 deny tcp from any to any 40000 in
# ipbufscan 10.0.0.0/8 -p80 --banners --source-port 40000
```
在较新的 MacOS 和 OpenBSD 上,使用 `pf` 包过滤实用程序。
编辑文件 `/etc/pf.conf` 以添加类似以下的行:
```
block in proto tcp from any to any port 40000
```
然后要启用防火墙,请运行命令:
```
# pfctl -E
```
如果防火墙已经在运行,那么要么重新启动,要么使用以下命令重新加载规则:
```
# pfctl -f /etc/pf.conf
```
Windows 不会响应 RST 数据包,因此这些技术都不是必需的。然而,ipbufscan 在使用其自身的 IP 地址时仍然设计得最好,因此在可能的情况下,即使不是绝对必要,你也应该以这种方式运行。
对于其他检查,例如 `--heartbleed` 检查(这只是 banner 检查的一种形式),也需要同样的操作。
## 如何扫描整个互联网
虽然该程序对于较小的内部网络很有用,但它实际上是为整个互联网而设计的。看起来可能像这样:
```
# ipbufscan 0.0.0.0/0 -p0-65535
```
扫描整个互联网是不好的。一方面,互联网的部分区域对被扫描反应很差。另一方面,某些站点会跟踪扫描并将你添加到禁止列表中,这会使你被互联网中有用的部分防火墙隔离。
因此,你要排除大量的范围。要拉黑或排除范围,你需要使用以下语法:
```
# ipbufscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
```
这只会将结果打印到命令行。你可能希望将它们保存到文件中。因此,你需要类似这样的操作:
```
# ipbufscan 0.0.0.0/0 -p0-65535 -oX scan.xml
```
这会将结果保存在 XML 文件中,让你可以轻松地将结果转储到数据库或其他地方。
但是,这只能以默认的 100 数据包/秒的速率进行,这将花费无尽的时间来扫描互联网。你需要像这样提高速度:
```
# ipbufscan 0.0.0.0/0 -p0-65535 --max-rate 100000
```
这会将速率提高到 100,000 数据包/秒,这大约可以在 10 小时内扫描整个互联网(减去排除部分)(或者,如果扫描所有端口,则需要 655,360 小时)。
关于这个命令行需要注意的一点是,它们都是兼容 `nmap` 的选项。此外,兼容 `nmap` 的“隐形”选项也会为你设置:`-sS -Pn -n --randomize-hosts --send-eth`。同样,XML 文件的格式也受到了 `nmap` 的启发。当然,还是有很多差异的,因为程序的*异步*特性导致了解决该问题的根本不同方法。
上面的命令行有点麻烦。除了将所有内容都放在命令行上之外,还可以将其存储在文件中。上述设置如下所示:
```
# 我的扫描
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
```
要使用此配置文件,请使用 `-c`:
```
# ipbufscan -c myscan.conf
```
这也会让重复扫描时的事情变得更容易。
默认情况下,ipbufscan 首先加载配置文件 `/etc/ipbufscan/ipbufscan.conf`。任何后续的配置参数都会覆盖此默认配置文件中的内容。这就是我放置“excludefile”参数的地方,这样我就永远不会忘记它。它会自动工作。
## 获取输出
默认情况下,ipbufscan 会生成相当大的文本文件,但很容易将它们转换为任何其他格式。支持多种输出格式:
1. **xml**:只需使用参数 `-oX `。
或者,使用参数 `--output-format xml` 和 `--output-filename `。
2. **binary**:这是 ipbufscan 的内置格式。它生成的文件要小得多,这样当我扫描互联网时,我的磁盘就不会被填满。但是,它们需要被解析。命令行选项 `--readscan` 将读取二进制扫描文件。
将 `--readscan` 与 `-oX` 选项一起使用将生成结果文件的 XML 版本。
3. **grepable**:这是 Nmap -oG
输出的实现,可以通过命令行工具轻松解析。只需使用参数 `-oG `。或者,使用参数 `--output-format grepable` 和 `--output-filename `。
4. **json**:这将保存 JSON 格式的结果。只需使用参数 `-oJ `。或者,使用参数 `--output-format json` 和 `--output-filename `。
5. **ndjson**:用于流式输出的换行符分隔的 JSON 格式。
使用参数 `--output-format ndjson` 和 `--output-filename `。
6. **list**:这是一个简单的列表,每行包含一对主机和端口。
只需使用参数 `-oL `。或者,使用参数 `--output-format list` 和 `--output-filename `。格式为:
open tcp 80 XXX.XXX.XXX.XXX 1390380064
7. **html**:用于在浏览器中查看扫描结果的 HTML 报告格式。
## 数据库输出支持
IPBufScan 支持将扫描结果直接输出到 SQL 数据库和 Redis。
### 支持的数据库
- **MySQL** - 企业级数据库服务器
- **MSSQL** - Microsoft SQL Server
- **SQLite** - 轻量级基于文件的数据库(无外部依赖)
- **Redis** - 内存数据存储 (tcp/6379)
### 配置
通过 URL 字符串格式进行数据库连接:
- MySQL: `mysql://user:pass@host:port/db`
- MSSQL: `mssql://user:pass@host:port/db`
- SQLite: `sqlite:path-to-db-file`
- Redis: `redis://host:port` 或 `redis://password@host:port`
### 用法示例
```
# MySQL 输出
ipbufscan 10.0.0.0/8 -p80,443 -oS mysql://root:password@localhost:3306/ipbufscan
# MSSQL 输出
ipbufscan 10.0.0.0/8 -p80,443 -oS mssql://sa:password@localhost:1433/ipbufscan
# SQLite 输出(最简单,不需要服务器)
ipbufscan 10.0.0.0/8 -p80,443 -oS sqlite:scan_results.db
# Redis 输出
ipbufscan 10.0.0.0/8 -p80,443 -oS redis://localhost:6379
ipbufscan 10.0.0.0/8 -p80,443 -oS redis://password@localhost:6379
```
### 数据库结构
所有三个 SQL 数据库都使用相同的 schema:
```
CREATE TABLE IF NOT EXISTS scan_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ip VARCHAR(45) NOT NULL,
port INTEGER NOT NULL,
protocol VARCHAR(10) NOT NULL,
status VARCHAR(20) NOT NULL,
reason VARCHAR(100),
ttl INTEGER,
timestamp INTEGER NOT NULL,
service_name VARCHAR(50),
banner TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_ip (ip),
INDEX idx_port (port),
INDEX idx_timestamp (timestamp)
);
```
Redis 将数据存储为 Hash,键模式为 `ipbufscan:results`,包含:
- `count` - 扫描结果总数
- `results` - 所有扫描结果的 JSON 数组
### 依赖项
- **SQLite**:使用 SQLite amalgamation(单文件,公有领域)
- **MySQL**:在链接时需要 `-lmysqlclient`
- **MSSQL**:在链接时需要 FreeTDS/ODBC 库
- **Redis**:在链接时需要 hiredis 库
## 与 Nmap 对比
在合理的情况下,尽了一切努力使该程序让 `nmap` 用户感到熟悉,尽管它们根本上是不同的。Ipbufscan 专为大量机器的广域扫描而调优,而 nmap 则设计用于单台机器或小范围的密集扫描。
两个重要的区别是:
* 没有默认扫描的端口,你必须指定 `-p `
* 目标主机是 IP 地址或简单范围,而不是 DNS 名称,也不是 `nmap` 可以使用的奇怪子网范围(例如 `10.0.0-255.0-255`)。
你可以认为 `ipbufscan` 永久启用了以下设置:
* `-sS`:仅进行 SYN 扫描(目前如此,未来会改变)
* `-Pn`:不先 ping 主机,这是异步操作的基础
* `-n`:不发生 DNS 解析
* `--randomize-hosts`:始终完全随机扫描,你无法改变这一点
* `--send-eth`:使用原始 `libpcap` 发送
如果你想获得兼容 `nmap` 的其他设置的列表,请使用以下命令:
```
# ipbufscan --nmap
```
## 传输速率(重要!!)
这个程序发出数据包的速度非常快。在 Windows 上或从虚拟机上,它每秒可以发送 300,000 个数据包。在 Linux(无虚拟化)上,它每秒可以发送 160 万个数据包。这足以熔化大多数网络。
请注意,它只会熔化你自己的网络。它会将目标 IP 地址随机化,这样就不会淹没任何远端网络。
默认情况下,速率设置为 100 数据包/秒。要将速率提高到一百万,请使用类似 `--rate 1000000` 的设置。
在扫描 IPv4 互联网时,你将扫描大量子网,因此即使有大量的数据包发出去,每个目标子网收到的传入数据包速率也很小。
但是,在 IPv6 扫描中,你倾向于专注于具有数十亿地址的单个目标子网。因此,你的默认行为将淹没目标网络。网络经常在 ipscan 可以生成的负载下崩溃。
# 设计
本节描述了该程序的主要设计问题。
## 代码布局
正如你所料,文件 `main.c` 包含 `main()` 函数。它还包含 `transmit_thread()` 和 `receive_thread()` 函数。这些函数经过刻意的扁平化处理并添加了大量注释,以便你可以通过逐行单步执行每一个函数来阅读程序设计。
## 异步
这是一个*异步*设计。换句话说,对于 `nmap` 而言,它就像 `nginx` Web 服务器对于 `Apache` 一样。它拥有独立的发送和接收线程,它们在很大程度上彼此独立。这与 `scanrand`、`unicornscan` 和 `ZMap` 中的设计相同。
因为它是异步的,所以它的运行速度与底层底层数据包传输允许的速度一样快。
## 随机化
Ipbufscan 与其他扫描仪之间的一个关键区别在于它随机化目标的方式。
基本原则是拥有一个从零开始的单一索引变量,并且每次探测递增 1。在 C 代码中,这表示为:
```
for (i = 0; i < range; i++) {
scan(i);
}
```
我们必须将索引转换为 IP 地址。假设你想扫描所有的“私有”IP 地址。那将是类似这样的范围表:
```
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
```
在这个例子中,前 64k 个索引被追加到 192.168.x.x 以形成目标地址。然后,接下来的 1600 万个被追加到 10.x.x.x。
范围内的剩余索引被应用于 172.16.x.x。
在这个例子中,我们只有三个范围。在扫描整个互联网时,实际上我们有超过 100 个范围。那是因为你必须将许多子范围列入黑名单或排除。这将所需范围切分成了数百个小范围。
这导致了代码中最慢的部分之一。我们每秒传输 1000 万个数据包,并且必须为每一个探测将索引变量转换为 IP 地址。我们通过在少量内存中进行“二分查找”来解决这个问题。在这种数据包速率下,缓存效率开始主导算法效率。理论上有很多更有效的技术,但它们都需要占用大量内存,导致在实践中运行得更慢。
我们将从索引转换为 IP 地址的函数称为 `pick()` 函数。在使用中,它看起来像这样:
```
for (i = 0; i < range; i++) {
ip = pick(addresses, i);
scan(ip);
}
```
IPBufScan 不仅支持 IP 地址范围,还支持端口范围。这意味着我们需要从索引变量中同时提取 IP 地址和端口。这相当简单:
```
range = ip_count * port_count;
for (i = 0; i < range; i++) {
ip = pick(addresses, i / port_count);
port = pick(ports, i % port_count);
scan(ip, port);
}
```
这导致了代码中另一处昂贵的部分。除法/取模指令在 x86 CPU 上大约需要 90 个时钟周期或 30 纳秒。当以每秒 1000 万个数据包的速率发送时,我们每个数据包只有 100 纳秒。我认为没有办法能更好地优化它。幸运的是,两个这样的操作可以同时执行,因此如上所述执行这两个操作并不比执行一个更昂贵。
对于上述性能问题,实际上有一些简单的优化方法,但它们都依赖于 `i++`,即索引变量在扫描过程中逐一递增的事实。实际上,我们需要随机化这个变量。我们需要随机化扫描 IP 地址的顺序,否则我们将彻底摧毁那些并非为此等极速而构建的目标网络。我们需要将流量均匀地分布到目标上。
我们进行随机化的方式仅仅是通过对索引变量进行加密。根据定义,加密是随机的,并在原始索引变量和输出之间创建一对一映射。这意味着虽然我们线性地遍历范围,但输出的 IP 地址是完全随机的。在代码中,看起来像这样:
```
range = ip_count * port_count;
for (i = 0; i < range; i++) {
x = encrypt(i);
ip = pick(addresses, x / port_count);
port = pick(ports, x % port_count);
scan(ip, port);
}
```
这也有很大的代价。由于范围的大小不可预测,而不是 2 的合适的偶数次幂,我们不能使用像 AND (&) 和 XOR (^) 这样廉价的二进制技术。相反,我们必须使用像取模 (%) 这样的昂贵操作。在我当前的基准测试中,加密变量需要 40 纳秒。
这种架构允许许多很酷的功能。例如,它支持“分片”。你可以设置 5 台机器,每台执行五分之一的扫描,即 `range / shard_count`。分片可以是多台机器,也可以只是同一台机器上的多个网络适配器,甚至(如果你愿意)是同一网络适配器上的多个 IP 源地址。
或者,你可以对加密函数使用“种子”或“密钥”,这样每次扫描时都会得到不同的顺序,例如 `x = encrypt(seed, i)`。
我们还可以通过退出程序来暂停扫描,只需记住 `i` 的当前值,然后再重新启动它。我在开发过程中经常这样做。我看到我的互联网扫描出了点问题,所以我按下 停止扫描,然后在我修复错误后重新启动它。
另一个功能是重传/重试。数据包有时会在互联网上丢失,所以你可以连续发送两个数据包。然而,丢弃一个数据包的因素可能也会丢弃紧接其后的数据包。因此,你希望每隔大约 1 秒发送一次副本。这很简单。我们已经有了一个 'rate' 变量,即我们正在传输的每秒数据包速率,因此重传功能只需使用 `i + rate` 作为索引。总有一天我要对互联网进行一次研究,通过这种方式区分“背靠背”、“1 秒”、“10 秒”和“1 分钟”的重传,以查看丢弃的内容是否存在任何差异。
## C10 可扩展性
异步技术被称为解决“c10k 问题”的方案。
Ipbufscan 专为下一级的可扩展性,即“C10M 问题”而设计。
C10M 解决方案是绕过内核。IpbufScan 中有三个主要的内核绕过:
* 定制网络驱动
* 用户态 TCP 栈
* 用户态同步
IPBufScan 可以使用 PF_RING DNA 驱动程序。此驱动程序直接将数据包通过 DMA 从用户态内存传输到网络驱动程序,而无需内核参与。这使得软件即使在 CPU 缓慢的情况下,也能以硬件允许的最大速率传输数据包。如果你在一台计算机中插入 8 块 10-gbps 网卡,这意味着它可以以 1 亿个数据包/秒的速率传输。
Ipbufscan 拥有自己内置的 TCP 栈,用于从 TCP 连接中获取 banner。这意味着它可以轻松支持 1000 万个并发的 TCP 连接,当然,前提是计算机有足够的内存。
IPBufScan 没有“互斥锁”。现代互斥锁(即 futexes)大多是用户态的,但它们有两个问题。第一个问题是它们会导致缓存行在 CPU 之间快速来回反射。第二个问题是当存在争用时,它们会执行进入内核的系统调用,这会破坏性能。程序在快速路径上的互斥锁严重限制了可扩展性。
相反,IPBufScan 使用“环”来同步事物,例如当接收线程中的用户态 TCP 栈需要传输数据包而不干扰传输线程时。
## 可移植性
该代码在 Linux、Windows 和 Mac OS X 上运行良好。所有重要的部分都用标准 C (C90) 编写。因此,它可以在带有 Microsoft 编译器的 Visual Studio、Mac OS X 上的 Clang/LLVM 编译器以及 Linux 上的 GCC 上编译。
Windows 和 Mac 并未针对数据包传输进行调优,只能达到大约 300,000 个数据包/秒,而 Linux 可以达到 1,500,000 个数据包/秒。这可能比你想要的还要快。
## 安全代码
该项目使用安全函数,如 `strcpy_s()`,而不是像 `strcpy()` 这样的不安全函数。
该项目具有自动单元回归测试(`make regress`)。
## 兼容性
我们在使输入/输出看起来像 `nmap` 方面付出了很多努力,每个进行端口扫描的人都在(或应该)熟悉它。
## IPv6 和 IPv4 共存
IPBufScan 支持 IPv6,但没有特殊的模式,两者同时受支持。(没有 `-6` 选项——它始终可用)。
在你看到的任何 ipbufscan 用法示例中,只需在看到 IPv4 地址的地方填入 IPv6 地址即可。你可以在同一次扫描中同时包含 IPv4 和 IPv6 地址。输出会在同一位置包含相应的地址,没有任何特殊标记。
只要记住 IPv6 地址空间真的很大。你可能不想扫描大范围,除了子网中通过 DHCPv6 分配的前 64k 个地址。
相反,你可能希望扫描存储在文件(`--include-file filename.txt`)中的大型地址列表,这些地址是你从其他来源获取的。
像其他任何地方一样,该文件可以同时包含 IPv4 和 IPv6 地址列表。我使用的测试文件包含 800 万个地址。这种大小的文件在启动时需要几秒钟的时间来读取(ipbufscan 会在扫描前对地址进行排序并删除重复项)。
请记住,ipbufscan 包含自己的网络栈。因此,你运行 ipbufscan 的本地机器不需要支持 IPv6——尽管本地网络需要能够路由 IPv6 数据包。
## PF_RING
要突破每秒 200 万个数据包的速度,你需要一个 Intel 10-gbps 以太网适配器和一个特殊的驱动程序,即来自 ntop 的 [“PF_RING ZC”](http://www.ntop.org/products/packet-capture/pf_ring/pf_ring-zc-zero-copy/)。IPBufScan 不需要为了使用 PF_RING 而重新构建。要使用 PF_RING,你需要构建以下组件:
* `libpfring.so`(安装在 /usr/lib/libpfring.so)
* `pf_ring.ko`(他们的内核驱动)
* `ixgbe.ko`(他们的 Intel 10-gbps 以太网驱动版本)
你不需要构建他们的 `libpcap.so` 版本。
当 IPBufScan 检测到适配器被命名为类似 `zc:enp1s0` 而不是 `enp1s0` 这样的名称时,它会自动切换到 PF_RING ZC 模式。
可以在 **PoC||GTFO 0x15** 中找到更详细的讨论。
## 回归测试
该项目包含内置的单元测试:
```
$ make test
bin/ipbufscan --selftest
selftest: success!
```
这测试了代码中许多棘手的部分。你应该在构建后执行此操作。
## 性能测试
要测试性能,请运行类似以下指向废弃地址的命令,以避免使你的本地路由器过载:
```
$ bin/ipbufscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11
```
伪造的 `--router-mac` 将数据包保留在本地网络段上,以便它们不会发到互联网上。
你也可以在“离线”模式下进行测试,即程序在没有传输开销的情况下运行得有多快:
```
$ bin/ipbufscan 0.0.0.0/4 -p80 --rate 100000000 --offline
```
第二个基准测试粗略地显示了如果程序使用 PF_RING(开销几乎为零)将会运行得多快。
顺便说一句,随机化算法大量使用了“整数算术”,这是 CPU 上长期以来的缓慢操作。现代 CPU 已经将执行此计算的速度翻倍,使得 `ipbufscan` 变得更快。
# 安全
## 安全联系方式
- 邮箱:80755210@qq.com
- Twitter:@WEB_IPBUF
## 赏金
我提供 100 美元,以现金或比特币支付,用于奖励发现安全漏洞。
这主要针对远程漏洞,例如目标能够缓冲溢出扫描器,甚至导致其崩溃的能力。
但我也会考虑其他漏洞。Kali 是否以 suid 附带此程序并存在预加载 bug?这实际上并不是此代码中的漏洞,但如果是我能修复的问题,我会考虑为此支付赏金。
## 披露策略
如果你发现了漏洞,直接公布即可。也请将信息发送给上面的联系方式。
我大概会在一个月左右的时间去修复它。这确实不是被广泛使用的软件,所以我在这方面比较松懈。
## 已知漏洞
目前没有报告。
## 威胁模型
主要威胁来自互联网上的恶意目标发回响应,目的是:
* 利用缓冲区溢出漏洞
* 欺骗数据包试图给出欺诈性的扫描结果(通过我们的 SYN cookie 缓解)
* 泛洪数据包试图使带宽/存储过载
* 坏数据,例如破坏 banner 或 DNS 名称,试图利用带有恶意 html 或 script 标签的内容攻击下游消费者。
次要威胁来自程序的使用。例如,在命令行上输入错误的参数时,程序会在有用的错误消息中将其回显出来。对于无论如何都应该以 `root` 身份运行的命令行程序来说,这没问题,但如果有人试图将其做成可脚本化的服务,这就会成为一个潜在的漏洞。
# 作者
此工具由 IPBUF 创建:
email: 80755210@qq.com
twitter: @WEB_IPBUF
标签:AGPLv3 许可证, 云存储安全, 客户端加密, 并发处理, 插件系统, 搜索引擎查询, 数据统计, 正则表达式, 端口扫描, 网络安全, 网络扫描, 隐私保护, 高性能网络