garagehq/nightcrawler
GitHub: garagehq/nightcrawler
一个完全在智能手机上离线运行的 AI 驱动自主渗透测试 agent,可自动完成从侦察到报告的完整安全评估流程。
Stars: 123 | Forks: 5
# Nightcrawler
一个完全在智能手机上运行的自主渗透测试 agent。将手机接入目标网络后即可离开,它会自动发现主机、映射服务、查找漏洞,并生成渗透测试报告——全程无需连接云端。
```
░█▄░█ █ █▀▀ █░█ ▀█▀ █▀▀ █▀█ ▄▀█ █░█░█ █░░ █▀▀ █▀█
░█░▀█ █ █▄█ █▀█ ░█░ █▄▄ █▀▄ █▀█ ▀▄▀▄▀ █▄▄ ██▄ █▀▄ v0.1.0
AUTONOMOUS MOBILE PENTEST AGENT
OnePlus 8 · NetHunter · LFM2.5-1.2B · OpenCL GPU
```
## 这是什么?
**渗透测试**(Pentesting)是通过模拟攻击来测试计算机网络安全性的实践——前提是必须获得网络所有者的明确许可。专业的渗透测试人员受雇在*真正的*攻击者发现漏洞*之前*找到它们。
Nightcrawler 将这一过程在手机上实现了自动化。它利用在手机 GPU 上本地运行的小型 AI 模型(LFM2.5-1.2B-Instruct-Heretic,12亿参数)来决定下一步操作——探测哪台主机、使用哪种工具、寻找什么内容。全程不需要互联网连接或云 API。
### 工作原理
1. **WiFi 破解**(可选)——如果在没有 WiFi 的环境下被部署,它可以使用外置 USB WiFi 适配器自主破解 WPA2 网络
2. **侦察**——使用隐蔽扫描发现网络中的设备
3. **枚举**——探测发现的服务(Web 服务器、文件共享、SSH、DNS 等)
4. **漏洞利用**——测试已知漏洞和默认凭证
5. **报告生成**——生成包含发现结果和修复建议的结构化渗透测试报告
该 agent 的运作方式就像一位耐心的渗透测试人员——它在不同主机间轮转,每轮执行一个小操作,并在数小时内逐步积累信息。这使得它比那些同时对所有主机发起猛烈扫描的传统漏洞扫描器更难被检测到。
### 核心概念
| 术语 | 含义 |
|------|--------------|
| **Drop box** | 部署在目标网络上以自主执行测试的设备 |
| **范围 (Scope)** | 您获得授权可以测试的网络/主机集合 |
| **交战规则 (ROE)** | 明确规定您被允许执行哪些操作的法律文件 |
| **隐蔽性 (Stealth)** | 避免被网络监控系统 (IDS/IPS) 发现的技术 |
| **MCP** | Model Context Protocol——用于 AI 工具调用的标准接口 |
| **C2** | Command and Control——用于监控和引导 agent 的 Web 仪表盘 |
## 架构
```
┌──────────────────────────────────────────────────────────┐
│ PHONE (OnePlus 8) │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ LFM2.5 │ │ Agent Loop │ │
│ │ 1.2B model │◄───►│ (main.py) │ │
│ │ on GPU │ │ Decides what │ │
│ │ (:8080) │ │ to do next │ │
│ └─────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Scope Proxy │ ← Safety layer │
│ │ Validates every │ Blocks out- │
│ │ command before │ of-scope │
│ │ execution │ actions │
│ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Kali MCP Server │ ← Runs the │
│ │ nmap, curl, │ actual │
│ │ smbclient, ... │ commands │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Web Dashboard │ │ SQLite DB │ │
│ │ (:8888) │ │ Hosts, vulns, │ │
│ │ Monitor & steer │ │ creds, commands │ │
│ └──────────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────────────┘
```
完整的系统设计,请参阅 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
## 功能特性
- **完全自主**——运行期间无需人工干预
- **100% 本地推理**——AI 在手机 GPU 上运行,无需依赖云端
- **强制范围限制**——双层防御机制,防止执行超出授权范围的操作
- **隐蔽优先**——慢速扫描频率、主机轮换、掩护流量、仅使用 nmap -T2 模式
- **27 个漏洞利用 playbook**——自动执行的多步骤攻击链
- **24,956 条 CVE 数据库**——支持基于版本感知的漏洞匹配
- **Web 仪表盘**——实时监控、主机管理、C2 控制
- **WiFi 破解模式**——使用 USB 适配器自主破解 WPA2(灵感来自 Pwnagotchi)
- **被动发现**——后台捕获 mDNS/NBNS/DHCP/ARP 广播
- **多网络支持**——按网络隔离数据,通过基于 MAC 地址的主机记录在 DHCP 变更后依然保持有效
- **自我修复**——垃圾输出检测、上下文重置、看门狗机制、卡死检测
- **训练数据捕获**——记录成功的交互过程,用于未来的模型微调
- **报告生成**——可下载包含漏洞、利用链和修复建议的渗透测试报告
完整的功能参考请查阅 [docs/FEATURES.md](docs/FEATURES.md)。
## 硬件要求
### 必需条件
- 配备 [Kali NetHunter](https://www.kali.org/docs/nethunter/) 的 **Android 手机**(已在 OnePlus 8,Snapdragon 865 上测试)
- 通过 [Magisk](https://github.com/topjohnwu/Magisk) 获取的 **Root 权限**
- **12GB+ 内存**(模型占用约 1.3GB,Android 系统占用约 4GB,其余供其他工具使用)
### 可选条件
- 用于离线 WiFi 破解模式的 **USB WiFi 适配器**(推荐使用 Ralink RT3572)
- 支持 MAC80211 监听模式的 **定制内核**([构建指南](docs/KERNEL_BUILD_PROMPT.md))
- 用于通过 Tailscale 卸载到更大模型的 **NVIDIA AGX**
### GPU 性能表现
所有推理均通过 Adreno 650 GPU 上的 OpenCL 进行:
| 模型 | 量化 | Prompt 速度 | 生成速度 |
|-------|-------------|-------------|-----------------|
| **LFM2.5-1.2B-Instruct-Heretic** (生产环境) | Q8_0 | 115 tok/s | 13 tok/s |
| Qwen3.5-0.8B | Q8_0 | 30.5 tok/s | 6.3 tok/s |
| Qwen3.5-4B | Q4_0 | 10.1 tok/s | 2.0 tok/s |
## 快速开始
```
# 1. 安装(在 Kali NetHunter chroot 内)
bash INSTALL.sh
# 2. 等待 llama-server 启动(启动后约 5 分钟)
curl -s http://127.0.0.1:8080/health # Should return {"status":"ok"}
# 3. 启动所有服务
bash scripts/run-36h.sh
# 4. 打开 web dashboard(从你的 Tailscale 网络中的任何设备)
# https://:8888
```
### 演练模式(不执行真实命令)
```
NC_DRY_RUN=1 python3 main.py
```
这会使用一个模拟的 Kali 服务器,让您能够在不执行真实网络命令的情况下测试 agent 循环。
### 手动启动(如果未使用 tmux 启动器)
```
kali-server-mcp --port 5000 &
python3 scope_proxy.py --config config.yaml --port 8800 --upstream http://127.0.0.1:5000 &
bash scripts/webui-daemon.sh start
python3 main.py &
```
## 配置说明
在部署前编辑 `config.yaml`:
```
mission:
id: "CLIENT-YYYY-XXX" # Your engagement ID
scope:
networks: ["auto"] # "auto" = detect from wlan0 at startup
excluded_hosts: ["auto"] # "auto" = gateway + self IP
excluded_ports: [502, 503] # SCADA/ICS ports to never touch
authorization: "ROE-YYYY-XXX.pdf"
max_runtime_hours: 0 # 0 = no limit
model:
local:
ctx_size: 8192
port: 8080
```
**动态范围检测**意味着在不同网络间移动时无需更改任何配置—— agent 会在启动时从 `wlan0` 读取当前的子网信息。
## 项目结构
```
nightcrawler/
├── main.py # Entry point
├── config.yaml # Mission scope + model config
├── scope_proxy.py # Scope enforcement proxy
├── INSTALL.sh # Installer
│
├── agent/ # Core agent logic
│ ├── loop.py # Decision loop + error recovery
│ ├── planner.py # Phase state machine (recon → exploit)
│ ├── llm_client.py # LLM API client (llama.cpp / remote)
│ ├── db.py # SQLite backend (hosts, vulns, creds)
│ ├── host_memory.py # Per-host observations + auto-tagging
│ ├── cve_db.py # 24,956-entry CVE database
│ ├── attack_planner.py # Strategic directives for exploit phase
│ ├── output_parser.py # Extract structured data from tool output
│ ├── offline_manager.py # WiFi breach pipeline state machine
│ ├── net_detect.py # Auto-detect network from wlan0
│ ├── cover_traffic.py # Stealth blending with realistic web traffic
│ ├── passive_capture.py # Background tcpdump for broadcast traffic
│ └── ...
│
├── proxy/ # Scope enforcement components
│ ├── scope.py # IP/port/host validation
│ ├── rate_limiter.py # Command rate limiting + jitter
│ └── command_filter.py # Destructive command blocklist
│
├── webui/ # Web dashboard (Flask)
│ ├── server.py # API + stealth middleware
│ └── templates/index.html # Dashboard UI
│
├── data/ # Static data files
│ ├── cve_exploits.json # CVE→exploit command mappings
│ └── playbooks.json # 27 multi-step attack playbooks
│
├── prompts/ # LLM prompt templates (hot-reloadable)
├── scripts/ # Operational scripts (start, stop, watchdogs)
├── tests/ # Test suites (API, UI, offline mode)
├── kernels/ # WiFi driver modules + kernel docs
├── simulation/ # Dry-run mock server
├── docs/ # Architecture, GPU setup, features
├── logs/ # Runtime data (gitignored)
└── models/ # Model files (gitignored)
```
## Agent 的思考方式
该 agent 使用了一个简单但高效的循环:
1. **选择目标**——加权随机选择(70% 选择已知开放端口的主机,30% 用于发现新主机)
2. **构建上下文**——将主机记忆、网络观察结果、阶段指导注入 prompt
3. **询问 LLM**——模型生成 `REASONING: ... COMMAND: ...` (推理:... 命令:...)
4. **验证**——范围代理检查命令是否在授权范围内且不具备破坏性
5. **执行**——通过 Kali MCP 服务器运行命令
6. **学习**——输出解析器提取发现结果,更新主机记忆
7. **重置上下文**——清除对话历史,保留持久记忆,重复上述过程
1.2B 模型的命令成功率约为 50%(受限于其参数规模)。该 agent 通过以下方式进行补偿:
- **垃圾输出检测**——在连续 5 次无效输出后使用多样化的 few-shot 示例进行重置
- **重复检测**——强制实现工具/目标的多样化
- **基于时间的卡死检测**——5 分钟兜底机制强制重置上下文
- **直接执行 playbook**——多步骤攻击将完全绕过 LLM 执行
## Web 仪表盘
位于 `:8888` 的仪表盘提供实时监控和控制功能:
- **实时信息流**——展示每一条命令、发现结果和 agent 决策
- **主机卡片**——可点击的卡片,显示端口、服务、漏洞信息
- **网络拓扑图**——可交互的力导向图(支持拖拽、缩放、平移)
- **漏洞详情**——CVE 标签、漏洞利用链、修复步骤
- **C2 控制**——标星/拉黑主机、强制切换阶段、暂停/恢复、注入命令
- **离线模式**——灵感来自 Pwnagotchi 的 WiFi 攻击界面,配有动态表情
仪表盘具有隐蔽过滤功能:它会伪装成 nginx 的 Header,并对来自目标网络的连接返回空的 404 响应。
## 测试结果
基于在多个网络中累计超过 72 小时的自主运行数据:
- 每个网络中发现 **30+ 台主机**
- 自主执行了 **2,000+ 条命令**
- 在多项服务中发现了 **10+ 个漏洞**
- 通过直接执行方式运行了 **6+ 个 playbook**
- Agent 内存全程稳定在 35-50MB(无内存泄漏)
## 法律声明
**本工具仅供授权的渗透测试使用。** 在部署 Nightcrawler 之前,您必须获得网络所有者的书面许可(交战规则 / ROE)。未经授权对您不拥有或未获准测试的网络进行操作是违法行为。
## 开源许可
MIT 协议——详情请参阅 [LICENSE](LICENSE)。
标签:AST分析, Kali NetHunter, Veh, 威胁模拟, 插件系统, 本地AI, 目录枚举, 移动安全, 红队自动化, 逆向工具