摘要
随着大语言模型(LLM)与智能体(Agent)技术的成熟,自动化渗透测试正在从固定脚本、扫描器编排走向“智能体驱动”的新阶段。Agent 不再只是调用工具,而是能够理解任务、规划步骤、执行命令、分析结果并动态调整策略。要实现这一目标,核心在于将渗透测试能力抽象为可复用、可组合、可审计的Skill(技能)。本文讨论 Agent 自动化渗透测试中 Skill 的设计方法、组成要素、分类体系、实现示例以及落地挑战,帮助安全团队构建可控、高效的自动化安全测试能力。
1. 背景:从脚本自动化到 Agent 自动化
传统自动化渗透测试通常有两种形态:
固定流程脚本:按照预设步骤执行端口扫描、漏洞扫描、报告生成,缺乏灵活性。
人工驱动的工具编排:安全工程师手动选择工具、解释结果、决定下一步,自动化程度有限。
LLM Agent 的引入改变了这一局面。Agent 可以利用语言理解能力,将“对目标进行 Web 漏洞探测”这样的高层任务拆解为多个子任务,并自主选择合适的工具和参数。但 LLM 本身并不具备渗透测试的专业知识,如果只依赖模型自由发挥,容易出现以下问题:
工具选择错误或参数使用不当;
执行危险操作或超出授权范围;
结果解读不准确,产生误报或漏报;
行为不可复现、不可审计。
因此,需要将渗透测试的专业能力封装为Skill,让 Agent 在受控框架内调用这些能力。
2. Skill 是什么:Agent 的“专业技能包”
在 Agent 自动化渗透测试中,Skill 不是简单的“工具封装”,而是一个包含上下文、约束、决策逻辑和结果解释的能力单元。
一个完整的 Skill 通常包含以下要素:
name: web-directory-enumeration version: 1.2.0 description: 对授权 Web 目标进行目录和文件枚举,发现隐藏路径 author: security-team tags: [web, recon, enumeration] triggers: - 当需要发现 Web 应用隐藏目录、备份文件、管理入口时 - 当获得一个 Web 服务地址且需要扩大攻击面时 required_tools: - ffuf - httpx parameters: target_url: type: string required: true description: 目标基础 URL,例如 https://example.com wordlist: type: string required: false default: /usr/share/wordlists/dirbuster/common.txt threads: type: integer required: false default: 40 min: 1 max: 100 policy: require_authorization: true max_requests_per_second: 50 allowed_scope: ["*.example.com", "192.168.1.0/24"] forbidden_paths: ["/admin", "/config"] steps: - validate_target - run_enumeration - filter_results - summarize_findings可以看到,Skill 不仅定义了“做什么”,还定义了“什么时候做”“用什么做”“有什么限制”“结果如何解释”。
3. Skill 的组成要素
一个设计良好的渗透测试 Skill 应包含以下核心部分。
3.1 元数据
名称、版本、作者、标签:便于版本管理和检索。
描述:用自然语言说明 Skill 的能力边界,帮助 Agent 判断是否适用。
3.2 触发条件
触发条件帮助 Agent 在规划阶段选择正确的 Skill。例如:
“发现开放 80/443 端口且存在 Web 服务”时触发 Web 枚举 Skill;
“获得一组用户名和密码”时触发凭据验证 Skill;
“发现 SQL 报错信息”时触发 SQL 注入检测 Skill。
触发条件可以使用自然语言描述,也可以使用结构化标签或规则。
3.3 输入输出契约
每个 Skill 都应定义清晰的输入参数和输出格式。输出最好是结构化 JSON,便于 Agent 进行下一步推理。
json { "skill": "web-directory-enumeration", "target": "https://example.com", "findings": [ { "url": "https://example.com/admin", "status_code": 200, "content_length": 1024, "title": "Admin Login" } ], "summary": "发现 1 个疑似管理入口" }结构化输出可以极大提高 Agent 的后续决策质量。
3.4 工具链与执行逻辑
Skill 内部可能调用一个或多个工具。执行逻辑定义了工具之间的数据流和错误处理。例如:
text
httpx 探测存活 -> ffuf 目录枚举 -> 过滤响应码 -> 输出结构化结果
3.5 策略与权限边界
这是安全自动化中最关键的部分。Skill 必须明确:
是否要求人工授权;
允许的目标范围;
请求速率限制;
禁止的危险操作;
敏感数据脱敏规则。
例如,对于“漏洞验证”类 Skill,可以要求必须经过人工确认后才能执行,避免对生产系统造成影响。
3.6 结果解释与建议
Skill 不仅输出原始工具结果,还应提供“结果意味着什么”以及“下一步建议”。例如:
json { "finding": "目标存在 SQL 报错,疑似 SQL 注入", "confidence": "medium", "next_steps": ["使用 sqlmap 进行验证", "检查 WAF 拦截情况"] }这使 Agent 能够基于 Skill 的语义理解进行更准确的推理。
4. 渗透测试 Skill 分类体系
根据渗透测试的常见阶段,可以将 Skill 划分为以下几类:
4.1 侦察类 Skill
端口扫描与服务识别:封装 Nmap、Masscan 等工具;
子域名枚举:封装 subfinder、amass 等;
Web 指纹识别:封装 whatweb、wappalyzer 等;
目录与文件枚举:封装 ffuf、dirsearch 等。
4.2 漏洞扫描类 Skill
通用漏洞扫描:封装 Nuclei、OpenVAS 等;
Web 漏洞检测:SQL 注入、XSS、SSRF、文件包含等;
组件漏洞识别:根据版本信息匹配 CVE。
4.3 凭据测试类 Skill
弱口令检测:SSH、RDP、数据库、Web 登录;
密码喷洒:在授权范围内进行低频率尝试;
凭据有效性验证:验证已获取凭据的访问范围。
4.4 利用与后渗透类 Skill
漏洞利用验证:在测试环境中验证漏洞可利用性;
权限提升检测:检查本地提权条件;
横向移动探测:检测内网可达性和信任关系。
4.5 报告与修复类 Skill
自动生成漏洞报告;
根据漏洞类型推荐修复方案;
将结果映射到 ATT&CK 框架或合规标准。
5. Skill 设计原则
5.1 最小权限原则
每个 Skill 只应具备完成其任务所需的最小权限和工具调用能力。例如,目录枚举 Skill 不应拥有数据库写入权限或系统 shell 权限。
5.2 可组合原则
Skill 之间应能通过标准化输入输出进行组合。例如:
text
端口扫描 Skill -> Web 指纹识别 Skill -> 目录枚举 Skill -> 漏洞扫描 Skill
这种组合可以由 Agent 动态完成,也可以由预设的“工作流模板”完成。
5.3 可审计原则
每次 Skill 调用都应记录:
执行时间;
输入参数;
执行的命令;
输出结果;
是否触发策略限制;
是否经过人工授权。
审计日志是自动化渗透测试合规性的基础。
5.4 失败处理原则
网络抖动、工具报错、目标不响应是常见情况。Skill 应具备重试、降级和超时机制。例如,如果ffuf失败,可以尝试使用dirsearch作为备选工具。
5.5 人机协作原则
高风险操作必须设置“人工确认点”。Agent 可以提出建议,但最终执行需要人工批准。例如:
text
Agent:发现目标 192.168.1.10 存在疑似 SQL 注入,是否执行漏洞验证? 工程师:确认执行,但仅允许使用 sqlmap 的 --batch 模式。
6. 实现示例:一个最小可用的 Skill 框架
以下是一个简化版的 Skill 抽象设计,使用 Python 伪代码表示:
python from typing import Any, Dict, List from dataclasses import dataclass @dataclass class Policy: require_authorization: bool = False max_rps: int = 0 allowed_scope: List[str] = None forbidden_actions: List[str] = None @dataclass class SkillResult: skill_name: str success: bool findings: List[Dict[str, Any]] raw_output: str summary: str next_steps: List[str] class Skill: name: str description: str triggers: List[str] required_tools: List[str] parameters: Dict[str, Any] policy: Policy async def execute(self, ctx: Dict[str, Any]) -> SkillResult: raise NotImplementedError一个具体的端口扫描 Skill 实现:
python class PortScanSkill(Skill): name = "port-scan" description = "对授权目标进行端口扫描和服务识别" triggers = ["需要发现目标开放端口和服务时"] required_tools = ["nmap"] async def execute(self, ctx): target = ctx["target"] ports = ctx.get("ports", "1-1000") # 检查授权范围 if not self.check_authorization(target): return SkillResult( skill_name=self.name, success=False, findings=[], raw_output="", summary="目标不在授权范围内,已终止执行", next_steps=[] ) # 执行 nmap 扫描 cmd = f"nmap -sV -p {ports} {target}" raw_output = await run_command(cmd) # 解析 nmap 输出 findings = parse_nmap_output(raw_output) summary = f"发现 {len(findings)} 个开放端口" next_steps = ["对发现的 Web 服务进行指纹识别"] return SkillResult( skill_name=self.name, success=True, findings=findings, raw_output=raw_output, summary=summary, next_steps=next_steps )在实际系统中,Skill 可以注册到 Skill Registry 中,由 Agent 的规划器进行检索和调用。
7. Agent 如何调用 Skill:规划—执行—反思
Agent 自动化渗透测试通常采用“规划—执行—反思”的循环。
7.1 规划
Agent 接收任务后,根据任务描述和已有上下文,从 Skill Registry 中选择合适的 Skill,并生成执行计划。例如:
任务:对 https://example.com 进行 Web 安全评估 计划: 1. 执行 web-fingerprint Skill 识别技术栈 2. 执行 web-directory-enumeration Skill 枚举目录 3. 根据指纹结果选择 web-vuln-scan Skill 4. 汇总结果并生成报告7.2 执行
Agent 按照计划依次调用 Skill。每个 Skill 返回结构化结果,Agent 将其加入上下文,作为后续决策的依据。
7.3 反思
如果某个 Skill 失败或结果不符合预期,Agent 需要反思:
是否是工具问题?尝试切换工具;
是否是参数问题?调整参数重试;
是否是 Skill 选择错误?更换其他 Skill;
是否需要人工介入?
这种循环使 Agent 具备一定的自适应能力,同时通过 Skill 约束保证行为可控。
8. 落地挑战与应对
8.1 误报与漏报
LLM 可能对工具输出产生错误解读,导致误报或漏报。应对方法包括:
要求 Skill 输出结构化、可验证的结果;
引入多个工具的交叉验证;
对高危发现进行人工复核;
使用专门的验证 Skill 确认漏洞。
8.2 模型幻觉
LLM 可能生成不存在的工具参数或虚构的结果。应对方法:
限制 Agent 只能调用已注册的 Skill;
要求 Skill 返回原始工具输出,而不是让模型自由生成;
在提示词中强调“不得编造未观察到的事实”。
8.3 安全与合规
自动化渗透测试必须严格限制在授权范围内。应对方法:
在 Skill 的策略层强制授权检查;
使用网络隔离、速率限制和操作白名单;
记录完整审计日志;
对高风险操作设置人工确认点。
8.4 工具稳定性
安全工具版本更新频繁,输出格式可能变化。应对方法:
使用容器化环境固定工具版本;
对工具输出解析器进行版本管理;
定期回归测试 Skill 的可用性。
8.5 评估与迭代
Skill 的质量需要持续评估。可以建立测试靶场,对 Skill 进行自动化测试,评估其准确率、覆盖率和误报率,并根据结果迭代优化。
9. 结语
Agent 自动化渗透测试的核心不是让模型“自由发挥”,而是将安全专家的经验固化为可复用、可组合、可审计的 Skill。一个良好的 Skill 体系能够:
降低 Agent 犯错概率;
提高自动化测试的效率和一致性;
保证测试过程的安全与合规;
让安全团队从重复劳动中解放出来,专注于高价值分析。
未来,随着 Agent 能力的增强,Skill 可能会进一步向“自主发现新 Skill”“跨工具动态编排”“多 Agent 协同”等方向演进。但无论如何变化,可控、可审计、最小权限始终是自动化渗透测试不可逾越的底线。