GheekyByt3/forager
GitHub: GheekyByt3/forager
Forager 是一个自动化网络枚举工具,为渗透测试提供分阶段、可恢复的一站式侦察工作流。
Stars: 1 | Forks: 0
# Forager

Forager 自动化完整内部侦察工作流程——从解析域控制器到网页截图和 SMB 枚举——在单一、分阶段控制的流水线中完成。
仅推荐用于 **非隐蔽型评估**。该工具会产生显著的网络噪声。
## 安装
```
git clone https://github.com/GheekyByt3/forager.git
cd forager
pip install -r requirements.txt
```
## 功能特性
- 分阶段执行 — 可运行全部 7 个阶段或选择指定范围
- 从上一个已完成阶段恢复
- 输入快捷方式 — 可自带子网、活动主机或域控制器 IP
- 通过 gowitness 进行网页截图(第 6 阶段使用解析结果提升精度)
- 通过 NetExec 进行 SMB 枚举,并自动解析输出文件
- 额外扫描 — `--snmp`、`--ipmi`、`--screenshots`(独立于阶段)
- 从 nxc 输出动态分类操作系统
- 每阶段耗时统计与最终摘要
- 完善的错误处理与提示
## 系统要求
**系统工具:**
| 工具 | 使用阶段 |
|---|---|
| `nslookup` | 第 1 阶段 — 域控制器解析 |
| `nmap` | 第 3–4 阶段 — Ping 探测与端口扫描;`--snmp`、`--ipmi` |
| `gowitness` | 第 6 阶段 — 网页截图(可选,未安装时跳过);`--screenshots` |
| `nxc`(NetExec) | 第 7 阶段 — SMB 枚举 |
**Python 依赖:**
- Python 3.7+
- `pyfiglet`(可选;未安装时回退至内置 ASCII 横幅)
安装 Python 依赖:
```
pip install -r requirements.txt
```
## 使用方法
```
python3 forager.py [domain] [options]
```
### 基础用法
```
# 交互模式 — 提示要运行哪些阶段
python3 forager.py corp.local
# 运行所有阶段而不提示
python3 forager.py corp.local --full-scan
```
### 阶段控制
```
# 仅运行阶段 1–3(DC 解析 → 子网 → Ping 扫描)
python3 forager.py corp.local --stop-phase 3
# 仅在现有输出目录上运行阶段 7(SMB 枚举)
python3 forager.py corp.local --start-phase 7 --stop-phase 7
# 从上次停止处恢复(提示停止阶段)
python3 forager.py --resume
# 恢复但仅运行到阶段 4
python3 forager.py --resume --stop-phase 4
# 完整扫描但跳过 gowitness 截图
python3 forager.py corp.local --full-scan --skip-gowitness
```
### 输入快捷方式
```
# 已有子网?从阶段 3 开始
python3 forager.py --subnets subnets.txt
# 已有存活主机?从阶段 4 开始
python3 forager.py --live-hosts hosts.txt
# 已有存活主机但仅想要端口扫描 + 解析(无截图/SMB)?
python3 forager.py --live-hosts hosts.txt --stop-phase 5
# 已有存活主机且仅想要 SMB 枚举?
python3 forager.py --live-hosts hosts.txt --start-phase 7
```
### 额外扫描
这些扫描独立于阶段系统运行 — 可在阶段完成后执行,或单独运行。
```
# 快速截图 — 直接将主机提供给 gowitness(无需端口扫描)
python3 forager.py --live-hosts hosts.txt --screenshots
# 完整扫描 + SNMP + IPMI
python3 forager.py corp.local --full-scan --snmp --ipmi
# 仅在现有输出目录上运行 SNMP 扫描
python3 forager.py --snmp
# 使用自定义主机列表的 SNMP + IPMI
python3 forager.py --live-hosts hosts.txt --snmp --ipmi
```
### 输出控制
```
# 强制生成新的时间戳目录
python3 forager.py corp.local --full-scan --new
# 使用自定义输出目录
python3 forager.py corp.local --output /tmp/myrecon
# 抑制详细输出
python3 forager.py corp.local --full-scan -q
```
## 阶段说明
| # | 阶段 | 工具 |
|---|---|---|
| 1 | 从 DNS(SRV 记录)解析域控制器 IP | nslookup |
| 2 | 根据域控制器 IP 构建子网 | — |
| 3 | Ping 探测以发现活动主机 | nmap |
| 4 | 端口扫描活动主机 | nmap |
| 5 | 解析并分类结果 | — |
| 6 | 通过 gowitness 进行网页截图 | gowitness(可选) |
| 7 | 通过 NetExec 进行 SMB 枚举 | nxc |
**额外扫描**(非阶段扫描,可通过标志位选择):
| 标志 | 扫描 | 工具 |
|---|---|---|
| `--snmp` | SNMP UDP 扫描(端口 161/162) | nmap |
| `--ipmi` | IPMI UDP 扫描(端口 623),带版本探测 | nmap |
| `--screenshots` | 直接针对 `--live-hosts` 文件进行 gowitness 扫描 | gowitness |
## 输出结构
```
forager_corp.local/
├── DC_IPs.txt # Resolved DC IP addresses
├── DC_subnets.txt # Generated subnets
├── live_hosts.txt # Hosts that responded to ping
├── ping_sweep.gnmap # Raw nmap ping sweep output
├── .forager_state.json # State file for --resume
├── nmap_scans/
│ ├── port_scan.nmap
│ ├── port_scan.xml
│ ├── port_scan.gnmap
│ ├── snmp_scan.* # Only if --snmp was used
│ └── ipmi_hosts_scan.* # Only if --ipmi was used
├── parsed_results/
│ ├── full_summary.csv # All open ports across all hosts
│ ├── web_hosts.txt
│ ├── rdp_hosts.txt
│ ├── ssh_hosts.txt
│ ├── smb_hosts.txt
│ ├── winrm_hosts.txt
│ ├── ldap_hosts.txt
│ ├── redis_hosts.txt
│ ├── snmp_hosts.txt # Only if --snmp was used
│ ├── ipmi_hosts.txt # Only if --ipmi was used
│ └── ...
├── gowitness_results/ # Only if phase 6 or --screenshots ran
│ ├── target_urls.txt # Phase 6: URLs built from parsed results
│ ├── gowitness.sqlite3 # Gowitness database
│ └── screenshots/ # Captured web screenshots
└── nxc_smb_parsed_results/
├── smb_connection_scan.txt # Raw nxc output
├── smb_signing_disabled_hosts.txt
├── smb_relay_targets.txt # smb://IP format
├── smbv1_enabled_hosts.txt
└── Windows__hosts.txt # One file per OS version detected
```
## 选项参考
```
positional:
domain Target domain name
phase control:
--full-scan Run all phases without prompting (1-7)
--start-phase {1-7} Start from a specific phase
--stop-phase {1-7} Stop after a specific phase
--resume Resume from last completed phase
--skip-gowitness Skip phase 6 (gowitness web screenshots)
input shortcuts:
--dc-ips DC IPs as comma-separated values or file path
--subnets File of subnets (one per line) — starts at phase 3
--live-hosts File of live hosts (one IP per line) — starts at phase 4
scan options:
--subnet-mask Subnet mask for DC subnets (default: 24)
--parallelism Nmap min-parallelism for ping sweep (default: 100)
--min-rate Nmap min-rate for ping sweep
--ports Custom port list
--max-retries Nmap max-retries for port scan (default: 5)
additional scans:
--snmp Run SNMP UDP scan (ports 161/162)
--ipmi Run IPMI UDP scan (port 623) with ipmi-version script
--screenshots Run gowitness directly against --live-hosts file
output options:
-o, --output Custom output directory path
--new Force a new timestamped directory
-q, --quiet Suppress verbose output
```
## 免责声明
本工具仅限 **授权渗透测试和安全评估** 使用。未经授权对非自有系统或无明确书面许可的系统进行测试属于违法行为。作者不承担任何误用责任。
## 许可证
MIT — 参见 [LICENSE](LICENSE)
## 更新日志
参见 [CHANGELOG.md](CHANGELOG.md)
标签:DC IP输入, gowitness, IPMI扫描, NetExec, nslookup, nxc, OS分类, pip依赖, Python 3.7+, SMB枚举, SNMP扫描, Web截图, 主机输入, 代码生成, 内部侦察, 反取证, 可恢复执行, 域控制器解析, 子网输入, 安全评估, 定时统计, 容器安全, 横向移动侦察, 渗透测试工具, 网络噪声, 网络枚举, 网络调试, 自动化, 逆向工具, 错误提示, 阶段化执行, 非隐蔽操作