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 许可证, 云存储安全, 客户端加密, 并发处理, 插件系统, 搜索引擎查询, 数据统计, 正则表达式, 端口扫描, 网络安全, 网络扫描, 隐私保护, 高性能网络