基于大语言模型的多Agent协作渗透测试框架。
PenAgents将一次完整的渗透测试拆分为侦察、扫描、利用、验证、报告等阶段,由七个各司其职的Agent在LangGraph状态图上协同完成。框架借鉴了CHYing-agent项目"少即是多"的工具设计理念和"不完全信任LLM"的工程哲学,面向专业安全团队的实际渗透测试场景进行了重新设计。
现有的LLM渗透测试工具大多停留在"单Agent+工具列表"的模式,面对真实目标时往往陷入几个困境:Agent一路试到底不知道换方向,工具选择太多反而频繁出错,长对话导致上下文丢失。
PenAgents尝试用一种更接近真实安全团队分工的方式来解决这些问题:
- 指挥官负责全局规划和阶段推进,不直接碰工具
- 安全顾问在关键节点提供策略建议,连续失败时自动介入
- 四个专业Agent各自只关心自己的领域,工具集保持最小化
- 独立的验证员角色排除误报,确保每个发现都经过交叉验证
block-beta
columns 4
block:cmd:4
columns 4
space
Commander["Commander\nDeepSeek-R1\n全局规划/阶段控制\n任务分发"]
Advisor["Advisor\nDeepSeek-V3\n策略建议/知识库加载"]
space
end
space:4
block:spec:4
columns 4
Recon["Recon Agent\n信息收集"]
Scanner["Scanner Agent\n漏洞扫描"]
Exploit["Exploit Agent\n漏洞利用"]
Validator["Validator Agent\n结果验证"]
end
space:4
block:exec:4
columns 3
Docker["Docker / Kali 容器\nnmap, sqlmap, nuclei ..."]
Python["Python PoC 沙箱\n自定义脚本执行"]
Reporter["Reporter\n报告生成"]
end
space:4
block:base:4
columns 5
Skills["Skills 知识库"]
Evidence["证据链管理"]
Scope["范围管控"]
State["状态持久化"]
Audit["审计日志"]
end
Commander <--> Advisor
Commander --> Recon
Commander --> Scanner
Commander --> Exploit
Commander --> Validator
Recon --> Docker
Recon --> Python
Scanner --> Docker
Scanner --> Python
Exploit --> Docker
Exploit --> Python
Validator --> Python
style Commander fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
style Advisor fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
style Recon fill:#d1fae5,stroke:#10b981,color:#064e3b
style Scanner fill:#d1fae5,stroke:#10b981,color:#064e3b
style Exploit fill:#d1fae5,stroke:#10b981,color:#064e3b
style Validator fill:#d1fae5,stroke:#10b981,color:#064e3b
style Docker fill:#fef3c7,stroke:#f59e0b,color:#78350f
style Python fill:#fef3c7,stroke:#f59e0b,color:#78350f
style Reporter fill:#fef3c7,stroke:#f59e0b,color:#78350f
style Skills fill:#f3e8ff,stroke:#a855f7,color:#581c87
style Evidence fill:#f3e8ff,stroke:#a855f7,color:#581c87
style Scope fill:#f3e8ff,stroke:#a855f7,color:#581c87
style State fill:#f3e8ff,stroke:#a855f7,color:#581c87
style Audit fill:#f3e8ff,stroke:#a855f7,color:#581c87
style cmd fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style spec fill:#ecfdf5,stroke:#10b981,stroke-width:2px,color:#047857
style exec fill:#fffbeb,stroke:#f59e0b,stroke-width:2px,color:#b45309
style base fill:#faf5ff,stroke:#a855f7,stroke-width:2px,color:#7e22ce
工作流遵循PTES方法论,按阶段推进:
graph LR
A["授权确认"] --> B["信息收集"]
B --> C["漏洞扫描"]
C --> D["漏洞利用"]
D --> E["后渗透"]
E --> F["报告"]
style A fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
style B fill:#d1fae5,stroke:#10b981,color:#064e3b
style C fill:#d1fae5,stroke:#10b981,color:#064e3b
style D fill:#fef3c7,stroke:#f59e0b,color:#78350f
style E fill:#fef3c7,stroke:#f59e0b,color:#78350f
style F fill:#f3e8ff,stroke:#a855f7,color:#581c87
Commander控制阶段转换的时机。当某个阶段收集到足够信息后才会推进到下一步,而不是机械地按顺序走流程。
整个框架只有三个核心执行工具:
| 工具 | 用途 |
|---|---|
execute_command |
在Kali Docker容器中执行shell命令 |
execute_python_poc |
在沙箱中执行Python脚本 |
submit_finding |
提交确认的漏洞发现 |
工具越多,LLM需要匹配的模式就越复杂,出错概率也越高。把复杂度交给LLM的知识(通过Prompt和Skills注入),而不是堆工具数量。
skills/目录下有13类漏洞知识库(SQL注入、XSS、RCE、SSRF、SSTI、XXE、文件上传、认证绕过、IDOR、JWT、API安全、Web侦察、反序列化),每个都包含检测方法、实际payload、工具命令和修复建议。
Advisor Agent会根据当前上下文中的关键词自动匹配并加载最相关的知识库(最多3个),避免一次性塞入全部内容撑爆上下文窗口。
连续失败3次后Commander会自动切换攻击方向,连续失败6次触发Advisor介入提供替代策略。这个机制来自CHYing-agent在CTF比赛中的实战经验:一条路走不通就该换路,而不是反复重试。
每次执行命令前都会自动校验目标是否在授权范围内。支持IP地址、CIDR网段、域名(含子域名匹配)。同时内置命令黑名单,拦截rm -rf /、shutdown等破坏性操作。
长时间运行的渗透测试会产生大量工具输出。框架保留最近15条工具消息的完整内容,更早的工具输出会被压缩为摘要,防止对话历史超出模型的上下文限制。
- Python >= 3.11
- Docker(用于运行Kali工具容器)
- DeepSeek API Key
# 克隆项目
git clone https://github.com/your-org/pen-agents.git
cd pen-agents
# 安装依赖
pip install -e .
# 构建 Kali 工具镜像
cd docker
docker-compose build
cd ..
# 配置环境变量
cp .env.example .env
# 编辑 .env,填入 DeepSeek API Key.env中需要配置的关键项:
DEEPSEEK_API_KEY=sk-...
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
DEEPSEEK_REASONING_MODEL=deepseek-reasoner
DEEPSEEK_CHAT_MODEL=deepseek-chat
Commander和Exploit Agent使用推理模型(deepseek-reasoner),其余Agent使用对话模型(deepseek-chat)。如果API额度有限,可以在配置中统一指向deepseek-chat。
# 对单个目标执行渗透测试
pen-agents scan -t http://192.168.1.100
# 指定额外的授权范围
pen-agents scan -t http://target.com -s 192.168.1.0/24 -s 10.0.0.0/8
# 排除特定目标
pen-agents scan -t http://target.com -x http://production.target.com
# 限制最大迭代次数
pen-agents scan -t http://target.com -m 50
# 指定客户名称(用于报告)
pen-agents scan -t http://target.com -c "ACME Corp"启动后框架会依次执行:
- 验证目标是否在授权范围内
- Commander进入RECON阶段,派遣Recon Agent进行信息收集
- 根据侦察结果推进到SCANNING阶段,Scanner Agent识别潜在漏洞
- 发现可利用漏洞后进入EXPLOITATION阶段,Exploit Agent编写并执行PoC
- 每个漏洞发现由Validator Agent独立验证
- 最终Reporter Agent生成渗透测试报告,保存到
evidence/目录
过程中Advisor Agent会在阶段转换、连续失败、高风险操作等关键节点自动介入。
- 终端实时显示各Agent的执行进度
- 漏洞发现实时汇总(按严重程度分类)
- 最终报告以Markdown格式保存在
evidence/report_*.md
pen_agents/
main.py # 入口
src/pen_agents/
cli.py # CLI命令定义
graph.py # LangGraph状态图和路由逻辑
state.py # 状态定义和消息压缩
model.py # DeepSeek LLM实例管理
core/
config.py # 环境变量配置
constants.py # 全局常量、阶段枚举
agents/
commander.py # 指挥官:规划、分发、阶段控制
advisor.py # 安全顾问:策略建议、知识库加载
recon.py # 侦察员:信息收集
scanner.py # 扫描员:漏洞扫描
exploit.py # 攻击手:漏洞利用
validator.py # 验证员:独立验证、CVSS评分
reporter.py # 报告员:报告生成
tools/
shell.py # execute_command工具
python_executor.py # execute_python_poc工具
evidence_tools.py # submit_finding/save_evidence
scope_tools.py # check_scope工具
report_tools.py # generate_report工具
executor/
base.py # 执行器抽象基类
docker_native.py # Docker CLI执行器
factory.py # 执行器工厂
skills/
skill_loader.py # 按需知识库加载器
sqli/SKILL.md # SQL注入知识库
xss/SKILL.md # XSS知识库
... # 共13类漏洞知识库
scope/
manager.py # 范围管理(IP/CIDR/域名)
validator.py # 命令安全校验、黑名单
evidence/
collector.py # 证据收集器
store.py # SQLite持久化存储
reporting/
generator.py # Jinja2报告生成器
templates/ # 报告模板
prompts/
prompts_book.py # 全部Agent的系统提示词
utils/
common.py # 日志
rate_limiter.py # API和目标系统速率限制
failure_detector.py # 失败检测和自动止损
recon.py # HTTP自动侦察
docker/
Dockerfile # Kali工具镜像
docker-compose.yml # 容器编排
Commander通过结构化的[DISPATCH_TASK]指令向专业Agent分发任务:
[DISPATCH_TASK]
agent: scanner
phase: SCANNING
priority: HIGH
task: |
对目标 http://target.com/login 执行 SQL 注入检测
使用 sqlmap 的检测模式,不要进行实际数据提取
注意 WAF 可能存在,必要时使用 tamper 脚本
[/DISPATCH_TASK]
专业Agent收到任务后调用工具执行,结果回流到Commander进行汇总分析,再决定下一步动作。Advisor不参与执行,只在需要时提供战略层面的建议。
这种模式下,每个Agent的职责边界清晰,不会出现一个Agent试图包揽所有工作的情况。
| 组件 | 选型 | 说明 |
|---|---|---|
| 编排框架 | LangGraph | 状态图驱动的多Agent协作 |
| 大模型 | DeepSeek-R1/V3 | 推理模型用于规划,对话模型用于执行 |
| 执行环境 | Docker+Kali Linux | 隔离的渗透测试工具运行环境 |
| 状态持久化 | SQLite | 支持长周期测试的断点恢复 |
| 报告生成 | Jinja2 | 模板化的渗透测试报告 |
| 可观测性 | Langfuse | 全链路Trace记录 |
PenAgents的设计受CHYing-agent启发。CHYing-agent是一个面向CTF比赛的自动化求解系统,在腾讯云黑客松中获得第9名。它的几个核心设计理念被本项目继承:
- 极简工具集:CHYing-agent全程只用3个工具,证明了"工具越少、LLM决策越稳定"
- 顾问+主攻手的双Agent模式:模拟真实团队中的指导关系
- 消息压缩策略:保留近期输出、压缩历史,解决长对话的上下文问题
- 自动止损机制:连续失败后切换方向,避免在死路上浪费时间
PenAgents在此基础上做了以下调整以适应专业渗透测试场景:
- 从单目标快速攻击扩展为多阶段全流程管理(PTES)
- 增加范围管控和授权跟踪
- 引入独立的Validator角色进行交叉验证
- 增加证据链管理和专业报告生成
- 将Agent从2个扩展到7个,覆盖渗透测试的完整分工
- 当前版本以Web安全测试为主(OWASP Top 10),内网渗透、域渗透等场景尚未覆盖
- Agent的表现高度依赖底层大模型的能力,复杂的多步漏洞利用链可能需要人工介入
- Docker容器中的工具集是预装的,遇到需要特定工具的场景需要手动扩展镜像
- 速率限制和并发控制还比较基础,高并发场景下可能需要调优
本工具仅供经过授权的安全测试使用。使用者必须确保已获得目标系统所有者的明确书面授权。未经授权对计算机系统进行渗透测试属于违法行为,使用本工具造成的一切法律后果由使用者自行承担。
- CHYing-agent-核心设计理念的来源
- LangGraph-多Agent编排框架
- DeepSeek-大语言模型
MIT