From e860c84975bb1354a40b2ce9586e1cc08c57cce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Wed, 24 Dec 2025 17:23:14 +0800 Subject: [PATCH] Add files via upload --- internal/attackchain/builder.go | 110 ++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 14 deletions(-) diff --git a/internal/attackchain/builder.go b/internal/attackchain/builder.go index f24c47c6..8be985ca 100644 --- a/internal/attackchain/builder.go +++ b/internal/attackchain/builder.go @@ -335,20 +335,36 @@ func (b *Builder) buildSimplePrompt(reactInput, modelOutput string) string { ## 核心原则 **目标:让不懂渗透测试的同学可以通过这个攻击链路学习到知识,而不是无数个节点看花眼。** -**即便某些工具执行或漏洞挖掘没有成功,只要它们提供了关键线索、错误提示或下一步思路,也要被保留下来。** +**⚠️ 特别重要:失败路径和错误经验同样具有重要价值!** + +**失败路径的价值:** +- **指引作用**:失败的尝试往往揭示了系统的防御机制、配置信息或攻击面边界 +- **学习价值**:展示"为什么这条路走不通"、"遇到了什么障碍"、"如何绕过或解决" +- **完整还原**:真实的渗透测试过程包含大量失败尝试,只展示成功路径会误导学习者 +- **关键线索**:即使工具执行失败,错误信息、超时、拒绝连接等都可能包含重要信息(如WAF类型、防护策略、端口状态等) + +**必须保留的失败路径类型:** +1. **工具执行失败但提供了线索**:如"工具未安装"、"权限不足"、"连接被拒绝"、"超时"等,这些信息有助于理解环境限制 +2. **漏洞验证失败但指明了方向**:如"SQL注入尝试失败,但暴露了数据库类型"、"XSS尝试被WAF拦截,但暴露了WAF规则" +3. **扫描失败但揭示了防护**:如"端口扫描被防火墙拦截"、"目录枚举被限制"、"暴力破解被锁定" +4. **配置错误或环境问题**:如"工具配置错误"、"目标不可达"、"证书验证失败"等,这些可能揭示系统配置问题 +5. **AI分析中的失败尝试**:如果AI在对话中明确提到"尝试了X但失败了,因为Y",这也应该被记录 **关键要求:** 1. **节点标签必须简洁明了**:每个节点标签控制在15-25个汉字以内,使用简洁的动宾结构 - - action节点要描述"做了什么"和"发现了什么"(如"扫描端口发现22/80/443"、"验证SQL注入成功"、"WAF拦截暴露厂商") + - action节点要描述"做了什么"和"发现了什么"(如"扫描端口发现22/80/443"、"验证SQL注入成功"、"WAF拦截暴露厂商"、"SQLMap扫描失败(工具未安装)") + - 失败路径的标签应明确标注失败原因(如"尝试SQL注入(被WAF拦截)"、"端口扫描(连接超时)") - 避免冗长描述,关键信息放在metadata中详细说明 2. **严格控制节点数量**:优先保留关键步骤,避免生成过多细碎节点。理想情况下,单个目标的攻击链应控制在8-15个节点以内 - - 如果节点太多(>20个),优先保留最重要的节点,合并或删除次要节点 + - 如果节点太多(>20个),优先保留最重要的节点(包括重要的失败路径),合并或删除次要节点 - 合并相似的action节点(如同一工具的连续调用,如果结果相似) - 对于同一类型的多个发现,考虑合并为一个节点(如"发现多个开放端口"而不是为每个端口创建节点) + - **但不要因为节点数量限制而删除有价值的失败路径** 3. **确保DAG结构**:生成的图必须是有向无环图(DAG),不允许出现循环。边的方向必须符合时间顺序和逻辑关系(从早期步骤指向后期步骤) - 生成后必须检查:确保图中不存在循环(即不存在路径A→B→...→A) - 如果发现循环,必须断开形成循环的边,保留最重要的连接 -4. **层次清晰**:攻击链应该呈现清晰的层次结构:目标 → 信息收集 → 漏洞发现 → 漏洞利用 → 后续行动 + - **失败路径也应该正确连接到后续的成功路径**(如"尝试A失败" → "改用B方法成功") +4. **层次清晰**:攻击链应该呈现清晰的层次结构:目标 → 信息收集(包括失败的尝试) → 漏洞发现 → 漏洞利用 → 后续行动 ## ⚠️ 重要原则 - 严禁杜撰 @@ -380,9 +396,14 @@ func (b *Builder) buildSimplePrompt(reactInput, modelOutput string) string { **action(行动)**:**工具执行 + AI分析结果 = 一个action节点** - 将每个工具执行和AI对该工具结果的分析合并为一个action节点 - **节点标签必须简洁**:控制在15-25个汉字,使用动宾结构,描述"做了什么"和"发现了什么" - - 好的示例:"扫描端口发现22/80/443"、"验证SQL注入成功"、"WAF拦截暴露厂商" + - 成功示例:"扫描端口发现22/80/443"、"验证SQL注入成功"、"WAF拦截暴露厂商" + - **失败示例(必须保留)**:"尝试SQL注入(被WAF拦截)"、"端口扫描(连接超时)"、"SQLMap扫描(工具未安装)"、"目录枚举(权限不足)" - 避免冗长描述,关键信息放在metadata中详细说明 -- 若为失败但有线索的行动,请在metadata.status中标记为"failed_insight",并在findings中写清线索价值 +- **⚠️ 失败路径处理规则**: + - **必须创建节点**:如果工具执行失败但提供了任何线索、错误信息或指引,必须创建action节点 + - **标记失败状态**:在metadata.status中标记为"failed_insight",并在findings中详细说明失败原因和获得的线索 + - **说明线索价值**:在ai_analysis中明确说明"为什么这个失败很重要"、"提供了什么信息"、"如何指引了后续行动" + - **连接后续节点**:失败路径应该连接到后续的成功路径,展示"失败 → 调整策略 → 成功"的完整过程 - **重要:action节点必须关联到正确的target节点(通过工具执行参数判断目标)** - **risk_score**:**action节点没有风险,risk_score必须设置为0**(只有vulnerability节点才有风险等级) @@ -398,9 +419,25 @@ func (b *Builder) buildSimplePrompt(reactInput, modelOutput string) string { ### 3. 过滤规则(重要!) -- **必须忽略**没有任何输出、没有线索的失败执行 -- **必须保留**失败但提供关键线索的执行,确保metadata里解释清楚 -- 只保留对学习或溯源有帮助的节点 +**必须忽略的失败执行(可以删除):** +- 完全没有输出、没有任何错误信息的失败 +- 纯粹的系统错误(如"内存不足"、"磁盘满"等),且与测试目标无关 +- 重复的、完全相同的失败尝试(只保留第一次) + +**必须保留的失败执行(必须创建节点):** +- **工具执行失败但提供了线索**:如错误信息、超时、拒绝连接、权限错误等 +- **漏洞验证失败但指明了方向**:如"SQL注入尝试失败,但暴露了数据库类型"、"XSS被WAF拦截,但暴露了WAF规则" +- **扫描失败但揭示了防护**:如"端口扫描被防火墙拦截"、"目录枚举被限制"、"暴力破解被锁定" +- **配置或环境问题**:如"工具未安装"、"目标不可达"、"证书验证失败"等,这些可能揭示系统配置问题 +- **AI明确分析的失败尝试**:如果AI在对话中明确提到"尝试了X但失败了,因为Y",必须记录 + +**判断标准:** +- 如果失败提供了**任何**有助于理解系统、调整策略或学习的信息,就必须保留 +- 如果失败揭示了**任何**关于目标系统、防护机制或环境配置的信息,就必须保留 +- 如果失败指引了**后续的成功尝试**,就必须保留并建立连接关系 +- **宁可多保留一些失败路径,也不要遗漏有价值的线索** + +**只保留对学习或溯源有帮助的节点**:包括成功路径和重要的失败路径 ### 4. 关联关系(确保DAG结构) @@ -426,9 +463,15 @@ func (b *Builder) buildSimplePrompt(reactInput, modelOutput string) string { **action节点metadata必须包含:** - tool_name: 工具名称(必须与ReAct中的tool_calls一致) - tool_intent: 工具调用意图(如"端口扫描"、"漏洞扫描"、"目录枚举"等) -- ai_analysis: AI对工具结果的分析总结(不超过100字,失败节点需解释线索价值) -- findings: 关键发现列表(数组,如["发现80端口开放", "检测到WAF"]) -- status: 可选,若为失败但有线索的行动,标记为"failed_insight",并在findings中写清线索价值 +- ai_analysis: AI对工具结果的分析总结(不超过150字) + - **成功节点**:总结关键发现和结果 + - **失败节点**:**必须详细说明**:①失败的具体原因 ②获得了什么线索或信息 ③这些线索如何指引了后续行动 ④为什么这个失败很重要 +- findings: 关键发现列表(数组) + - 成功节点:如["发现80端口开放", "检测到WAF"] + - **失败节点**:必须包含失败原因和获得的线索,如["WAF拦截SQL注入尝试", "返回403错误", "目标部署了Web应用防火墙"] +- status: + - 成功节点:可以不设置或设置为"success" + - **失败节点:必须标记为"failed_insight"**,表示失败但提供了有价值的线索 **target节点metadata必须包含:** - target: 测试目标(URL、IP、域名等) @@ -474,8 +517,34 @@ func (b *Builder) buildSimplePrompt(reactInput, modelOutput string) string { "metadata": { "tool_name": "sqlmap", "tool_intent": "SQL注入测试", - "ai_analysis": "sqlmap工具未安装,无法进行SQL注入测试,需要先安装工具", - "findings": ["工具未安装,需要先安装sqlmap工具"], + "ai_analysis": "sqlmap工具未安装,无法进行SQL注入测试。这个失败揭示了测试环境的工具配置情况,需要先安装工具才能继续测试。", + "findings": ["工具未安装,需要先安装sqlmap工具", "环境配置限制:缺少SQL注入测试工具"], + "status": "failed_insight" + } + }, + { + "id": "node_5", + "type": "action", + "label": "尝试SQL注入(被WAF拦截)", + "risk_score": 0, + "metadata": { + "tool_name": "manual_test", + "tool_intent": "SQL注入验证", + "ai_analysis": "尝试SQL注入攻击时被WAF拦截,返回403错误。这个失败提供了重要线索:目标部署了WAF防护,且WAF规则较为严格。后续可以尝试绕过WAF或寻找其他攻击面。", + "findings": ["WAF拦截SQL注入尝试", "返回403错误", "目标部署了Web应用防火墙"], + "status": "failed_insight" + } + }, + { + "id": "node_6", + "type": "action", + "label": "端口扫描(连接超时)", + "risk_score": 0, + "metadata": { + "tool_name": "nmap", + "tool_intent": "端口扫描", + "ai_analysis": "对目标进行端口扫描时,多个端口连接超时。这个失败表明目标可能部署了防火墙或IDS,对扫描行为进行了检测和拦截。超时信息有助于了解目标的防护策略。", + "findings": ["多个端口连接超时", "可能部署了防火墙或IDS", "目标对扫描行为有防护"], "status": "failed_insight" } }, @@ -518,6 +587,19 @@ func (b *Builder) buildSimplePrompt(reactInput, modelOutput string) string { **再次强调:如果没有实际数据,返回空的nodes和edges数组。严禁杜撰!** +## ⚠️ 关于失败路径的最后提醒 + +**请特别注意:在生成攻击链时,不要只关注成功的路径,也要仔细检查ReAct输入中的所有失败尝试。** + +**检查清单(在生成节点前,请逐一检查):** +1. ✅ 是否所有工具执行失败都被检查过了? +2. ✅ 每个失败是否提供了线索、错误信息或指引? +3. ✅ 失败路径是否连接到了后续的成功路径? +4. ✅ 失败节点的metadata是否详细说明了线索价值? +5. ✅ 是否因为节点数量限制而误删了重要的失败路径? + +**记住:一个完整的攻击链应该展示真实的渗透测试过程,包括成功和重要的失败尝试。失败路径不是噪音,而是宝贵的经验和学习材料!** + 只返回JSON,不要包含其他解释文字。`, reactInput, modelOutput) }