Z3R0space/ZeroMap

GitHub: Z3R0space/ZeroMap

ZeroMap 是一款用 C 语言编写的高速 TCP 端口扫描器,结合了 Masscan 的速度和 Nmap 的隐身能力,专为红队渗透测试设计。

Stars: 0 | Forks: 0

``` ███████╗███████╗██████╗ ██████╗ ███╗ ███╗ █████╗ ██████╗ ███╔╝██╔════╝██╔══██╗██╔═══██╗████╗ ████║██╔══██╗██╔══██╗ ███╔╝ █████╗ ██████╔╝██║ ██║██╔████╔██║███████║██████╔╝ ███╔╝ ██╔══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██║██╔═══╝ ███████╗███████╗██║ ██║╚██████╔╝██║ ╚═╝ ██║██║ ██║██║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ``` **神速版** *Nmap 太慢?恶心…… · Rustscan 是谁?· 你的防火墙来电话了,它说它怕了。* ![平台](https://img.shields.io/badge/platform-Linux-blue?style=flat-square) ![语言](https://img.shields.io/badge/language-C-orange?style=flat-square) ![许可证](https://img.shields.io/badge/license-MIT-green?style=flat-square) ![Root](https://img.shields.io/badge/requires-root-red?style=flat-square)
ZeroMap 是一款用 C 语言编写的高速、多线程 TCP 端口扫描器。它使用 `AF_PACKET` 套接字在以太网层构造原始数据包 —— 不依赖 libpcap,不使用 nmap 封装,仅通过原始系统调用实现。它支持七种扫描模式、可组合的诱骗突发、IP 分片、慢速规避、被动 Shodan 查询以及多目标文件扫描。 **问题**:作为一名经验丰富的红队成员,我目睹了端口扫描阶段的问题,我们不得不使用多种工具来隐藏扫描,有时这非常耗时。 **解决方案**:我开发了一个基于 C 语言的端口扫描器,它的速度与 Masscan 相当,并具备像 Nmap 这样的隐身能力,将速度与隐身性完美结合,使其成为红队行动或初步扫描的理想选择。它还包含一种主流端口扫描器所缺乏的独特扫描类型 —— 一种利用 Shodan 发现目标端口和服务的被动扫描类型,零主动交互意味着零检测。 ## 功能特性 - **七种扫描模式** — SYN、FIN、NULL、XMAS、分片、慢速 和 诱骗 - 通过 `AF_PACKET` 在第 2 层进行 **原始数据包构造** —— 不涉及内核 TCP 协议栈 - 采用 `sendmmsg` 批量发送的 **多线程 TX**,以实现最大吞吐量 - **可组合的 `--decoy`** 标志可与任何扫描模式协同工作 - **被动 Shodan 集成** — 查询 Shodan API,无需向目标发送任何数据包 - **端口范围过滤** — 扫描单个端口、一个范围或全部 65535 个端口 - 通过 `--file` 支持 **多目标扫描**,支持带注释的 IP 列表 - 针对未收到回复端口的 **自动重试阶段** - **隐身后处理** — 在 FIN/NULL/XMAS 模式下正确分类 `OPEN | FILTERED` ## 系统要求 ### 系统 - Linux (内核 3.x+) - Root / `CAP_NET_RAW` 权限 - GCC ### 库 ``` sudo apt install libcurl4-openssl-dev libcjson-dev ``` | 库 | 用途 | |---|---| | `libcurl` | Shodan API HTTP 请求 (`--shodan`) | | `libcjson` | 解析 Shodan JSON 响应 | | `libpthread` | 多线程 TX/RX | ## 安装 ``` git clone https://github.com/Z3R0space/ZeroMap.git cd ZeroMap # 安装依赖 sudo apt install libcurl4-openssl-dev libcjson-dev # 或手动 gcc -O2 -Wall -D_GNU_SOURCE -o zeromap main.c zeromap.c -lpthread -lcurl -lcjson ``` ### Shodan API 密钥(可选) 如果您想使用 `--shodan`,请打开 `scanner.h` 并将占位符替换为您从 [account.shodan.io](https://account.shodan.io/) 获取的密钥: ``` #define SHODAN_API_KEY "your_actual_key_here" ``` ### 接口名称 默认情况下 ZeroMap 使用 `ens33`。如果您的接口不同(`eth0`、`wlan0` 等),请修改 `scanner.h` 中的定义: ``` #define IFACE "eth0" ``` ## 使用方法 ``` Usage: sudo ./zeromap [--ports ] [--mode] [--decoy] [--shodan] sudo ./zeromap --file [--ports ] [--mode] [--decoy] [--shodan] ``` ### 选项 | 选项 | 描述 | |---|---| | `<目标IP>` | 单个扫描目标 | | `--file <路径>` | 每行包含一个 IP 的文件 | | `--ports <范围>` | 端口范围:`80`、`1-1024`、`8000-9000`(默认:全部) | | `--syn` | SYN(半开)扫描 —— 默认 | | `--fin` | FIN 扫描 | | `--null` | NULL 扫描(无 TCP 标志) | | `--xmas` | XMAS 扫描(FIN + PSH + URG) | | `--frag` | 分片 SYN 扫描 | | `--slow` | 带随机延迟的慢速 SYN 扫描 | | `--decoy` | 在真实扫描前发射伪造 IP 突发(可组合) | | `--shodan` | 仅被动 Shodan 查询 —— 不向目标发送数据包 | ## 示例 ``` # 默认 SYN 扫描 — 所有端口 sudo ./zeromap 192.168.1.1 # 仅扫描前 1024 个端口 sudo ./zeromap 192.168.1.1 --ports 1-1024 # 对端口范围进行 XMAS 扫描 sudo ./zeromap 192.168.1.1 --ports 1-1024 --xmas # 使用 decoy 突发流量掩盖真实 IP 的 SYN 扫描 sudo ./zeromap 192.168.1.1 --decoy # 将任意模式与 decoy 结合 sudo ./zeromap 192.168.1.1 --slow --decoy --ports 1-500 sudo ./zeromap 192.168.1.1 --xmas --decoy # 被动 Shodan 查询(不向目标发送数据包) sudo ./zeromap 192.168.1.1 --shodan sudo ./zeromap 192.168.1.1 --shodan --ports 1-1024 # 从文件扫描多个目标 sudo ./zeromap --file targets.txt sudo ./zeromap --file targets.txt --ports 1-1024 --syn --decoy sudo ./zeromap --file targets.txt --shodan ``` ## 扫描模式详解 ### SYN 扫描(默认) 发送一个 SYN 数据包并等待响应。`SYN+ACK` 响应表示端口开放;`RST` 表示端口关闭。连接从未完成 —— 因此称为“半开”。快速、隐蔽,是大多数情况下的首选。 ### FIN 扫描 (`--fin`) 发送 FIN 数据包而不是 SYN。在符合 RFC-793 的协议栈(Linux、BSD)上,关闭的端口会回复 `RST`,而开放的端口保持沉默。**不**适用于 Windows 目标,因为无论端口状态如何,Windows 都会回复 `RST`。 ### NULL 扫描 (`--null`) 发送一个未设置任何 TCP 标志的数据包。检测逻辑与 FIN 相同 —— 沉默意味着开放,`RST` 意味着关闭。有助于规避仅检查标志组合的简单基于规则的防火墙。 ### XMAS 扫描 (`--xmas`) 同时设置 FIN、PSH 和 URG —— 像圣诞树一样点亮数据包。开放/关闭检测逻辑与 FIN 和 NULL 相同。 ### 分片 SYN (`--frag`) 将单个 SYN 拆分到两个 IP 分片中。仅检查第一个分片的旧式无状态防火墙可能会让这两个分片通过,从而允许目标 TCP 协议栈重新组装并响应。 ### 慢速扫描 (`--slow`) 发送 SYN,数据包间延迟在 5ms 到 50ms 之间随机化。旨在低于基于速率的 IDS 系统的阈值,这些系统通常在流量突发时触发警报。 ### 诱骗突发 (`--decoy`) 在运行实际扫描之前,ZeroMap 会从 5 个硬编码的虚假 IP 各发送 100 个伪造的 SYN 数据包。这会使目标的连接日志充满噪音,使您的真实 IP 更难被识别。诱骗是一个 **标志**,而不是一种模式 —— 将其与任何扫描类型结合使用: ``` sudo ./zeromap 10.0.0.1 --xmas --decoy --ports 1-1024 ``` ### Shodan 被动扫描 (`--shodan`) 查询目标 IP 的 Shodan API。返回已知的开放端口、服务旗标、产品版本、操作系统指纹、组织、ISP、主机名和 CVE —— 所有这些都无需向目标发送任何数据包。需要在 `scanner.h` 中配置有效的 Shodan API 密钥。 ## 多目标文件格式 ``` # Web servers 192.168.1.1 192.168.1.2 # Database hosts 10.0.0.10 10.0.0.11 # 随意留空行 172.16.0.99 ``` - 每行一个 IP - `#` 开始注释 —— 该行的其余部分将被忽略 - 空行将被忽略 - 所有标志(`--ports`、`--mode`、`--decoy`、`--shodan`)适用于文件中的每个目标 ## 输出 ``` [OPEN] 22 - ssh [OPEN] 80 - http [OPEN] 443 - https [OPEN|FILTERED] 8080 - http-alt ← stealth modes only ``` 对于 Shodan 模式: ``` [SHODAN] ── Host info ────────────────────────────────────── [SHODAN] Organization : Cloudflare, Inc. [SHODAN] ISP : Cloudflare [SHODAN] OS : N/A [SHODAN] Country : United States [SHODAN] ── Service details ───────────────────────────────── Port Transport Product Banner ------ --------- ------------------- ------ 80 tcp nginx 1.21.0 HTTP/1.1 200 OK ... 443 tcp nginx 1.21.0 ... ``` ## 配置 所有可调参数位于 `scanner.h` 中: | 定义 | 默认值 | 描述 | |---|---|---| | `IFACE` | `ens33` | 要使用的网络接口 | | `SRC_PORT` | `54321` | 所有传出数据包的源端口 | | `TX_THREADS` | `4` | 并行 TX 线程数 | | `BATCH_SIZE` | `64` | 每次 `sendmmsg` 批量的数据包数 | | `RX_GRACE` | `2` | TX 完成后继续接收的秒数 | | `MAX_RETRIES` | `1` | 未应答端口的扫描重试次数 | | `RETRY_DELAY_MS` | `800` | 重试前的延迟(毫秒) | | `SLOW_MIN_DELAY_US` | `5000` | 慢速模式下的最小包间延迟(µs) | | `SLOW_MAX_DELAY_US` | `50000` | 慢速模式下的最大包间延迟(µs) | | `MAX_DECOYS` | `5` | 诱骗突发中的虚假 IP 数量 | | `SHODAN_API_KEY` | *(占位符)* | 您的 Shodan API 密钥 | ## 工作原理 ZeroMap 通过在第 2 层打开 `AF_PACKET` 原始套接字,完全绕过内核的 TCP 协议栈。它从头开始构建完整的以太网 + IP + TCP 头部,手动计算校验和,并使用 `sendmmsg` 大批量发送数据包以实现高吞吐量。一个专门的 RX 线程使用启用了大接收缓冲区和忙轮询的第二个 `AF_PACKET` 套接字来捕获响应,以最大程度减少延迟。 ``` ┌─────────────┐ TX threads (x4) ┌──────────────┐ │ main() │──── raw SYN packets ────▶│ Target │ │ │ │ │ │ │◀─── SYN+ACK / RST ───────│ │ │ RX thread │ └──────────────┘ └─────────────┘ │ ▼ open_ports[] / closed_ports[] / syn_sent[] │ ▼ Retry pass → stealth post-processing → results ``` ## 项目结构 ``` zeromap/ ├── scanner.h # Configuration, structs, public API ├── zeromap.c # Packet crafting, TX/RX threads, Shodan ├── main.c # Argument parsing, scan orchestration ``` ## 局限性 - **仅限 Linux** — 使用 `AF_PACKET`、`sendmmsg` 和 `/proc` ARP;无法移植到 macOS 或 BSD - **需要 Root** — 原始套接字需要 `CAP_NET_RAW` - **仅限 IPv4** — 无 IPv6 支持 - **FIN / NULL / XMAS 对 Windows 无效** — Windows 对所有关闭和开放的端口都回复 RST,导致隐身模式结果不可靠 - **Shodan 需要互联网连接和付费/免费 API 密钥** - **诱骗 IP 是硬编码的**,位于 `scanner.h` 中 —— 编辑 `DECOY_IPS[]` 以使用您自己的 IP
标签:AF_PACKET, IP分片, Linux工具, Raw Socket, Shodan集成, ZeroMap, 协议栈, 原始套接字, 客户端加密, 密码管理, 插件系统, 数据统计, 端口扫描, 端口探测, 网络安全, 自然语言处理, 规避技术, 诱骗扫描, 隐私保护, 高速扫描器