Z3R0space/ZeroMap
GitHub: Z3R0space/ZeroMap
ZeroMap 是一款用 C 语言编写的高速 TCP 端口扫描器,结合了 Masscan 的速度和 Nmap 的隐身能力,专为红队渗透测试设计。
Stars: 0 | Forks: 0
```
███████╗███████╗██████╗ ██████╗ ███╗ ███╗ █████╗ ██████╗
███╔╝██╔════╝██╔══██╗██╔═══██╗████╗ ████║██╔══██╗██╔══██╗
███╔╝ █████╗ ██████╔╝██║ ██║██╔████╔██║███████║██████╔╝
███╔╝ ██╔══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██║██╔═══╝
███████╗███████╗██║ ██║╚██████╔╝██║ ╚═╝ ██║██║ ██║██║
╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝
```
**神速版**
*Nmap 太慢?恶心…… · Rustscan 是谁?· 你的防火墙来电话了,它说它怕了。*




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, 协议栈, 原始套接字, 客户端加密, 密码管理, 插件系统, 数据统计, 端口扫描, 端口探测, 网络安全, 自然语言处理, 规避技术, 诱骗扫描, 隐私保护, 高速扫描器