起源于@MuWinds闲来无事,所以打算写个Ai Agent练手
项目并不打算局限于BUUCTF,所以现在是手动输入题面的(更主要是我懒)。
愿景:成为各路CTF大手子的好伙伴,当然如果Agent能独当一面的话那最好不过~
- 支持全自动解题,包括题目分析,靶机探索,代码执行,flag分析全流程
- 支持命令行交互式解题
- 目前项目内置支持Python工具和SSH到装好环境的Linux机器进行解题
- 可扩展的CTF工具框架
- 可自定义的Prompt和模型文件
- 克隆仓库
git clone https://github.com/MuWinds/BUUCTF_Agent.git
- 安装依赖
pip install -r .\requirements.txt
-
Docker容器配置(可选):这一步是配置Agent的执行环境,可以自己配虚拟机也可以用仓库里现成的Dockerfile,如果用docker的方式配置请提前安装好Docker
(1)先制作镜像:docker build -t ctf_agent .(2)再运行镜像,将镜像内ssh所用的22端口映射到宿主机的2201端口:
docker run -itd -p 2201:22 ctf_agent
如果用仓库里Dockerfile去创建Docker容器,SSH用户为root,密码为ctfagent。
-
修改配置文件:config.json,修改工具的配置文件 下面是是硅基流动API(OpenAI兼容模式的配置示例:)
{ "llm":{ "analyzer":{ "model": "deepseek-ai/DeepSeek-R1", "api_key": "", "api_base": "https://api.siliconflow.cn/" }, "solve_agent":{ "model": "deepseek-ai/DeepSeek-V3", "api_key": "", "api_base": "https://api.siliconflow.cn/" }, "pre_processor":{ "model": "Qwen/Qwen3-8B", "api_key": "", "api_base": "https://api.siliconflow.cn/" } }, "max_history_steps": 15, "compression_threshold": 7, "tool_config":{ "ssh_shell": { "host": "127.0.0.1", "port": 22, "username": "", "password": "" }, "python": { } }, "mcp_server": { "hexstrike": { "type": "stdio", "command": "python3", "args": [ "/root/hexstrike-ai/hexstrike_mcp.py", "--server", "http://localhost:8888" ] } } }在llm部分中,analyzer负责的是分析部分,problem_processor负责的是问题的处理部分,solve_agent则负责步骤执行的部分,这里推荐analyzer采用思维链的推理模型以提升对问题的思考能力,而pre_processor是对文字做预处理,采用参数量相对不大的小模型以节省费用。 mcp_server则是配置自己的mcp服务器,如果没有可配的直接不填也行,这里放入了hexstrike作为示例
本项目目前仅兼容OpenAI API类型的大模型
-
运行:
python .\main.py
允许用户本地环境运行Python代码(已完成)- 支持更多工具,比如二进制分析等,不局限于Web题和Web相关的密码学之类的
- 提供更美观的界面,比如Web前端或者Qt界面
- RAG知识库
将不同工具的LLM进行区分,或者按照思考推理与代码指令编写两种任务分派到不同的LLM(已完成)- 更好的MCP支持
- 实现不同OJ平台的自动化,提供手动输入题面之外更便捷的选择
支持附件输入已实现,需要在项目根目录的attachments目录下放入附件
目前项目已经内置支持Python工具和SSH到装好环境的Linux机器进行解题,如果还需要开发自己顺手的工具可以看这里
在项目的ctf_tool文件夹下,有base_tool.py:
class BaseTool(ABC):
@abstractmethod
def execute(self, *args, **kwargs) -> Tuple[str, str]:
"""执行工具操作"""
pass
@property
@abstractmethod
def function_config(self) -> Dict:
"""返回工具的函数调用配置"""
pass提供了抽象方法实例,其中必须包含execute和function_config这两个方法。
-
execute方法是提供直接执行的操作,返回的是执行的结果,为元组类型,元组的两个元素一个是正常输出,一个是报错输出,对顺序没有要求。 -
function_config方法是提供function call的配置通过Agent传给大语言模型,方便大语言模型决定什么情况下调用这个工具,该方法必须添加@property注解,且返回的格式相对固定,下面是一个远程执行shell的示例:
@property
def function_config(self) -> Dict:
return {
"type": "function",
"function": {
"name": "execute_shell_command",
"description": "在远程服务器上执行Shell命令,服务器内提供了curl,sqlmap,nmap,openssl等常用工具",
"parameters": {
"type": "object",
"properties": {
"purpose": {
"type": "string",
"description": "执行此步骤的目的"
},
"content": {
"type": "string",
"description": "要执行的shell命令"
},
"required": ["purpose", "content"]
}
}
}
}既然有shell代码的执行,请不要作死拿自己存着重要数据的机器让Agent执行代码,我不确保大语言模型一定不会输出诸如rm -rf /*这种奇怪东西,因为这种操作出现的各种问题请自行认命,项目仓库给了对应的Dockerfile方便各位拿来就用。
QQ群:

