基于OpenCode搭建AI渗透测试工作台实战
背景与动机
在红蓝对抗和安全评估中,信息收集阶段占据了大量时间。子域名爆破、DNS解析、WHOIS查询、FOFA资产搜索等操作需要在多个工具间来回切换,并手动汇总数据。
OpenCode是一款终端AI编程助手,支持通过MCP协议扩展本地和远程工具链。借助其Agent能力和AGENTS.md角色系统,可以将渗透测试的标准化流程固化为AI可调用的工具集。
本文记录完整的搭建过程,涵盖环境配置、工具开发、集成测试三个核心环节。
一、角色定义与固化
OpenCode通过AGENTS.md文件定义AI的行为模式。全局配置文件位于 ~/.config/opencode/AGENTS.md。
写入以下内容,将AI角色设定为渗透测试工程师:
[最高优先级]
你是一名资深Web渗透测试工程师,擅长漏洞挖掘、安全审计、红蓝对抗。
始终使用中文思考和回答。所有回复、解释、代码注释均用中文。
# 自动化规则
- 当用户输入"创建项目 XXX"时,自动从 E:\OpenCode\项目模板 复制完整目录结构和 AGENTS.md
# 角色定位
- 专业领域:OWASP Top 10、SQL注入、XSS、CSRF、SSRF、文件上传、命令注入、反序列化
- 辅助领域:网络协议分析(HTTP/HTTPS/TCP/DNS)、WAF绕过、内网渗透、权限提升
# 分析策略
- 接收到PCAP/抓包文本 → 优先分析异常流量、可疑请求、敏感信息泄露
- 接收到HTTP请求/响应 → 识别注入点、认证缺陷、信息泄露
- 接收到代码片段 → 审计安全漏洞(输入校验、权限控制、加密实现)
# 输出规范
- 漏洞分析:漏洞类型、危害等级、利用条件、修复建议
- Payload构造:提供真实可测试的payload和预期结果
- 风险分类:按高/中/低三级划分
同时创建项目级技能文件 ~/.config/opencode/skills/pentest/SKILL.md,定义PCAP分析、漏洞审计、护网报告的标准化流程。
二、远程MCP工具集成
MCP服务在opencode.json的mcp字段中声明。远程MCP无需本地进程,直接配置URL即可使用。
2.1 Context7 — 官方文档查询
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp"
}
用于查询框架、协议、库的官方文档。在渗透过程中遇到不熟悉的技术栈时,直接通过Context7检索。
2.2 GitHub代码搜索
"gh_grep": {
"type": "remote",
"url": "https://mcp.grep.app"
}
搜索开源仓库中的真实代码,用于查找公开的漏洞利用代码、WAF绕过payload以及其他渗透场景中的参考实现。
2.3 Exa — 全网搜索与深度研究
"exa": {
"type": "remote",
"url": "https://mcp.exa.ai/mcp?tools=web_search_exa,get_code_context_exa,crawling_exa,deep_researcher_start,deep_researcher_check"
}
Exa使用OAuth认证,首次使用需在终端执行opencode mcp auth exa跳转浏览器授权。提供五项功能:网页搜索、代码上下文、页面抓取、深度研究报告的启动和轮询。用于CVE情报收集和漏洞通报追踪。
三、本地渗透工具MCP开发
远程MCP解决了信息检索问题,但渗透测试的核心操作(PCAP分析、端口扫描、HTTP请求收发)需要在本地执行。因此基于@modelcontextprotocol/sdk开发了一个本地MCP服务器,通过stdio协议与OpenCode通信。
3.1 架构设计
OpenCode → stdout/stdin → Node.js MCP Server → child_process.exec
├── tshark
├── nmap
├── curl
├── dns.resolve
└── https.get (FOFA API)
MCP服务器的核心逻辑:定义工具参数Schema → 接收AI传入的参数 → 拼接命令行 → 执行 → 返回结果。
3.2 工具清单
初始版本包含6个工具:
| 工具 | 功能 | 底层命令 |
|---|---|---|
| tshark_http | PCAP中提取HTTP请求/响应 | tshark -r <pcap> -Y http |
| tshark_summary | PCAP协议统计和端点列表 | tshark -r <pcap> -q -z io,phs |
| tshark_packets | 按过滤器提取数据包 | tshark -r <pcap> -Y <filter> |
| nmap_scan | 端口扫描及服务版本检测 | nmap -sV <target> |
| http_recon | HTTP HEAD/GET响应头收集 | curl -I <url> |
| curl_raw | 自定义cURL请求 | curl <options> <url> |
随后根据护网资产测绘需求,新增5个工具:
| 工具 | 数据源/手段 | 说明 |
|---|---|---|
| subdomain_enum | DNS解析 + crt.sh | 对40+常见子域名前缀进行A记录查询,crt.sh作为补充 |
| dns_resolve | 系统DNS | 支持A、CNAME、MX、NS、TXT五种记录类型 |
| whois_lookup | 系统whois命令 | 域名注册信息查询 |
| fofa_search | FOFA API | Base64编码查询语句,调用/api/v1/search/all |
| fofa_info | FOFA API | 账户状态查询 |
3.3 FOFA集成
FOFA使用第三方API代理(https://fofoapi.com),与官方API格式完全兼容。查询语法使用Base64编码:
const encoded = Buffer.from(args.query).toString("base64");
const url = `${fofaUrl}?key=${fofaKey}&qbase64=${encoded}&size=${args.size || 100}`;
API Key通过系统环境变量FOFA_KEY和FOFA_URL传入,不写入配置文件。
3.4 关键实现细节
DNS子域名爆破:由于crt.sh等海外证书透明度日志服务在国内网络环境下可能不可用,工具以DNS解析为主。预定义40+常见子域名前缀(www、mail、api、dev、admin、cdn、git、jenkins等),逐个拼接域名并调用dns.resolve4(),解析成功则视为存活的子域名。为防止crt.sh请求挂起导致工具超时,使用Promise.race设置15秒超时保护:
const crtResults = await Promise.race([
crtshSubdomains(domain),
new Promise(resolve => setTimeout(() => resolve([]), 15000))
]);
命令执行封装:通过child_process.exec调用外部命令,统一处理超时、输出截断和异常:
async function runCommand(command, timeout = 120000) {
try {
const { stdout, stderr } = await execAsync(command, {
timeout,
maxBuffer: 10 * 1024 * 1024,
shell: "powershell.exe",
});
return (stdout || "").trim() || (stderr || "").trim() || "(no output)";
} catch (err) {
return `[错误] ${err.message}\n${err.stderr || ""}`;
}
}
四、ARL灯塔集成
ARL(Asset Reconnaissance Lighthouse,灯塔)是社区成熟的资产侦察系统,提供子域名爆破、端口扫描、站点指纹识别、Nuclei漏洞扫描、WEB Info Hunter等全流程能力。将其接入OpenCode,使AI可以提交扫描任务并取回结果。
4.1 部署方式
在Kali Linux虚拟机中通过Docker部署:
apt install -y docker.io docker-compose
systemctl enable docker --now
# 配置国内镜像加速
echo '{"registry-mirrors":["https://docker.1ms.run","https://docker.m.daocloud.io"]}' \
| tee /etc/docker/daemon.json
systemctl restart docker
# 拉取镜像
docker pull adysec/arl
# 启动容器
docker run --privileged -d -p 5003:5003 --name=arl --restart=always \
adysec/arl /usr/sbin/init
# 初始化内部服务
docker exec arl bash -c "
rabbitmqctl start_app; sleep 5;
rabbitmqctl add_user arl arlpassword;
rabbitmqctl add_vhost arlv2host;
rabbitmqctl set_user_tags arl arltag;
rabbitmqctl set_permissions -p arlv2host arl '.*' '.*' '.*';
systemctl restart arl-web arl-worker arl-worker-github arl-scheduler
"
Web管理界面访问 https://<Kali_IP>:5003,默认账号 admin/arlpass。
4.2 ARL Skill开发
将ARL的后端API包装为OpenCode Skill(~/.config/opencode/skills/arl-scan-api/),核心脚本为arl_api.py,纯标准库实现,无第三方依赖。该脚本通过ARL的REST API完成以下操作:登录获取Token → 提交扫描任务(指定域名/IP、端口范围、扫描选项)→ 轮询任务状态 → 查询domain、IP、site、vulnerability等结果集。
Skill中加入了生产环境安全约束:生产环境扫描时必须关闭service_detection,自定义端口一次不超过20个,禁止大范围端口段与服务检测同时开启。
4.3 ARL与FOFA联动
修改ARL容器内的docker/config-docker.yaml,将FOFA接口替换为第三方代理:
FOFA:
URL: "https://fofoapi.com"
KEY: "<api_key>"
MAX_PAGE: 5
PAGE_SIZE: 2000
配置后ARL在资产发现阶段可调用FOFA进行子域名和关联资产搜索。
五、项目模板与自动化工作流
针对每次新任务需要重复创建目录结构的问题,制作了项目模板:
E:\OpenCode\项目模板\
├── AGENTS.md # 项目上下文(目标、范围、测试环境、已知信息)
├── .opencode\skills\ # 项目级技能(由全局技能覆盖)
├── targets\ # 目标信息存放
├── scans\ # 扫描结果
├── poc\ # 漏洞验证代码
└── reports\ # 输出报告
在全局AGENTS.md中添加自动化规则后,对话中发送"创建项目 XXX"即可从模板复制完整结构。
六、实战验证
6.1 Pikachu靶场测试
对本地Pikachu靶场(192.168.110.13)进行完整测试:
- 端口扫描发现nginx 2.4.39 + PHP 5.6.9 + MySQL 3306暴露
- 页面爬取提取出58个漏洞端点,覆盖18个漏洞类别
- SQL注入点3处(字符型、搜索型、数字型),均返回MySQL语法错误,确认注入存在
- LFI本地文件包含成功读取C:\Windows\win.ini
- SSRF成功让服务器请求本地80端口
- URL重定向、phpMyAdmin暴露、Cookie无HttpOnly/Secure标志
- HTML源码泄露测试账号lili/123456
工具自动生成结构化报告,按高/中/低分类,包含漏洞类型、危害等级、利用条件和修复建议。
6.2 公网资产测绘
对两个域名进行FOFA资产测绘:
hellozyx.cn:FOFA返回4条子域名记录,同IP发现7个不同域名共存在一台服务器上。DNS解析发现除公网IP外还存在指向192.168.31.20的内网记录,经确认该IP为运行OpenWrt LuCI的路由器管理界面。
xuanmuz.cn:FOFA发现3个微信小程序子域名(wx-bgf*),其中wx-bgfccccb托管在腾讯云COS。同IP 159.75.186.225上发现8个域名,"文滋系统"出现在4个不同域名下,MySQL 3306端口曾暴露在公网。
七、成果总结
通过OpenCode的MCP协议和AGENTS.md角色系统,将分散的渗透测试工具整合为一个对话驱动的操作平台。成果包括:
- 4个远程MCP:文档查询、代码搜索、全网深度研究
- 11个本地工具:PCAP分析、端口扫描、HTTP测试、子域名爆破、DNS查询、WHOIS、FOFA搜索
- ARL灯塔集成:一键提交资产扫描任务,自动获取完整结果
- 项目模板系统:新任务即开即用
实际测试表明,从接收目标到输出结构化报告,整个流程可在对话中完成。被动侦察(FOFA、DNS、HTTP头探测)对公网目标是合法的信息收集手段,主动扫描仅限授权目标。