当前位置:首页 > 技术 > 正文内容

基于OpenCode搭建AI渗透测试工作台实战

访客 技术 2026年7月5日 1

背景与动机

在红蓝对抗和安全评估中,信息收集阶段占据了大量时间。子域名爆破、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.jsonmcp字段中声明。远程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_httpPCAP中提取HTTP请求/响应tshark -r <pcap> -Y http
tshark_summaryPCAP协议统计和端点列表tshark -r <pcap> -q -z io,phs
tshark_packets按过滤器提取数据包tshark -r <pcap> -Y <filter>
nmap_scan端口扫描及服务版本检测nmap -sV <target>
http_reconHTTP HEAD/GET响应头收集curl -I <url>
curl_raw自定义cURL请求curl <options> <url>

随后根据护网资产测绘需求,新增5个工具:

工具数据源/手段说明
subdomain_enumDNS解析 + crt.sh对40+常见子域名前缀进行A记录查询,crt.sh作为补充
dns_resolve系统DNS支持A、CNAME、MX、NS、TXT五种记录类型
whois_lookup系统whois命令域名注册信息查询
fofa_searchFOFA APIBase64编码查询语句,调用/api/v1/search/all
fofa_infoFOFA 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_KEYFOFA_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头探测)对公网目标是合法的信息收集手段,主动扫描仅限授权目标。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。