基于ReAct与LLM的自主渗透测试与防御规则生成系统VANGUARD解析
1. 项目概述:一个能自主渗透测试并撰写防御规则的AI
在网络安全领域,渗透测试和威胁检测是防御体系的两大支柱,但它们之间往往存在一道难以逾越的鸿沟。红队(攻击方)发现漏洞,生成一份报告;蓝队(防御方)收到报告,再手动将其转化为安全信息和事件管理(SIEM)系统中的检测规则。这个过程不仅耗时数天甚至数周,更关键的是,它依赖于静态的、预定义的攻击剧本,无法模拟真实攻击者那种动态、自适应的推理和攻击链构建能力。大多数现有的入侵与攻击模拟(BAS)工具,如Cymulate、Pentera等,正是在这个问题上止步不前。
VANGUARD项目正是为了弥合这道鸿沟而生。它不是一个简单的漏洞扫描器,而是一个认知紫队代理——一个将自主攻击推理与自动化防御规则生成融为一体的系统。简单来说,你给它一个目标,它会像一名真正的攻击者那样去思考、探索、利用漏洞,并将整个攻击链的每一步“思考”和行动都记录下来。测试结束后,它不会仅仅给你一份PDF报告,而是会分析自己的攻击行为,找出当前SIEM系统未能检测到的“盲点”,并自动为这些盲点生成可立即部署的Elasticsearch KQL检测规则。
这个项目的核心价值在于其闭环自动化和思维透明化。它不仅告诉你“哪里被攻破了”,还展示了“攻击者是如何一步步思考并做到的”,最后直接给出“如何防御下一次同类攻击”的解决方案。对于安全工程师、SOC分析师和任何希望提升主动防御能力的技术团队来说,这提供了一个全新的视角和工具链,将传统的、滞后的安全评估转变为实时、自适应的持续安全验证。
2. 核心架构与设计哲学
2.1 从传统BAS到认知代理的范式转变
传统的BAS工具工作流是线性的、封闭的:加载攻击剧本 -> 执行预定义测试用例 -> 生成通过/失败报告。这种模式存在两个根本性缺陷:
- 缺乏适应性:现代高级持续性威胁(APT)和熟练的攻击者不会照本宣科。他们会根据目标环境的反馈(如错误信息、开放的端口、应用程序行为)实时调整策略,将看似无关的弱点串联成一条独特的攻击路径。预定义的剧本无法模拟这种基于上下文的推理。
- 反馈循环断裂:即使BAS工具发现了防御缺口,其输出(通常是一份报告)与防御行动(编写和部署检测规则)之间需要大量人工介入。这个延迟窗口给了真实攻击者可乘之机。
VANGUARD的设计哲学是构建一个具有认知能力的单一智能体,它同时扮演攻击者和防御分析师的“紫队”角色。其核心循环是一个完整的OODA环(观察、判断、决策、行动)的自动化实现:
- 观察:接收目标(如URL)和任务目标。
- 判断与决策:大型语言模型(LLM)分析当前状态,推理下一步最佳行动。
- 行动:选择并调用合适的工具(如执行命令、发送HTTP请求)进行操作。
- 再观察:获取行动结果,作为下一轮判断的输入。
这个循环的关键在于,LLM在每次行动前都必须输出其“思考过程”(thought),这使得整个攻击链的逻辑完全透明,而不仅仅是记录了一堆离散的动作。
2.2 ReAct(推理+行动)循环详解
VANGUARD的实现核心是ReAct模式,这是一种让LLM在思考(Reasoning)和行动(Acting)之间交替进行的技术。与单纯执行代码或调用API的Agent不同,ReAct要求Agent在每一步都“说出”它的理由。
系统提示词是引导Agent行为的关键。VANGUARD使用的提示词严格定义了其角色、任务和输出格式:
{ "thought": "我注意到目标应用有一个登录端点。为了测试认证绕过,我应该先尝试基本的SQL注入载荷。我将使用' OR '1'='1' -- 作为用户名字段的值。", "action": "http_request", "input": { "method": "POST", "url": "http://target/login", "data": {"username": "' OR '1'='1' --", "password": "anything"} } }这个JSON结构是Agent与执行环境之间的契约。thought字段迫使LLM进行因果推理,这带来了两大好处:一是提高了动作序列的逻辑性和成功率;二是生成了无价的审计线索,安全分析师可以据此理解攻击者的思维模型。
工具集的设计平衡了自主性与安全性。Agent拥有三个核心工具:
execute_command: 在严格沙箱中执行系统命令,用于信息收集(如whoami、ifconfig)或利用漏洞(如命令注入)。http_request: 发送HTTP请求,用于Web应用模糊测试、API探测和漏洞利用。read_file: 读取文件内容,通常限制在/tmp/等安全目录,用于读取漏洞利用后的结果(如/etc/passwd)。
安全设计要点:赋予AI对系统的访问权限是危险的。VANGUARD通过一个致命的操作系统命令阻止列表(
FATAL_OS_BLOCKLIST)来实施硬性防护。这个列表包含像rm -rf /、shutdown、mkfs、dd if=等具有破坏性的命令模式。任何匹配这些模式的命令请求都会被系统拦截并终止,确保Agent无法对宿主机造成实质性损害。这是一种“负面清单”模式,在允许最大操作自由度的同时,守住安全底线。
2.3 目标套件:真实漏洞,而非模拟
为了有效训练和评估Agent,项目内置了三个精心设计的、包含真实漏洞的Flask应用。这些不是简单的“漏洞标志”检查,而是实现了真实漏洞模式的完整应用:
vulnerable_app.py:一个单体API,包含经典漏洞。
- SQL注入:使用危险的字符串拼接
f"SELECT * FROM users WHERE username='{username}'...",Agent需要发现并利用它进行认证绕过或数据窃取。 - 路径遍历:文件下载接口未对用户输入进行规范化,允许
../../../etc/passwd这样的路径。 - 命令注入:通过未参数化的
os.system()调用,将用户输入直接传递给Shell。 - 信息泄露:一个未受保护的
/debug端点泄露服务器环境变量。
- SQL注入:使用危险的字符串拼接
cloud_storage.py:模拟云存储API,关注逻辑与配置漏洞。
- JWT
alg: none攻击:服务器接受将算法标头设置为none的令牌,从而绕过签名验证。 - 不安全的直接对象引用(IDOR):文件访问API的SQL查询
WHERE file_id='{file_id}'缺少用户所有权检查,导致越权访问。 - 命令注入:通过未过滤的
format参数触发。
- JWT
legacy_erp.py:模拟老旧企业系统,包含更复杂的漏洞链。
- XXE注入:自定义XML解析器解析了外部实体
<!ENTITY xxe SYSTEM "file:///etc/passwd">。 - 服务器端请求伪造(SSRF):一个代理端点未对内部网络请求进行限制。
- 硬编码密钥:API令牌明文写在代码注释或配置文件中。
- XXE注入:自定义XML解析器解析了外部实体
这套目标环境确保了Agent是在对抗“真实”的漏洞,考验其发现、理解和串联不同漏洞类型的能力。
3. 实操部署与核心环节实现
3.1 环境准备与一键启动
VANGUARD的设计考虑了易用性,通过一个Shell脚本封装了所有依赖的启动流程。以下是手动分步部署的详细过程,这有助于理解整个系统的组成部分。
第一步:满足先决条件确保你的开发环境满足以下要求:
- 操作系统:Linux或macOS(Windows可通过WSL2运行)。
- Python:版本3.10或更高。建议使用
pyenv或conda管理Python环境,避免系统Python冲突。 - Docker & Docker Compose:用于运行Elasticsearch和Kibana。这是必须的,因为项目依赖Elasticsearch作为日志存储和规则引擎。
- Ollama:用于本地运行LLM模型。从Ollama官网下载并安装,然后拉取所需模型。
# 安装Ollama后,拉取推荐的模型(Qwen2.5 7B是一个更优的平衡选择) ollama pull qwen2.5:7b # 或者使用项目提到的模型 ollama pull qwen3:8b第二步:克隆项目与依赖安装
git clone https://github.com/usualdork/VANGUARD.git cd VANGUARD # 创建并激活Python虚拟环境(强烈推荐) python3 -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 安装Python依赖 pip install -r requirements.txtrequirements.txt通常包含fastapi,uvicorn,elasticsearch,requests等关键库。
第三步:理解并运行启动脚本项目提供的run_demo.sh脚本完成了以下关键工作:
- 启动Elasticsearch和Kibana:使用Docker Compose在后台启动这两个服务。Elasticsearch的默认端口是9200,Kibana是5601。
- 配置Elasticsearch索引:创建用于存储Agent遥测数据(
vanguard-telemetry)、模拟告警(vanguard-alerts)和生成规则(vanguard-rules)的索引。 - 预配Kibana仪表板:导入预定义的仪表板,用于可视化攻击链、检测率和生成的规则。
- 启动FastAPI后端:启动VANGUARD的主逻辑服务器。
- 启动前端UI:通常是一个简单的Streamlit或HTML界面,用于交互和控制。
你可以直接运行脚本:
chmod +x run_demo.sh ./run_demo.sh或者,为了更深入地理解,你可以打开脚本,按顺序手动执行其中的命令。启动后,访问http://localhost:8501(或脚本指定的端口)应该能看到VANGUARD的Web界面。
3.2 发起一次自主渗透测试
在Web界面中,操作通常直观明了:
- 选择目标:从下拉列表中选择一个内置的脆弱应用(如
http://localhost:5001/vulnerable_app)。 - 设置参数:可以配置最大推理步数(如50步)、使用的LLM模型等。
- 启动测试:点击“Start Assessment”按钮。
此时,魔法开始了。前端会通过Server-Sent Events (SSE)连接到后端,实时显示Agent的推理过程。你会看到类似这样的流式输出:
[THOUGHT] 任务开始。目标是一个Web应用。第一步是进行侦察,识别开放的端点和应用技术栈。 [ACTION] 执行命令: `curl -s http://localhost:5001/` [OBSERVATION] 返回HTML,包含登录表单和几个API链接。 [THOUGHT] 发现登录端点 `/login`。我将首先测试该端点是否存在SQL注入漏洞。尝试使用经典的单引号闭合。 [ACTION] HTTP请求: POST /login, 数据: `username=admin' --&password=1` [OBSERVATION] 返回状态码200,但内容显示“登录失败”。然而,没有SQL错误。可能需要尝试布尔盲注。这个实时反馈界面是VANGUARD最引人注目的特性之一,它让你仿佛在“旁观”一个AI黑客的大脑。
3.3 SIEM间隙分析与规则生成流程
测试结束后,后端会触发两个关键的后处理流程。
间隙分析:
- 日志索引:Agent执行过程中的所有动作(包括
thought,action,observation)都已附带时间戳和唯一关联ID(Correlation ID)存入vanguard-telemetry索引。 - 查询模拟告警:系统会查询
vanguard-alerts索引,寻找在测试时间窗口内、具有相同关联ID的告警记录。这个索引代表了现有SIEM规则(在演示中,这些规则很弱或不存在)的检测结果。 - 计算检测率:对比Agent的动作数量和SIEM告警数量,生成一份间隙报告。在演示环境中,由于“蓝方传感器”是基础版,检测率通常是0%。这不是说VANGUARD能绕过所有企业级SIEM,而是清晰地演示了“如果防御方没有针对特定攻击手法配置规则,那么攻击将完全不被察觉”这一概念。
自主规则合成: 这是项目的创新点。系统会将完整的攻击日志喂给另一个LLM(可以是同一个模型,但使用不同的提示词),并指令它扮演“防御分析师”。
防御分析师提示词示例:
你是一名精英防御网络安全分析师。请审阅攻击者的执行日志,并为该攻击序列编写现实可行的SOC启发式规则(Elasticsearch KQL、Sigma格式或行为模式)。请专注于可观测的、在日志中留下的攻击痕迹。 攻击日志:[此处插入JSON格式的攻击链] 请以JSON数组格式回复,每个规则包含id、rule_name、severity和logic字段。LLM会分析攻击链,识别出关键的可检测点。例如,针对一次成功的SQL注入攻击,它可能生成如下规则:
[ { "id": "VANGUARD-SQLi-001", "rule_name": "Web App - Potential SQL Injection via UNION-based Payload", "severity": "High", "logic": "http.request.method: POST AND url.path: \"/login\" AND http.request.body: \"UNION SELECT\" AND event.outcome: \"success\"" }, { "id": "VANGUARD-SQLi-002", "rule_name": "Database - High Volume of Sensitive Data Extraction", "severity": "Critical", "logic": "event.dataset: \"database.query\" AND db.query.text: /SELECT.*(password|credit_card|ssn)/ AND volume > 1000 within 1m" } ]生成的规则会被自动索引到vanguard-rules中,并立即在UI的“SOC Rules”标签页中展示出来,与已有的规则并列。
4. 技术深度解析与定制化探讨
4.1 Server-Sent Events (SSE) 透明层实现
实时流式传输是VANGUARD用户体验的核心。它没有采用复杂的WebSocket,而是选择了更轻量、更适合服务器向客户端单向推送数据的SSE。
后端(FastAPI)的实现关键在于异步队列,它充当了同步的ReAct循环线程与异步的HTTP响应之间的桥梁。
- 当用户发起测试请求时,后端创建一个异步队列(
asyncio.Queue)。 - 在一个单独的线程中启动ReAct主循环,并传入一个回调函数。每当Agent完成一步(思考、行动、观察),回调函数就将该事件放入队列。
- 主API端点是一个异步生成器,它持续从队列中获取事件,并将其格式化为SSE数据流(
data: {json}\n\n)发送给客户端。 - 前端使用
EventSourceAPI监听这个流,并实时更新UI。
这种设计实现了真正的“人在回路中”。操作员可以实时监控AI的决策过程。如果发现Agent即将执行一个危险或偏离目标的操作(尽管有阻止列表,但逻辑错误仍可能发生),操作员可以通过UI上的“停止”按钮中断测试。这种透明性和可控性对于将AI应用于攻防这类敏感领域至关重要。
4.2 模型选择与提示工程实战
LLM是VANGUARD的“大脑”,模型的选择和提示词的打磨直接决定了系统的效能。
模型选择考量:
- 本地化与隐私:Ollama支持在本地运行开源模型,避免了将敏感的渗透测试目标和数据发送到云端API(如OpenAI)的风险,符合安全项目的本质要求。
- 性能与能力平衡:
qwen3:8b或更新更强的qwen2.5:7b在7B-8B参数量级上提供了较好的推理能力和代码理解能力,同时资源消耗(约8-10GB RAM)在普通开发机上可接受。更大的模型(如70B)可能效果更好,但对硬件要求极高。 - 量化与优化:为了在资源受限或空气隔离环境中部署,可以使用经过量化的模型版本(如
qwen2.5:7b-q4_K_M),在几乎不损失精度的情况下大幅减少内存占用和提升推理速度。
提示工程技巧: VANGUARD的成功很大程度上依赖于精心设计的系统提示词。除了前文展示的基础版本,在实践中还需要不断迭代优化:
- 角色设定强化:明确告知模型其角色是“授权的安全测试员”,并强调道德边界。
- 输出格式强制:使用
format="json"参数和严格的JSON结构描述,确保LLM的输出可被程序解析。在提示词中提供更详细的JSON Schema示例能提高稳定性。 - 上下文管理:随着测试步骤增加,对话历史(
messages)会变长。需要设计策略来防止上下文窗口被耗尽,例如只保留最近N步的详细交互,或对早期的观察进行摘要。 - 工具描述细化:在提示词中详细描述每个工具的功能、输入参数格式和预期输出,能减少LLM调用工具时的错误。
- 引导探索策略:初始提示词可以包含一些高级策略引导,如“首先进行信息收集,识别技术栈和入口点;然后针对每个功能点进行常见漏洞测试;最后尝试将发现的漏洞串联起来进行横向移动或提权”。
4.3 扩展与集成:超越演示环境
演示环境使用Elasticsearch,但在真实企业环境中,你可能需要集成其他SIEM。
规则翻译器:可以构建一个适配层,将LLM生成的通用攻击模式描述,转换为特定SIEM的查询语言。
- Splunk: 生成SPL (Search Processing Language) 查询。
- Microsoft Sentinel: 生成KQL (Kusto Query Language) 查询(注意,此KQL非Elasticsearch KQL,语法不同)。
- IBM QRadar: 生成AQL (Ariel Query Language) 或定义QRadar规则。 实现方式可以是在规则生成提示词中指定目标SIEM,或者在后端添加一个翻译模块,将中间表示(如Sigma规则)转换为目标格式。
与真实CI/CD管道集成:生成的规则不应直接投入生产。更安全的做法是:
- VANGUARD将生成的规则提交到一个Git仓库(如GitLab)的合并请求(MR)中。
- 触发CI/CD管道,在一个隔离的测试SIEM环境中自动部署这些规则。
- 运行自动化测试(可以再次使用VANGUARD的测试套件)验证规则的有效性(是否能检测到攻击)和误报率。
- 通过所有测试后,MR需要一名资深安全分析师进行人工评审和批准,最后才合并到生产规则库。
多代理群模式:这是项目规划中的高级形态。可以部署多个具有不同专长的AI代理:
- 侦察代理:专注于信息收集和绘制攻击面。
- 漏洞利用代理:专注于对特定漏洞进行深度利用。
- 横向移动代理:在获得初始立足点后,专注于在内网中移动。
- 防御代理(蓝队):实时监控攻击代理的活动,并尝试生成和部署缓解规则。 这些代理通过一个中央协调器或共享状态(如Redis)进行通信和协作,模拟更复杂的红蓝对抗。
5. 常见问题、排查与避坑指南
在实际搭建和运行VANGUARD的过程中,你可能会遇到一些典型问题。以下是一些常见问题的排查思路和解决方案。
5.1 环境与依赖问题
问题1:Ollama模型下载慢或失败
- 现象:
ollama pull命令卡住或报网络错误。 - 排查:检查网络连接,特别是是否配置了正确的代理(如果需要)。Ollama默认使用官方仓库,国内网络可能较慢。
- 解决:
- 使用镜像:配置Ollama使用国内镜像源(如果可用)。
- 手动导入:从其他途径下载模型的
Modelfile和权重文件,使用ollama create手动创建。 - 选择更小模型:先尝试
llama3:8b或qwen2.5:7b,它们比更大尺寸的模型下载更快。
问题2:Docker容器启动失败(端口冲突)
- 现象:运行
run_demo.sh时,Elasticsearch或Kibana容器无法启动,日志显示端口被占用。 - 排查:使用
sudo lsof -i :9200或sudo netstat -tulpn | grep :9200检查9200(ES)和5601(Kibana)端口是否已被占用。 - 解决:
- 停止冲突服务:停止占用端口的本地Elasticsearch或Kibana实例。
- 修改配置:编辑项目的
docker-compose.yml文件,将容器端口映射到宿主机其他空闲端口(如"9300:9200"),并同步修改VANGUARD后端配置中连接Elasticsearch的地址。
问题3:Python依赖安装冲突
- 现象:
pip install -r requirements.txt报错,提示某些包版本不兼容。 - 排查:查看具体的错误信息,通常是两个包对某个共同依赖的版本要求冲突。
- 解决:
- 使用虚拟环境:确保在全新的虚拟环境中操作,避免与系统或其他项目的包冲突。
- 尝试升级pip:
pip install --upgrade pip。 - 手动解决:根据错误信息,尝试单独安装有冲突的包,指定一个兼容的版本,例如
pip install elasticsearch==8.12.0。可能需要反复尝试,或查阅项目Issue页面看是否有已知的依赖问题。
5.2 运行时与逻辑问题
问题4:Agent陷入循环或执行无意义操作
- 现象:在UI中看到Agent反复执行类似的操作,无法推进测试,或者
thought内容变得混乱、脱离目标。 - 排查:
- 检查模型:确认使用的LLM模型是否具备足够的推理和代码能力。太小的模型(如3B以下)可能无法胜任复杂任务。
- 审查提示词:系统提示词是否足够清晰?是否明确限制了任务范围和步骤?尝试在提示词中加入更明确的指令,如“如果连续3次尝试未能获得新发现,请总结当前发现并结束测试”。
- 观察上下文:可能是上下文窗口被旧信息占满,导致模型“失忆”。查看后端日志中发送给模型的完整消息历史。
- 解决:
- 切换模型:尝试
qwen2.5:14b或llama3:70b等能力更强的模型(如果硬件允许)。 - 优化提示词:引入“逐步思考”的引导,或设置最大步数后强制结束。
- 实现上下文窗口管理:在代码中,当对话历史超过一定长度(如4096个token)时,对早期的
observation进行摘要,只保留关键的thought和action。
- 切换模型:尝试
问题5:生成的SIEM规则质量不佳或不可用
- 现象:规则逻辑过于宽泛(导致高误报),或过于具体(只匹配本次测试的精确载荷),或语法错误。
- 排查:分析LLM在规则生成阶段的输入(攻击日志)和输出。攻击日志是否包含了足够多、具有代表性的可观测事件?规则生成提示词是否要求输出特定SIEM的语法?
- 解决:
- 丰富攻击日志:确保Agent的动作日志不仅包含成功利用,也包含侦察、失败尝试等行为,这些同样是可检测的信号。
- 改进规则生成提示词:提供更具体的指令和示例。例如:“请基于攻击模式而非具体载荷生成规则。例如,检测SQL注入应关注
UNION、SELECT、SLEEP(等关键词的出现,而不是具体的' OR '1'='1字符串。” - 后处理校验:在规则入库前,增加一个简单的语法校验步骤,或者尝试在测试Elasticsearch实例中预执行一下KQL,捕获明显错误。
- 定位为“初稿”:接受当前技术的局限性,将AI生成的规则视为安全分析师的“第一稿”,必须经过人工审查、调优和测试后才能部署。
问题6:SSE流式传输中断或前端无更新
- 现象:启动测试后,前端界面卡住,看不到实时日志。
- 排查:
- 打开浏览器开发者工具(F12),查看“网络”(Network)标签页,过滤XHR或SSE请求,检查到
/api/v1/pentest/stream的连接状态和返回数据。 - 查看后端服务日志,确认ReAct循环是否正常启动,是否有异常抛出。
- 打开浏览器开发者工具(F12),查看“网络”(Network)标签页,过滤XHR或SSE请求,检查到
- 解决:
- 检查CORS:如果前端和后端在不同端口,确保FastAPI已正确配置CORS中间件。
- 检查防火墙/代理:本地环境通常没问题,但在某些网络配置下,SSE长连接可能被中断。
- 后端超时设置:确保后端SSE端点没有设置过短的超时时间。
5.3 安全与伦理注意事项
重要警告:VANGUARD是一个功能强大的安全测试工具。请务必严格遵守以下原则:
- 仅用于授权测试:只对你自己拥有或已获得明确书面授权进行测试的系统、网络和应用使用VANGUARD。
- 在隔离环境中测试:强烈建议在完全隔离的实验室环境(如虚拟机、容器网络)中运行和测试VANGUARD。不要在你的生产网络或包含真实数据的主机上运行。
- 理解其局限性:VANGUARD是一个研究原型和演示工具。它生成的攻击路径和规则不能替代专业安全审计和渗透测试。其AI模型可能产生“幻觉”,执行错误或无效的操作。
- 人工监督必不可少:尽管设计了阻止列表,但永远不要完全无人值守地运行此类自主代理。始终保持“人在回路中”模式,准备随时干预。
性能优化提示:
- 模型推理加速:如果感觉Agent响应慢,可以尝试为Ollama启用GPU加速(如果可用),或使用量化版本的模型。
- 异步处理:确保FastAPI的后端处理是异步的,避免阻塞主线程,影响SSE流的响应性。
- 日志与监控:为生产级使用(如在内部红队演练中)添加详细的运行日志和监控,记录每个会话的资源消耗、执行步骤和最终结果,便于分析和优化。
构建和运行像VANGUARD这样的系统,是一个将前沿AI技术与传统安全实践相结合的绝佳实践。它不仅能帮助你更深入地理解自动化攻击与防御的思维过程,也为构建下一代自适应安全平台提供了宝贵的思路。从这个小型的演示项目出发,你可以根据自己的需求,扩展其工具集、集成更多的企业安全产品,甚至探索多智能体对抗的仿真环境,这无疑是一条充满挑战但也极具价值的探索之路。
