
在攻防对抗的实战场景中,渗透测试人员常常面临一个痛点:发现漏洞后,需要一个能够高效交互的终端来维持访问、执行命令和管理会话。传统的命令行界面虽然强大,但学习成本高,操作流程繁琐。为了提升效率,我将AI助手与自研的C2框架相结合,打造了一个能够通过自然语言进行交互的“智能指挥官”。
我自研的这套C2框架(代号 Eagle C2)支持HTTP/ICMP协议,实现了诸如BOF执行、动态数据包构造等Cobalt Strike中的核心功能,它也是我的毕业设计作品。框架的内置目标是:让渗透测试人员可以更专注于漏洞发掘与利用逻辑,而将复杂的会话管理、任务下发等操作交给AI。于是,我通过集成MCP(Model Context Protocol)协议和内置大语言模型,为框架装上了“智能大脑”。

Eagle AI助手自我介绍及功能说明

通过自然语言创建并查询HTTP/ICMP监听器
实现AI长期记忆的设计思路
要让AI助手真正像一个“搭档”而非一次性的问答机器,长期记忆是关键。当前业内实现大模型记忆的主流模式大致有六种,每种都有其适用场景:
1. 缓冲记忆
这是最基础的模式,像一个“全文复读机”,将所有历史对话原封不动地拼接进每次的Prompt。
- 优点:语境还原精准,不丢失细节。
- 缺点:Token消耗随对话长度爆炸式增长,极易超出模型上下文窗口。
2. 缓冲窗口记忆
为解决长度问题,引入了“滑动窗口”概念,只保留最近的K轮对话。
- 优点:Token消耗稳定,避免模型因历史过长而混乱。
- 缺点:缺乏“长时记忆”,对话久了会忘记早期主题。
3. 令牌缓冲记忆
按Token数量而非对话轮数进行截断,实时监控并删除最早的内容以维持总量在阈值内。
4. 摘要总结记忆
不再存储原始对话,而是定期调用LLM对历史进行浓缩摘要,新对话时只提供“梗概”。
- 优点:极大节省空间,保留长期核心要点。
- 缺点:摘要过程会损失细节,且需额外消耗计算资源。
5. 摘要缓冲混合记忆
这是目前最均衡的方案,结合了“总结”与“缓冲”。
- 原理:对近期对话保留原始内容以保证细节;对较早对话进行摘要压缩以保留背景。
- 优点:兼顾近期连贯性与长期背景信息。
6. 向量存储库记忆
本质上是RAG在对话记忆中的应用,将每轮对话向量化存储,提问时进行语义检索。
- 优点:拥有“海量记忆”,能关联跨长时间的相关信息。
- 缺点:检索结果可能是碎片化的,可能缺乏连续性。
在我的实现中,我选择了摘要缓冲混合记忆。这种模式能确保在长对话中,助手依然能记住用户的操作习惯和偏好。基础实现是将用户与大模型的问答内容嵌入下一次对话,实现一个滑动窗口式的短期记忆。
相关核心代码如下,它负责构建系统提示词,并按顺序拼接内置提示词、历史记忆和用户自定义指令:
// buildSystemPrompt 构建完整的系统提示词
// 组装顺序:内置提示词 → 长期记忆 → 用户自定义提示词
func buildSystemPrompt(memory string, customPrompt string) string {
prompt := defaultSystemPrompt
if memory != "" {
prompt += "\n\n# 历史记忆\n以下是之前对话的关键摘要,帮助你保持上下文连续性:\n" + memory
}
if customPrompt != "" {
prompt += "\n\n# 用户自定义指令\n" + customPrompt
}
return prompt
}

然而,单纯的缓冲记忆在长期对话后会导致上下文窗口急剧膨胀。因此,我设置了阈值(例如100次对话后),触发自动摘要压缩,将冗长的历史提炼为精华,再与近期消息拼接使用。
// compressMemoryIfNeeded 当记忆条目达到阈值时,调用 LLM 压缩合并
func (a *Agent) CompressMemoryIfNeeded(cfg AIConfig) {
count := a.memory.CountEntries()
if count < compressThreshold {
return
}
Log.Printf("[Agent] 记忆条目达到 %d,开始 LLM 压缩...", count)
fullMemory := a.memory.ReadFull()
if fullMemory == "" {
return
}
messages := []ChatMessage{
{
Role: "system",
Content: `你是一个记忆压缩助手。下面是一个 AI 助手的长期记忆,包含多条时间标记的条目。请将这些记忆压缩合并为 20-30 条最重要的条目,规则:
1. 保留最重要的事实、用户偏好、关键操作记录
2. 合并相似或重复的条目
3. 删除已过时或无关紧要的内容
4. 保持 Markdown 格式,每条用 ` + "`## 日期`" + ` 开头
5. 最近的条目优先保留,较早的可以合并摘要
6. 只输出压缩后的记忆内容,不要其他解释`,
},
{
Role: "user",
Content: fullMemory,
},
}
// ... 调用LLM进行压缩,并更新记忆存储
}

但这仍有一个问题:程序重启后,内存中的记忆会丢失。为了解决这个问题,我引入了一个Markdown文件作为整个AI助手记忆的“物理白板”,所有压缩后的长期记忆和关键摘要都持久化存储在其中。

持久化存储记忆的Markdown文件

Markdown文件中记录的历史交互摘要
通过“内存混合记忆 + 磁盘持久化存储”的组合,我们最终实现了一个拥有长期记忆、能够熟悉系统操作并指导后渗透流程的智能“贾维斯”。
通过MCP实现AI与C2的无缝交互
接下来要解决的是AI如何与C2框架的实际功能进行交互。最直接的想法是在Agent代码里硬编码一堆工具函数,但这种方法有两个致命缺点:
- 扩展性差:工具与特定Agent强绑定,无法被其他AI模型或客户端复用。
- 维护性差:大量工具代码会侵入核心框架,导致代码臃肿,耦合度高。
我选择了MCP(Model Context Protocol)方案。MCP允许我将C2框架的所有功能(如创建监听器、管理会话、下发任务)以标准工具的形式暴露出来,任何支持MCP的客户端(如Claude Desktop、Cursor、Windsurf)都可以直接调用这些工具,实现了框架与AI的松耦合。
开发过程本身也采用了AI辅助的“Vibe Coding”模式:
- 生成接口文档:首先让AI分析框架所有的API路由,生成一份结构清晰的接口文档,明确每个端点的功能、参数和返回值。

- 实现MCP Server:基于接口文档,让AI编写一个独立的MCP服务模块。这个模块通过HTTP调用框架原有API,并将其包装成MCP标准工具,对框架核心代码做到了零侵入。

最终,我只需在C2主逻辑中启动这个MCP Server,它就成为了连接AI智能与C2能力的桥梁。
总结与展望
在AI驱动的开发范式下,“Vibe Coding”正成为提升效率的利器。开发者的核心竞争力也在发生转移:从深陷底层的代码实现细节,更多地转向高层的系统架构设计,以及对提示词工程的精细化把控。
这次将AI助手深度集成到自研C2框架中的实践,正是这一思路的体现。通过MCP协议解耦,通过混合记忆方案实现持久化智能,最终打造出一个能够用自然语言指挥复杂攻防操作的系统原型。
目前,Eagle C2 仍处于封闭测试与完善阶段。为了确保系统的稳定性和安全性,暂未对外开放。期待在未来,能将这个融合了AI智能的开源实战项目带到更多安全研究者面前,与大家在像云栈社区这样的技术交流平台共同探讨。请再多给我一点时间,我将全力打磨,力求交出一份完美的答卷。