🕵️ JSS — 史上最全的 AI 驱动 JavaScript 漏洞挖掘 Skill
把 katana + waymore + jsluice + hae 四大顶级工具链编排成一条 AI 流水线, 让 Claude Code / ZCode 等 AI Agent 真正会做 JS 侦察。
仅用于已授权的渗透测试 / SRC 漏洞挖掘 / 安全研究。
📖 这是什么
一句话:一个自包含、解压即用的 AI Agent Skill,把"JS 侦察"从人肉拼工具升级为 AI 流水线。
传统做法里,你需要自己跑 katana 爬、自己跑 waymore 收存档、自己跑 jsluice 提取, 再把结果一点点喂给 AI,让它在一个塞满压缩混淆代码的上下文窗口里"暴力阅读"—— 读不完、读不准、还死贵。
JSS 把这一切变成一条命令。 工具层做广度(爬取、收集、批量提取、规则匹配),
AI 层做深度(语义分析、优先级排序、回源核实、攻击链构建)。
AI 拿到的不是几百 MB 的原始 JS,而是一份几 KB 的结构化简报 ai_brief.md——
每个端点带 file:line 出处,每条密钥命中带上下文,可直接跟进验证。
🔍 生态空白实证(2026-08 调研):GitHub 搜索 "AI agent javascript recon bug bounty" 结果为 0;
claude-skills与llm-security两大话题下的热门项目里,没有任何一个专注 JS 侦察方向的 skill。 而本项目编排的上游工具——katana(17k+ stars)、waymore(2.7k+ stars)、jsluice(1.9k+ stars)—— 合计超过 22k stars,全部是各自赛道公认的最强单兵。 把这些武器装进一个 AI skill 里,JSS 是第一个。
🗺 拓扑架构
全景流水线
┌─────────────────────────────────────────────┐
│ 用 户 输 入(全场景) │
│ │
│ URL / 域名 本地目录(小程序反编译/dist) │
│ HAR 文件 Yakit / 浏览器 MCP 抓包 JSON │
└──────────────────────┬──────────────────────┘
│
┌────────────────────────────────┼────────────────────────────────┐
│ 收 集 层(工具做广度) │
│ │ │
▼ ▼ ▼
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ ② Yakit 流量导入 │ │ ③ katana 主动爬取 │ │ ④ waymore 被动存档 │
│ ingest │ │ collect │ │ passive │
│ │ │ │ │ │
│ 登录态 JS + API 响应 │ │ JS/map URL 发现 │ │ Wayback/CC/OTX 等 │
│ 体 + 真实调用端点 │ │ + 礼貌下载(限速) │ │ 7 大历史存档源 │
│ ⚡ 对目标站 0 请求 │ │ 🐢 2 req/s 硬限速 │ │ ⚡ 对目标站 0 请求 │
└──────────┬──────────┘ └──────────┬──────────┘ └──────────┬──────────┘
│ │ │
└──────────────────────────────┼──────────────────────────────┘
▼
┌─────────────────────────────────────────────┐
│ 收 集 产 物 落 盘(work/<目标>/) │
│ │
│ js/ · waymore_responses/ │
│ manifest.json · flows_endpoints.txt │
└──────────────────────┬──────────────────────┘
│
┌────────────────────────────────┼────────────────────────────────┐
│ 提 取 层(⑤ analyze,双引擎 + 1) │
│ │ │
▼ ▼ ▼
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ jsluice AST 引擎 │ │ 正则端点引擎 │ │ hae 规则引擎 │
│ (tree-sitter 语法树)│ │ (URL/路径全量扫描) │ │ (密钥/云AK/指纹/中文) │
│ 拼接参数也能解出来 │ │ 确定性·零幻觉 │ │ 敏感信息命中 │
└──────────┬──────────┘ └──────────┬──────────┘ └──────────┬──────────┘
│ │ │
└──────────────────────────────┼──────────────────────────────┘
▼
┌─────────────────────────────────────────────┐
│ 📄 report/ai_brief.md(AI 简报) │
│ │
│ 端点按 admin/internal/auth/upload/api 分组 │
│ sourcemap 引用 · 登录态 API · 密钥命中 │
│ 小程序场景标记(自动识别 appid) │
└──────────────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ ⑥ AI 语义分析层(AI 做深度) │
│ │
│ 敏感信息回源核实(排除占位符/测试数据) │
│ admin/internal 端点鉴权验证(401/403 标记) │
│ sourcemap 还原原始源码 → 重跑 analyze │
│ 密钥×端点交叉 → 攻击链构建 → 优先级排序 │
│ 工具短板 AI 补位(漏爬的 JS 自己 curl 补) │
└─────────────────────────────────────────────┘
交互视图(Mermaid,GitHub 原生渲染)
flowchart TD
A["🎯 用户输入<br/>URL · 本地目录 · HAR · Yakit 抓包"] --> B{输入类型判定}
B -->|URL / 域名| C1["② Yakit 登录态流量<br/>(MCP 在线即自动查)"]
B -->|URL / 域名| C2["③ katana 主动爬取<br/>(限速 2 req/s 防风控)"]
B -->|URL / 域名| C3["④ waymore 被动存档<br/>(目标站 0 请求)"]
B -->|本地目录 / 小程序| D
B -->|HAR / 抓包 JSON| C4["har / ingest 导入<br/>(登录态·0 请求)"]
C1 --> D["📦 收集产物落盘<br/>work/<目标>/"]
C2 --> D
C3 --> D
C4 --> D
D --> E1["🌳 jsluice AST 引擎"]
D --> E2["🔤 正则端点引擎"]
D --> E3["🔑 hae 规则引擎<br/>(自动探测联动)"]
E1 --> F["📄 ai_brief.md 简报"]
E2 --> F
E3 --> F
F --> G["🧠 AI 语义分析<br/>回源核实 · 鉴权验证 · 攻击链构建"]
G --> H["📊 漏洞挖掘报告<br/>(file:line 证据链)"]
style A fill:#e1f5fe
style D fill:#fff3e0
style F fill:#e8f5e9
style G fill:#f3e5f5
style H fill:#fce4ec
分层哲学:工具做广度,AI 做深度
mindmap
root((JSS 设计哲学))
工具层做广度
爬取 katana
存档 waymore
提取 jsluice AST
规则 hae
机械劳动 · 确定性 · 零 token
AI 层做深度
语义分析
优先级排序
回源核实
攻击链构建
判断 · 验证 · 推理
防风控是底线
限速硬编码
被动优先 0 请求
失败自动跳过
⚔️ 为什么不直接把 JS 丢给 AI "暴力分析"?
这是本项目存在的根本理由。"AI 直接读 JS"看起来省事,实际上是上下文窗口、钱包和准确性的三重灾难:
| 维度 | 🐌 传统:AI 暴力读 JS | ⚡ JSS 流水线 |
|---|---|---|
| 上下文窗口 | 一个中型站 300+ 个 JS、动辄上百 MB,直接塞爆上下文;只能采样分析,大量文件根本没被读过 | 工具层全量处理,AI 只读几 KB 的 ai_brief.md 结构化简报,0 浪费 |
| Token 成本 | 每轮对话重复读全量文件,一次任务烧掉数百万 token(真金白银) | 提取是本地确定性计算,免费;AI 只为"判断"付费 |
| 覆盖度 | 只能分析"你手动喂给它的文件"——文件从哪来?还是得自己去爬、去收集 | 收集层自动覆盖:主动爬取 + 7 大历史存档 + 登录态抓包 + 本地目录,四路输入 |
| 准确性 | 压缩混淆过的 webpack bundle 里,AI 极易幻觉——编造不存在的端点、看错拼接逻辑 | AST + 正则双引擎确定性提取,每个端点带 file:line,可回源核实,零幻觉 |
| 混淆对抗 | var a="\x2f\x61\x70\x69" 级别的混淆直接劝退 AI 阅读效率 |
jsluice 基于 tree-sitter 语法树提取,字符串拼接的端点也能解出来;发现 .map 引用还能还原原始源码重跑 |
| 防风控 | AI 自己写脚本 curl 目标站,没有限速概念,几个并发就触发风控/WAF | 限速硬编码:2 req/s 全局、1 req/s 每主机、8 分钟预算、单域 150 页;被动路径对目标站 0 请求 |
| 可复现性 | 每次运行 AI 给出不同结果,证据链无法固定 | 同输入同输出,端点清单、密钥命中全部落盘成文件,报告引用 file:line |
| 登录态 | AI 没有你的 cookie,登录后才能见的 JS/API 全部盲区 | Yakit MCP 流量导入:登录态 JS、真实调用过的 API(含 403 越权线索)直接进简报 |
💡 一句话总结:让 AI 暴力读 JS,是把一个数据库检索问题当成阅读理解问题来解—— 又贵又慢又漏。JSS 先用工具把 300 个文件浓缩成 1 页简报,AI 只做它最擅长的判断。
🧰 七大核心特性
| # | 特性 | 说明 |
|---|---|---|
| 1 | 🧳 开箱即用 | 静态编译的 katana.exe、jsluice.exe 通过 GitHub Release 一键下载,waymore-8.9 源码直接打包。无需装 Go、无需 clone 上游。唯一依赖:Python ≥3.8 + 4 个 pip 包 |
| 2 | 🎯 全场景输入自适应 | URL / 域名 / 本地目录(小程序反编译、dist)/ HAR / Yakit·浏览器抓包 JSON——6 种输入自动路由到对应流水线 |
| 3 | 🛡 防风控刻进 DNA | 限速参数硬编码不可误调:全局 2 req/s、每主机 1 req/s、8 分钟预算、单域 150 页、下载串行 + 随机延迟 + 300 文件上限;被动路径目标站 0 请求 |
| 4 | 🔧 双提取引擎 + 规则引擎 | jsluice AST(tree-sitter 语法树,拼接参数可解)+ 正则引擎(全量兜底)+ hae 规则(密钥/云AK/指纹/中文生态),结果交叉去重 |
| 5 | 🧠 AI 深度分析编排 | 产出 ai_brief.md 后 AI 继续:敏感信息回源核实、admin/internal 端点鉴权验证、sourcemap 还原重跑、密钥×端点交叉成攻击链 |
| 6 | 🤖 健壮性:失败不终止 | 任何环节挂掉(katana 被拦截、waymore 国内超时、hae 未装)自动降级跳过,最终报告列出"已跳过"清单。唯一硬停:真的无文件可分析 |
| 7 | 🧩 生态联动 | 自动探测本机安装的开源 HaESkill(~/.zcode / ~/.agents / ~/.claude)联动规则引擎;自动绕过 Windows 注册表死代理;JSS_WORK 环境变量重定位产物 |
🚀 快速开始
安装(一次性)
# 1. 克隆
git clone https://github.com/ZeroTu1/jss-skill.git
cd jss-skill
# 2. 下载预编译二进制到 bin/(静态编译,无需 Go 环境)
mkdir bin 2>nul
curl -L -o bin\katana.exe https://github.com/ZeroTu1/jss-skill/releases/latest/download/katana.exe
curl -L -o bin\jsluice.exe https://github.com/ZeroTu1/jss-skill/releases/latest/download/jsluice.exe
# 3. 装依赖(仅 4 个包)
pip install -r requirements.txt
# 国内镜像加速
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# 4. 自检
python jss.py list
# 输出 "(没有历史结果)" 即工具链正常
💡 二进制也可从 katana / jsluice 官方 Release 自取,或自行编译:
go build -o bin/jsluice.exe ./cmd/jsluice。 exe 不进 git 仓库是刻意的——katana 二进制内嵌的密钥检测规则会被 GitHub 误判为真实密钥,Release 分发是更标准的做法。
注册为 AI Agent Skill
| Agent | 安装方式 |
|---|---|
| ZCode | 拷贝/软链到 ~/.zcode/skills/jss/ |
| Claude Code | ~/.claude/skills/jss/(或项目级 .claude/skills/jss/) |
| 其他 Agent | 对应 skills 目录,或直接把 SKILL.md 喂给它 |
之后对 AI 说 "分析js"、"js侦察"、"提取接口"、"分析小程序"、"jss" 即可触发。
基本用法
# 一条龙(URL 输入:Yakit 流量 + 主动爬 + 被动存档 + 分析,失败环节自动跳过)
python jss.py all https://target.com
# 分步执行
python jss.py collect https://target.com # 主动爬 + 礼貌下载(限速)
python jss.py passive target.com # 历史存档 JS(目标站 0 请求)
python jss.py har site.har # 浏览器 DevTools 导出的登录态流量
python jss.py ingest flows.json --name 目标 # Yakit / 浏览器 MCP 抓包导入
python jss.py analyze # 分析最近一次收集结果
python jss.py analyze D:\wxapp\decompiled # 直接分析本地目录(小程序/dist)
python jss.py list # 历史目标一览
看结果
type work\<目标>\report\ai_brief.md # ★ AI 简报:端点分组 + 密钥 + sourcemap
type work\<目标>\report\endpoints.txt # 全量端点清单
type work\<目标>\report\hae.json # hae 完整扫描结果
📥 全场景输入路由
| 你给 AI 什么 | 自动执行路径 | 对目标站请求 |
|---|---|---|
| URL / 域名 | Yakit 流量检查 → collect → passive → analyze | 有,限速 |
| 本地目录(小程序反编译、dist) | 只走 analyze,自动识别 app-service.js/app.json 特征 + 提取 appid | 0 |
| HAR 文件(DevTools 导出) | har → analyze |
0 |
| Yakit / 浏览器 MCP 抓包 JSON | ingest → analyze(登录态 JS + API 全落盘) |
0 |
| "分析上次的结果" | list 确认 → analyze(取最近一次) |
0 |
| 只要敏感信息扫描 | 直接用开源 HaESkill;要端点+流程编排才用 JSS | 0 |
📋 子命令速查
| 子命令 | 打目标站请求 | 功能 |
|---|---|---|
collect <url> |
有,限速 | katana 主动爬 + 礼貌下载 |
passive <domain> |
0 | waymore 历史存档响应体(7 大数据源) |
har <file.har> |
0 | DevTools 导出的登录态流量提取 |
ingest <flows.json> |
0 | Yakit MCP / 浏览器 MCP 抓包流量导入 |
analyze [dir...] |
0 | 双引擎提取 + hae 增强 + AI 简报 |
list |
0 | 历史目标一览 |
all <url> |
有,限速 | collect + passive + analyze(失败自动跳过并汇总) |
📂 输出产物结构
work/<目标名>/
├── urls_katana.txt # katana 收到的 js/map URL
├── js/ # 下载的 JS / API 响应体(hash 前缀防重名)
├── waymore_responses/ # 历史存档 JS 响应体
├── manifest.json # 文件名 ↔ 原 URL 映射(含状态码/大小/来源)
├── flows_endpoints.txt # 登录态真实调用过的 API(方法 + 状态码)
└── report/
├── ai_brief.md # ★ AI 简报(AI Agent 的第一入口)
├── endpoints.txt # 全量端点(去重)
├── endpoints.json # 端点 + 分组 + 出处 file:line
└── hae.json # hae 完整扫描结果
ai_brief.md 内容包括:
- 端点按优先级分组:
admin-管理后台→internal-内部调试→auth-认证敏感→upload-export-上传导出→api-接口→other-其他 - sourcemap 引用清单(可还原原始源码,多一个量级的信息)
- hae 高价值命中:敏感信息(密钥/凭据)、框架指纹、疑似弱点线索,均带
file:line - 已捕获 API 端点(登录态流量):真实调用过的方法 + 状态码,403 端点是越权测试起点
- 小程序场景标记:自动识别反编译产物并提取 appid
🧠 AI 语义分析阶段(简报只是线索,不是结论)
ai_brief.md 生成后,AI Agent 按 SKILL.md 编排手册继续深挖:
- 敏感信息回源核实 —— 读命中行上下文,排除占位符/测试数据;判断密钥属于哪套体系(OSS AK?小程序签名 key?),能伪造/访问什么
- admin/internal 组端点逐个验证 —— 可达性与鉴权,401/403 记录;能匿名访问的标记重点
- sourcemap 还原 ——
.map可下载时用 node(source-map 包)还原原始目录,重跑analyze <还原目录>,产出多一个量级 - 密钥 × 端点交叉 —— hae 命中的密钥配 endpoints 清单里哪些接口,两者交叉才是完整攻击链
- 工具短板 AI 补位 —— katana 漏爬的 JS 自己读 HTML 找
<script src>补下载;jsluice 没解出的拼接端点自己读源码构造 - 输出报告 —— 引用
file:line;"已跳过环节"单独列一节;完整清单给文件路径
🛡 防风控设计(刻进默认值)
- collect 硬编码限速:全局 2 req/s、每主机 1 req/s、请求间隔 1s、并发 4、总预算 8 分钟到点即停、单域 150 页、下载上限 300 文件
- 下载器礼貌模式:串行 + 每文件随机 0.6–1.5s 间隔 + 跳过 >5MB 与 HTML 假响应(soft-404)
- 被动优先:passive / har / ingest 对目标站 0 请求;需要登录的应用优先走 HAR / 抓包导入
- 只侦察不攻击:流水线不发任何攻击 payload,验证类工作留给人工阶段
🧯 健壮性:跳过策略
任何一步失败或不适用都不终止流程——记录原因、继续下一步、最终报告列出"已跳过"清单:
| 阻塞情形 | 处置 |
|---|---|
| katana 退出码非 0 / 0 条 URL | 目标不可达或被拦截,跳过主动收集,passive 照走 |
| waymore 超时 / 退出码非 0 | 国内网络访问 Wayback 属常态,已落盘部分照用 |
| Yakit 里没有目标流量 | 跳过登录态导入,不算失败 |
| hae skill 未探测到 | 规则引擎降级(正则 + jsluice 仍在),提示 --hae / JSS_HAE |
| jsluice.exe 缺失 | AST 引擎跳过(正则引擎仍在) |
| 子进程报代理错误 | 自动探测死代理并前置 NO_PROXY='*' 重试 |
| requirements 缺失(waymore ImportError) | pip install -r requirements.txt,失败则 passive 跳过 |
| analyze 目标目录为空 | 唯一硬停(exit=1),向用户要正确输入 |
🔗 hae 联动(可选增强,不改 hae 一行代码)
JSS 的密钥/指纹规则来自开源 HaESkill(overspace-labs 出品,作者 EvilChen——BurpSuite 知名插件 HaE 的规则集封装成 Agent Skill,Apache-2.0 协议)。装到本机后运行时自动探测:
探测顺序:JSS_HAE 环境变量 > ~/.zcode/skills/hae > ~/.agents/skills/hae > ~/.claude/skills/hae
- 安装 hae:
npx skills add https://github.com/overspace-labs/HaESkill -g -y,或 clone 后软链/拷贝为~/.zcode/skills/hae(依赖 ripgrep) - 探测到 → analyze 自动调用,简报多出"敏感信息 / 指纹 / 疑似弱点"三节,命中带
file:line - 没探测到 → 正则 + jsluice 照跑(端点提取不受影响),日志提示降级
- 显式指定:
python jss.py analyze --hae C:\path\to\hae_scan.py <目录>或设JSS_HAE
⚙️ 环境要求
| 组件 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Windows 10/11 | 二进制为 Windows 版;Linux/macOS 需自行替换 bin 下工具 |
| Python | ≥ 3.8 | jss.py 纯标准库;waymore 需 PyYAML / termcolor / psutil / tldextract |
| Go / Node | 不需要 | katana、jsluice 均为静态编译二进制 |
已知环境坑:
- waymore 国内网络超时:Wayback / CommonCrawl 为国外存档服务,偶发超时属正常,已落盘部分照用;设代理后可走通
- 系统代理未启动报错:Windows 注册表死代理(ProxyBridge)导致,
jss.py已自动探测绕过;手动跑工具前置NO_PROXY='*' - 换 Python 版本:整套流水线用
sys.executable调子进程,哪个解释器启动就用哪个;新解释器需重装 4 个依赖 - sourcemap 还原:
.map在手时用 node(source-map 包)十行脚本即可还原原始目录,还原后重跑analyze <还原目录>
❓ FAQ(常见问题)
Q:和 JSFinder / LinkFinder / Packer-Fuzzer 比,JSS 的定位是什么? A:它们是优秀的单点提取器——输入 JS 文件、输出端点/密钥。JSS 是全流程编排:收集(主动爬 + 被动存档 + 登录态抓包)→ 双引擎提取 → 规则引擎增强 → AI 简报 → 语义分析。单点工具解决"这个文件里有什么",JSS 解决"这个目标的攻击面是什么"。
Q:能分析微信小程序吗?
A:能,而且是重点场景。用 unveilr / wuWxapkg 等工具反编译得到目录后,python jss.py analyze <目录> 直接分析:自动识别 app-service.js / app.json 特征、提取 appid、跳过图片字体等二进制,全程零网络请求。
Q:会不会把目标站爬挂 / 触发风控? A:防风控参数硬编码在默认值:全局 2 req/s、每主机 1 req/s、8 分钟预算到点即停、单域 150 页、下载串行 + 随机延迟 + 300 文件上限。passive / har / ingest / analyze 四条路径对目标站 0 请求。
Q:不装 hae skill 能用吗?
A:能。HaESkill 是可选增强——未探测到就自动降级,正则 + jsluice 双引擎照常运行,端点提取完全不受影响。想装:npx skills add https://github.com/overspace-labs/HaESkill -g -y。
Q:支持 Linux / macOS 吗? A:编排器 jss.py 是纯 Python 跨平台的;bin/ 下两个 exe 是 Windows 版,替换为对应平台的 katana / jsluice 二进制即可(jss.py 优先找 bin/ 目录)。
Q:AI 端需要什么? A:任何支持 skills 机制的 agent:Claude Code、ZCode 等;也可以直接把 SKILL.md 当操作手册喂给任意大模型。
Q:怎么还原 sourcemap 源码?
A:analyze 会列出 JS 里的 .map 引用;.map 在手时用 node(source-map 包)十几行脚本即可还原原始目录,还原后重跑 analyze <还原目录> 产出多一个量级。详见 docs/csdn-article-zh.md 场景五的完整脚本。
Q:免费的吗? A:MIT 协议,完全免费开源。
⚠️ 免责声明
本项目仅用于已授权的渗透测试、SRC 漏洞挖掘与安全研究。
- 使用者必须对目标拥有合法测试授权,并遵守当地法律法规
collect/all会对目标发送限速请求(2 req/s、8 分钟预算);其余子命令对目标站零请求- 流水线只做侦察不发包攻击;
flows.json及落盘响应体可能含 cookie/token,属敏感文件,对外输出必须脱敏 - 作者不对任何滥用行为承担责任
🙏 致谢
JSS 是站在巨人肩膀上的编排层,感谢上游武器库:
| 工具 | 作者 | 用途 | Stars |
|---|---|---|---|
| katana | projectdiscovery | 下一代爬取框架(主动收集) | 17k+ |
| waymore | xnl-h4ck3r | 7 大历史存档挖掘(被动收集) | 2.7k+ |
| jsluice | BishopFox | AST 端点/密钥提取引擎 | 1.9k+ |
| HaESkill | overspace-labs(EvilChen) | HaE 规则集的 Agent Skill 封装(密钥/指纹/中文生态规则引擎) | 40+ |
重编译 jsluice:go build -o bin/jsluice.exe ./cmd/jsluice(源码从 BishopFox/jsluice 获取)。
⭐ 如果 JSS 帮你挖到了洞,欢迎 star 支持!
工具做广度,AI 做深度。
No comments yet
Be the first to share your take.