jnavarroO9/nmfuzz
GitHub: jnavarroO9/nmfuzz
一款基于 Bash 的 CTF 枚举自动化工具,将 Nmap 端口扫描、Gobuster 目录爆破和 wfuzz 子域名模糊测试整合为模块化一键流水线。
Stars: 2 | Forks: 0
███╗ ██╗███╗ ███╗███████╗██╗ ██╗███████╗███████╗
████╗ ██║████╗ ████║██╔════╝██║ ██║╚════██║╚════██║
██╔██╗ ██║██╔████╔██║█████╗ ██║ ██║ ██╔╝ ██╔╝
██║╚██╗██║██║╚██╔╝██║██╔══╝ ██║ ██║ ██╔╝ ██╔╝
██║ ╚████║██║ ╚═╝ ██║██║ ╚██████╔╝██████╔╝██████╔╝
╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═════╝╚═════╝ ╚═════╝
**CTF 枚举自动化工具 — 一个实现端口侦察 自动化、tcp (SYN 扫描) 和 udp 端口扫描的 bash 脚本。自动检测 http/https 服务,并启动目录 和子域名 模糊测试。**



## 功能特点
- **模块化设计** — 可以单独调用任何阶段,也可以一次性运行完整流程
- **持久化目标配置** — 设置一次目标,即可在所有命令中复用
- **自动化工作区** — 为每台机器创建有组织的目录结构
- **SYN 扫描 + 定向扫描** — 快速的全端口发现,随后进行版本/脚本检测
- **可选 UDP 扫描** — 按需扫描排名前 200 的 UDP 端口
- **智能 HTTP 检测** — 读取 nmap 结果以自动查找 HTTP 端口
- **Gobuster 目录暴力破解** — 如果 IP 扫描失败,将自动回退到域名扫描
- **wfuzz 子域名模糊测试** — 智能基线探测可静默过滤误报
- **静默工具输出** — 工具在后台运行;仅显示整洁的摘要结果
## 环境依赖
| 工具 | 用途 | 安装 |
|---|---|---|
| `nmap` | 端口扫描 | `apt install nmap` |
| `gobuster` | 目录暴力破解 | `apt install gobuster` |
| `wfuzz` | 子域名模糊测试 | `apt install wfuzz` |
### 推荐字典
nmfuzz 默认使用以下路径。安装 [SecLists](https://github.com/danielmiessler/SecLists) 以确保它们可用:
```
/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt ← gobuster
/usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt ← wfuzz
```
```
apt install seclists
# 或
git clone https://github.com/danielmiessler/SecLists /usr/share/wordlists/SecLists
```
## 安装说明
```
git clone https://github.com/jNavarroO9/nmfuzz.git
cd nmfuzz
chmod +x nmfuzz.sh
sudo mv nmfuzz.sh /usr/local/bin/nmfuzz
```
## 用法
```
nmfuzz
[options]
```
### 命令
#### `settarget `
配置活动目标并创建工作区目录结构。将配置保存到 `~/.nmfuzz.conf`,以便后续命令无需使用 `--target`。
```
nmfuzz settarget 10.10.11.23 HackMe
```
```
HackMe/
├── nmap/ ← scan output files
├── content/ ← web enumeration, screenshots, notes
└── exploits/ ← exploits and payloads
```
#### `portscan [--target ] [--udp]`
运行三阶段的 nmap 枚举:
| 阶段 | 命令 | 输出文件 |
|---|---|---|
| 1 | 扫描所有端口 (`-sS -p- --min-rate 5000 -n -Pn`) | `nmap/allPorts` (可 grep 格式) |
| 2 | 针对开放端口进行版本和脚本检测 (`-sCV`) | `nmap/targeted` (nmap 格式) |
| 3 *(可选)* | 扫描排名前 200 的 UDP 端口 (`-sU --top-ports 200`) | `nmap/udp-targeted` (nmap 格式) |
如果任何阶段失败,扫描将被中止并报告错误。
```
sudo nmfuzz portscan
sudo nmfuzz portscan --udp
sudo nmfuzz portscan --target 10.10.11.23 HackMe --udp
```
#### `webscan [--target ] [选项]`
对在 `targeted` 文件中检测到的每个 HTTP 端口运行 Gobuster 目录扫描。如果针对 IP 的扫描失败,它会自动使用 `.htb` 作为主机名进行重试。
```
nmfuzz webscan
nmfuzz webscan -w /opt/SecLists/Discovery/Web-Content/common.txt
nmfuzz webscan -w /opt/wordlists/big.txt -x php,html,txt -t 100
```
| 选项 | 默认值 | 描述 |
|---|---|---|
| `-w / --wordlist` | dirbuster medium | 字典路径 |
| `-x / --ext` | `php,html,txt,js,bak` | 要探测的扩展名 |
| `-t / --threads` | `50` | 并发线程数 |
输出文件:`content/gobuster_.txt` (回退时会生成 `gobuster__domain.txt` )。
#### `subfuzz [--target ] [选项]`
使用 `Host:` 请求头运行 wfuzz 子域名模糊测试扫描。在完整运行之前,它会发起一次 **50 个单词的探测**,以检测无效子域名的基线响应大小,然后自动过滤掉该大小 (`--hh`)。屏幕输出保持整洁;仅打印结果摘要。
```
nmfuzz subfuzz
nmfuzz subfuzz --domain hackme.htb
nmfuzz subfuzz -d target.thm -w /opt/SecLists/Discovery/DNS/subdomains-top1million-20000.txt
```
| 选项 | 默认值 | 描述 |
|---|---|---|
| `-d / --domain` | `.htb` | 要模糊测试的基础域名 |
| `-w / --wordlist` | SecLists top 5000 | 字典路径 |
| `-t / --threads` | `50` | 并发线程数 |
输出文件:`content/subdomains_.txt`
#### `enum [--target ] [选项]`
按顺序运行完整的流程:`portscan → webscan → subfuzz`。如果端口扫描失败,流程将停止。如果未检测到 HTTP 端口,将跳过 Web 扫描阶段。
```
sudo nmfuzz enum --target 10.10.11.23 HackMe
sudo nmfuzz enum --target 10.10.11.23 HackMe --udp --domain hackme.htb
sudo nmfuzz enum --target 10.10.11.23 HackMe -w /opt/wordlists/common.txt --sub-wordlist /opt/wordlists/dns.txt
```
| 选项 | 描述 |
|---|---|
| `--target ` | 内联设置目标(同时保存配置) |
| `--udp` | 包含 UDP 扫描 |
| `-w / --wordlist` | 用于 gobuster 的字典 |
| `--sub-wordlist` | 用于 wfuzz 的字典 |
| `-d / --domain` | 用于子域名模糊测试的域名 |
#### `status`
显示当前配置的目标以及已生成的输出文件。
```
nmfuzz status
```
## 工作流
### 分步执行
```
# 1. 配置 target(创建工作区,保存 config)
nmfuzz settarget 10.10.11.23 HackMe
# 2. 端口枚举
sudo nmfuzz portscan
# 3. 目录 brute-force(从步骤 2 自动检测 HTTP 端口)
nmfuzz webscan -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
# 4. 子域名 fuzzing
nmfuzz subfuzz --domain hackme.htb
# 5. 检查生成的内容
nmfuzz status
```
### 单行命令
```
sudo nmfuzz enum --target 10.10.11.23 HackMe --udp --domain hackme.htb \
-w /opt/SecLists/Discovery/Web-Content/common.txt \
--sub-wordlist /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
```
### 内联目标(跳过 settarget)
```
sudo nmfuzz portscan --target 10.10.11.23 HackMe --udp
nmfuzz webscan --target 10.10.11.23 HackMe -w /opt/wordlists/big.txt
nmfuzz subfuzz --target 10.10.11.23 HackMe -d hackme.htb
```
## 输出结构
```
HackMe/
├── nmap/
│ ├── allPorts SYN scan — grepable format
│ ├── targeted Version/script scan — nmap format
│ └── udp-targeted UDP scan — nmap format (if requested)
├── content/
│ ├── gobuster_80.txt Directory scan results for port 80
│ ├── gobuster_80_domain.txt (domain fallback, if IP scan failed)
│ ├── gobuster_443.txt Directory scan results for port 443
│ └── subdomains_hackme.htb.txt Subdomain fuzzing results
└── exploits/ Your exploits and payloads go here
```
## 配置
nmfuzz 将活动目标保存到 `~/.nmfuzz.conf`:
```
TARGET_IP=10.10.11.23
TARGET_NAME=HackMe
WORKSPACE=/home/user/HackMe
```
此文件会被每个命令自动加载,因此每台机器只需调用一次 `settarget`(或 `--target`)。
## 注意事项
- `portscan` 和 `enum` **需要 root 权限**,因为 nmap 的原始套接字 SYN 扫描 (`-sS`) 需要该权限。
- 如果 `gobuster` 针对 IP 的扫描失败(例如应用程序需要特定的 `Host:` 请求头),它会自动使用 `.htb` 作为域名进行重试。
- wfuzz 探测运行使用字典的前 50 个条目来检测基线响应。如果检测失败,完整扫描仍会运行——只是没有字符过滤器。
- `gobuster` 和 `wfuzz` 均在静默模式下运行。终端仅打印计数摘要;完整结果将保存到输出文件中。
## 路线图
- [ ] **独立的 UDP 扫描** — 运行 `portscan --udp-only` 而无需先经过 TCP 阶段
- [ ] **跳过已完成的扫描** — 如果调用 `portscan` 时 `allPorts` / `targeted` 已经存在,则跳过这些阶段并复用现有结果,而不是重新扫描
- [ ] **并发 webscan + subfuzz** — 在 `enum` / `webscan` 上提供 `--concurrent` 标志,以并行运行 gobuster 和 wfuzz,并在两者之间共享拆分的线程池
- [ ] **自动配置 `/etc/hosts`** — 可选地在 `settarget` 时将 ` .htb` 追加到 `/etc/hosts`
- [ ] **恢复支持** — 检测运行中断,并从上一个完成的阶段继续执行
MIT — 随心所欲,祝黑客愉快。标签:AES-256, CTI, HTTP检测, Nmap, SYN扫描, Web安全, Wfuzz, 域名解析, 子域名爆破, 应用安全, 插件系统, 数据展示, 数据统计, 模块化设计, 漏洞评估, 目录爆破, 端口扫描, 红队, 网络安全, 网络安全审计, 自动化修复, 自动化枚举, 蓝队分析, 虚拟驱动器, 隐私保护