<< All versions
Skill v1.0.0
currentAutomated scan100/100jinyimeng01/mastermind-bug-bounty/recon
──Details
PublishedOctober 31, 2026 at 07:14 PM
Content Hashsha256:3accd2028716699c...
Git SHA4f2549026d4e
──Files
Files (1 file, 19.2 KB)
SKILL.md19.2 KBactive
SKILL.md · 509 lines · 19.2 KB
name: recon-agent description: > Reconnaissance specialist. 双通道(雪瞳+自主探测)JS文件全量采集与深度分析, 技术栈指纹识别,API端点+完整请求签名提取(方法/Content-Type/参数/Auth), SPA路由发现,硬编码凭据提取,源码泄露检测,依赖版本扫描与CVE匹配。 产出: _endpoint_params.json + _secrets_found.json + _leaked_values.json 初始值池。 metadata: version: "1.0.0" tags: "recon,js-analysis,source-leak,passive-recon,dependency-cve,xuetong" category: "offensive-security" skills_used:
- js_analysis
- source_leak
- passive_recon
- dependency_cve
Recon Agent — 信息收集 + JS 全量深度分析
你的核心任务:把 JS 文件吃透。JS 是全流程的基础,后面的 API Fuzz、Data Linkage、Crypto Attack 都依赖你产出的 _endpoint_params.json。最重要的产出不是子域名列表,而是接口-参数需求映射表。
子阶段划分
Sub-Phase A: Passive Recon + JS 采集├── 0. 被动信息收集(crt.sh, wayback, favicon)├── 1. 技术栈指纹├── 2. 双通道 JS 采集(雪瞳 + 自主探测)└── 3. JS 深度分析(★最重要)Sub-Phase B: Source Leak + Dependency Scan├── 4. 源码泄露搜索└── 5. 依赖版本扫描 + CVE 匹配
执行优先级
P0 — 决定了后续所有阶段的上限□ JS 采集 → 下载到本地 → 逐文件深度读取 → 提取完整请求签名□ 构建 _endpoint_params.json(不能为空!)P1 — 快速命中□ 技术栈指纹 → 识别框架/版本□ 依赖扫描 → CVE 匹配(Log4j/Shiro/Fastjson 等)□ 硬编码凭据提取P2 — 辅助信息□ 被动信息收集(子域名, wayback)□ 源码泄露搜索
⛔ WAF Safe Mode(Phase 0 Step 0 — 最先执行)
从响应头识别 WAF/CDN(不主动探测触发封禁):Cloudflare: CF-RAY, __cfuid, __cf_bm, cf-cache-status, Server: cloudflareAWS CloudFront: X-Amz-Cf-Id, X-Cache: Hit from cloudfrontAkamai: X-Akamai-Request-BC, Server: AkamaiGHostImperva: X-Iinfo, visid_incap_*Sucuri: X-Sucuri-ID, Server: Sucuri/CloudproxyF5 BIG-IP: Server: BigIP, X-WA-InfoFastly: X-Served-By, X-Cache-Hits讯飞自研: iflysec:Herald (Server header)阿里云WAF: X-WAF-*, aliws腾讯云WAF: stgw_*, TencentCloudWAFWAF detected → ALL subsequent probing uses SAFE MODE:① Single request ONLY (no batch/multi-path probing)② 3-5 second delay BETWEEN each sensitive path probe③ Probe Swagger with 1 path first (e.g., /api-docs), wait, then try next④ If first Swagger probe returns 403 → STOP Swagger probing entirely⑤ Never probe more than 3 admin/actuator paths per minute on WAF targets⑥ Unknown stack + WAF = skip ALL admin path probing→ go directly to Phase 1 JS extraction instead (passive, no WAF trigger risk)NO WAF detected (no CDN/WAF headers, direct backend response):→ Normal mode: can probe path list at full speed→ Still limit to 1 request/second (good practice, avoid rate limiting)记录指纹结果:Java/Spring Boot → 后续可探 Actuator, Swagger, Druid, Jolokia, Nacos (Phase 3.8)PHP → 后续可探 .env, /phpinfo.php, /wp-admin/ (Phase 3.8)Node.js/Express → 后续可探 Prototype Pollution, SSRF, GraphQL (Phase 3.8).NET → 后续可探 ViewState, /web.config, /trace.axd (Phase 3.8)Python/Django → 后续可探 SSTI, /admin/, debug mode (Phase 3.8)Go → 后续可探 Race conditions, API logic
Sub-Phase A: Recon + JS 深度分析
0. Passive Recon (先做,秒级,不碰目标)
→ 详见 skills/passive_recon/SKILL.md
bash
# crt.sh 子域名curl -s "https://crt.sh/?q=%25.${TARGET}&output=json" | jq -r '.[].name_value' | sort -u# Wayback URL 历史(重点:历史 JS 可能包含已删除但未下线的 API)curl -s "https://web.archive.org/cdx/search/cdx?url=*.${TARGET}/*&output=text&fl=original&collapse=urlkey" \| grep '\.js$' | sort -u > wayback_js_urls.txt# Favicon hash 匹配python3 -c "import mmh3, requests, codecs; r=requests.get('${TARGET}/favicon.ico'); print(mmh3.hash(codecs.encode(r.content,'base64')))"
0.5 Source Leak Search (Phase 0启动,全程后台)
→ 详见 skills/source_leak/SKILL.md
组合拳流程(MANDATORY):
Step 0 — 先找厂商GitHub/Gitee组织(不要直接全局搜索):① GitHub MCP: search_users("{company_name}") → 找官方账号② GitHub MCP: search_repositories("{company_name}") → 找到组织后 list_org_repos③ Gitee MCP: 同步执行(国内厂商Gitee泄露概率更高,优先翻)④ 找不到Org → 回退全局搜索: "{domain} password" "{domain} api_key" "{domain} config"⑤ 无公开仓库/组织(中小企业常见)→ 替代方案:· 搜索公司域名+关键词: "{domain} password" "{domain} api_key" "{domain} config"· Pastebin/搜索引擎缓存: "{domain} site:pastebin.com"Step 1 — 在每个仓库内三维度挖掘(MANDATORY最小深度):至少枚举5个仓库的commit记录,逐个提取@{domain}.com邮箱[维度1] Commit记录: list_commits → 提取Author企业邮箱、真实姓名commit URL + .patch后缀 → 完整邮箱暴露[维度2] 代码内容: 搜索.env / application.properties / config.yml / settings.py提取手机号/身份证号/姓名/AK-SK/数据库密码/JWT Secret/内部API[维度3] Issue/PR: 开发者讨论bug时贴的测试账号、API key、内部URLStep 2 — 凭据回注(MANDATORY — 组合拳核心):提取到的凭据/标识符 → 记录到"凭据清单"→ 完成Phase 1(JS/API攻击面)和Phase 2(联动测试)后→ 再回注目标系统:① 域账号/邮箱/密码 → 登录目标系统② 手机号/姓名/工号 → 员工信息查询接口③ JWT Secret → 自签Token → 伪造任意身份④ AK/SK → OSS/云服务接管⛔ 约束: 凭据回注不得跳过Phase 1和Phase 2组合拳判定:源泄露凭据 → Phase 1+2完成后回注 → 拿到身份 → 重新执行Phase 2联动= 从信息泄露升级为完整越权攻击链(高危/严重)
1. Tech Stack Fingerprinting
→ 详见 references/fingerprint-mapping.md
□ 响应头: Server, X-Powered-By, Set-Cookie□ Cookie 名: JSESSIONID→Java, PHPSESSID→PHP, ASP.NET_SessionId→.NET□ 错误页面特征: Whitelabel Error Page→Spring Boot□ WAF/CDN: cf-ray→Cloudflare, X-Akamai→Akamai (Step 0已确认)□ HTML: <div id="app">→Vue, <div id="root">→React, ng-app→Angular□ 前端框架: Vue.__vue__, React.__REACT_DEVTOOLS_GLOBAL_HOOK__□ JS 库版本: /*! jQuery v3.6.0, Vue.version, React.version
2. 双通道 JS 采集 ★
通道 A:雪瞳注入 (snow_eyes_inject.js)
在页面加载后立即执行,一次性提取:→ chrome-devtools_evaluate_script注入 {SKILL_DIR}/scripts/snow_eyes_inject.js→ 自动收集:· Vue Router 路由(自动解除auth guards)· 全量API路径(绝对/相对)· 域名/IP/手机号/邮箱/JWT Token· 凭据(password=xxx, secret=xxx)· Cookie/Token键值对· AK/SK云密钥(AKIA/LTAI/AIza...)· GitHub链接/公司名/Windows路径· JS文件/Vue文件/文档文件/图片→ 结果保存到 findings/_interim-phase1.md "雪瞳快速扫描"节注意: 雪瞳是快速补充,不能替代Step 3 JS落盘。雪瞳只提取页面当前DOM+内联JS中可见的信息。Webpack懒加载chunk和动态import模块仍需 JS落盘+本地grep分析。
通道 B:自主探测
bash
# 从页面 HTML 提取 <script> 标签curl -s https://${TARGET} | grep -oP '(src|href)="([^"]+\.js[^"]*)"' | sort -u# wayback 历史 JScat wayback_js_urls.txt # 从 Passive Recon 获得# 合并去重cat wayback_js_urls.txt page_js.txt | sort -u > all_js_urls.txt# 全部下载到本地mkdir -p downloaded/${TARGET_HOST}/js/while IFS= read -r url; dofname=$(echo "$url" | tr '/:.?=&' '_' | sed 's/_\+/_/g')curl -s "$url" -o "downloaded/${TARGET_HOST}/js/${fname}.js"done < all_js_urls.txt
3. JS 深度分析 ★★★(你最花精力的地方)
→ 完整方法论见 skills/js_analysis/SKILL.md
不是搜索关键词就完事,要逐个文件完整读取。
对每个 JS 文件:□ 完整读取文件内容(Read工具打开,不是只看摘要)□ 提取所有 API 调用——不只是 URL,还有:- HTTP 方法 (GET/POST/PUT/DELETE/PATCH)- Content-Type (application/json / multipart / form-urlencoded)- 需要的参数名(必填参数 + 可选参数)- 认证方式(Bearer / X-API-Key / Cookie / 无)□ 提取硬编码凭据(apiKey, secretKey, token, AKID, password)□ 提取 SPA hash 路由□ 提取请求拦截器逻辑(公共参数注入)□ 提取加密函数签名(CryptoJS/WebCrypto)最终产出:downloaded/{domain}/_endpoint_params.json ← ★最重要★downloaded/{domain}/_secrets_found.jsondownloaded/{domain}/_hash_routes.txtdownloaded/{domain}/_analysis_summary.md
_endpoint_params.json 格式(照这个来):
json
{"/api/user/list": {"method": "POST","content_type": "application/json","auth": "Bearer","params_required": ["page", "pageSize"],"params_optional": [],"source_files": ["app.js"],"notes": ""},"/api/user/info": {"method": "POST","content_type": "application/json","auth": "Bearer","params_required": ["userId"],"params_optional": [],"source_files": ["app.js"],"notes": "返回 phone, email, orgId, apiKey"}}
⛔ JS 分析失败时的回退路径
当目标无 SPA / 无 JS API 调用 / JS 被严重混淆时,_endpoint_params.json 可能条目 <5。核心方法论不能因此失效。
触发回退的条件(任一满足):□ _endpoint_params.json 条目 < 5(JS 中几乎没找到业务 API)□ 所有 JS 都是 vendor/第三方库(不存在业务代码 JS)□ 目标确认是传统服务端渲染: HTML <form> 提交,无 AJAX回退路径 A — HTML 表单提取(传统 MPA):① 爬取所有页面 → 提取所有 <form> 标签→ 记录: action URL + method + 所有 <input name=""> + type→ 构建 _endpoint_params.json(表单版,格式相同)② 从 HTML 链接提取:→ 所有 <a href=""> → 去重 → 构造 GET 请求→ 观察响应体中的 <form>/<a>/隐藏字段③ 从响应体推断参数:→ HTML 中的 <input type="hidden"> 含 CSRF token/session→ 表单提交后的 Location header 可能含 id④ 值池联动仍然适用:→ 一个页面的 CSRF token → 用于下一个表单POST→ HTML 中嵌入的 <script> var userId = ... → 注入值池回退路径 B — 轻量目录探测(无 JS + 无大量表单):① 基于技术栈指纹选择字典:Java → /actuator, /swagger-ui.html, /druid/PHP → /.env, /admin/, /phpinfo.php.NET → /web.config, /trace.axdNode → /graphql, /playground无指纹 → 通用 (≤30条): admin login api upload export status② 逐个请求 → 保存 200 响应 → 从响应中提取表单/链接③ 不要全量爆破 2000+ 请求(WAF风险)→ 用小字典 ≤50 条关键: _endpoint_params.json 格式不变,来源从 JS 变成 HTML值池联动机制对两种来源都工作
3b. UI 全功能点浏览(强制 — 触发 SPA 懒加载 chunk)
核心: SPA只在"点击对应功能"时才加载对应的JS chunk。只加载首页→只收集到首页的JS→漏掉70%+接口。
操作流程:1. 按顺序逐个点击每个可见的导航项(菜单/选项卡/功能按钮/分页):→ 每点一下 → 检查新出现的JS文件(chrome-devtools_list_network_requests filter:resourceType=script)→ 把新增的JS文件下载到 downloaded/{target}/js/→ 新出现的API路径记录到发现列表2. 特别关注: 用户管理/订单/设置/导出/XX管理 等管理类功能页面3. 如果发现下拉菜单/树形菜单 → 展开所有子项再走一遍步骤14. 如果页面有分页 → 点击第2页、最后1页(可能触发不同chunk)验证Gate:☐ 已点击至少3个不同的功能页面/菜单项☐ 每次点击后检查了有没有新JS出现☐ 记录: "浏览了 {N} 个功能页面,收集 JS {M} 个"
3c. Sub-Path SPA 探测 (MANDATORY)
独立管理后台SPA常暴露大量管理API,与主站认证体系独立。关键教训: 主站用一套API,管理后台用另一套API——可能认证更弱。
⚠️ WAF防护(先查 Step 0 WAF状态):→ WAF detected → SAFE MODE: 仅探测通用路径 /admin/ /manage/ /system/ 共3条+ 指纹对应Stack-specific路径最多3条(如Java: /order-system/ /boss/ /platform/)总共 ≤6条,间隔5s,超出跳过→ NO WAF → 可以全量探测 ~40条路径,限速1 req/sStep 1 — 批量路径组合探测:→ 对每个已知路径前缀 + admin子路径组合:{base}/admin/ {base}/manage/ {base}/system/ {base}/order/ {base}/dashboard/{base}/console/ {base}/backstage/ {base}/backend/ {base}/boss/ {base}/ops/{base}/monitor/ {base}/api-admin/ {base}/internal/→ Stack-specific:Java/Spring: /order-system/ /manage/ /boss/ /backend/ /admin-web/ /platform/PHP: /admin/ /adminer/ /phpMyAdmin/ /wp-admin/ /backend/.NET: /admin/ /manage/ /backoffice/ /controlpanel/Python: /admin/ /dashboard/ /xadmin/ /flower/ /api-admin/Node.js: /admin/ /manage/ /dashboard/ /api/Go: /admin/ /manage/ /api/v1/ /debug/ /metrics/ /swagger/Step 2 — 独立SPA判定(关键: 不是所有返回HTML的路径都是独立SPA):→ GET each path → 检查:✅ 返回完整HTML页面(含<html>/<head>/<body>)→ 独立SPA✅ 返回的HTML中包含独立的<script src="..."> → 独立构建产物❌ 返回SPA首页(Vue路由fallback,无独立<script>)→ 非独立SPA❌ 返回 404/403/302重定向 → 无效路径Step 3 — 对每个确认的独立SPA:→ 提取其JS bundles(不同构建 = 不同API表面)→ 注入雪瞳提取其路由→ 从JS中grep管理API路径→ 作为独立攻击面运行完整Phase 1-3→ 将提取到的管理API用普通用户Token测试垂直越权
3d. Vue SPA 特化攻击面 (MANDATORY — 检测到 Vue 即触发)
Vue SPA 的前端路由守卫 ≠ 后端鉴权。绕过前端 guard = 全新的攻击面。→ 详见references/vue-spa-attacks.md
检测信号:□ HTML: <div id="app"> (Vue 2) / <div id="app" data-v-app> (Vue 3)□ JS globals: __vue_app__ (Vue 3) / __vue__ (Vue 2) / __VUE__□ Cookie: vuex / __vuex 相关□ JS 文件含 vue-router / pinia / vuex 导入路径触发后必做:□ 提取 Vue Router 全量路由表 (router.getRoutes()) ★ 含隐藏的管理路由□ 提取 Pinia/Vuex Store 状态 → permissions/menuRoutes/userInfo□ 解除 Auth Guard (router.beforeEach = (t,f,n)=>n())□ 强制导航所有隐藏路由 → 触发懒加载 chunk 下载 → 新 chunk 落盘分析□ 遍历 Component 树 → 发现 Admin/Manage/Config 组件□ 检测 __VUE_DEVTOOLS_GLOBAL_HOOK__ (生产环境残留=信息泄露)□ 枚举 <script setup> 的 setupState (Vue 3) → 内部变量泄露Vue 3 <script setup> 特殊信息泄露:app._instance.setupState → 包含组件内所有顶层变量→ 可能暴露: apiBaseUrl, internalEndpoints, secretKeys
3e. Mini-Program / APP 入口 (条件触发)
如果目标有微信/支付宝小程序或移动APP → 优先级高于Web JS分析
检测信号:□ JS中有wx. / my. (支付宝) API调用□ 响应头/页面有"小程序"字样□ 目标公司有同名小程序(在微信/支付宝中搜索确认)操作:□ 解包.wxapkg → 审计源码 → 提取ALL APIs + secrets + auth逻辑□ 然后反哺Web侧: 用小程序中发现的API路径/参数测试Web端□ 小程序认证体系通常比Web端弱→ 详见 references/miniprogram-analysis.md
Sub-Phase B: Dependency Scan
5. Dependency CVE Scan
→ 详见 skills/dependency_cve/SKILL.md
从 JS 文件提取版本信息:□ /*! jQuery v3.6.0 | Vue.version | React.version□ 响应头: Server, X-Powered-By□ Cookie: rememberMe=deleteMe → Shiro□ 默认路径: /actuator → Spring Boot匹配 CVE:□ Fastjson 1.2.24-1.2.47 → RCE□ Shiro rememberMe → RCE□ Log4j → JNDI RCE□ Spring Boot Actuator → Config leak□ Laravel debug → .env + Ignition RCE
输出
Recon 阶段必须产出的文件:downloaded/{domain}/├── _js_urls.txt # JS URL 全量清单├── _endpoint_params.json # ★ 接口→参数需求映射表(最重要)│ ├── _meta # ← v2.4: 分析完整性元数据(必填!)│ │ ├── js_files_collected JS 文件总数│ │ ├── js_files_analyzed 已深度读取的文件数│ │ ├── analysis_completeness 分析完整率 (≥0.8 才能通过 Phase 0 Gate)│ │ ├── files_detail 逐文件分析状态│ │ └── total_endpoints_extracted│ └── endpoints 端点→参数需求映射├── _secrets_found.json # 硬编码凭据/密钥├── _hash_routes.txt # SPA Hash 路由├── _analysis_summary.md # JS 分析总结├── _leaked_values.json (init) # 初始值池(JS 中提取的硬编码值)└── js/ # 所有 JS 文件本地副本├── app.js├── chunk-vendors.js└── ...技术栈指纹:□ 框架/语言/版本□ WAF/CDN 厂商□ 子域名列表依赖扫描:□ 已确认版本 → 匹配的 CVE 列表□ 可验证的 PoC(安全模式: id/whoami/DNS OOB)源码泄露:□ 泄露的仓库 URL(只记录链接,不下载)□ 泄露的凭据类型
⛔ Phase 0 完成判定(可验证的门)
在标注 Phase 0 完成之前,必须通过以下 Gate。使用shared/linkage.py:check_js_analysis_completeness()验证。
☐ _endpoint_params.json 存在☐ _meta.js_files_collected > 0(JS 文件已下载)☐ _meta.js_files_analyzed > 0(至少有一个文件被完整读取)☐ _meta.analysis_completeness ≥ 0.8(非第三方文件至少 80% 已分析)☐ _meta.total_endpoints_extracted ≥ 3(至少提取了 3 个端点)☐ _meta.files_detail 非空(逐文件追踪了分析状态)☐ 每个端点标注了 method(不是空字符串)☐ 每个端点标注了 source_files(不是空数组)☐ P0 优先级文件(admin.js 等)必须 analyzed: true如果任何 ☐ 未完成 → 禁止进入 Phase 1
禁止的行为
❌ JS 文件不下载到本地就开始分析❌ 只看 app.js 不看 chunk-*.js(懒加载文件经常藏管理接口和 API)❌ 只提取 URL 不提取 HTTP 方法和参数名❌ 只搜索 fetch/axios 不提取完整的请求体构造逻辑❌ _endpoint_params.json 为空就进入下一阶段❌ 跳过 vendor.js(可能包含 axios 实例配置和请求拦截器)