PenScope 是一个 Chrome 扩展。安装它,浏览一个你有权限测试的网站,它会静默地绘制出整个攻击面——每个端点、每个密钥、每个配置错误的标头、每个隐藏的参数。当你下达指令时,它会使用你的真实会话 cookie 发送 36 种不同的探测攻击,并报告哪些攻击命中。
或者你设置好范围,点击狩猎,PenScope 就会在你做其他事情时完全自主地完成整个过程——为它命中的每个严重和高危发现起草完整的 HackerOne 格式的漏洞报告。你醒来时会看到一列可提交的草稿。
它是漏洞赏金猎人的日常工具,他们希望跳过“设置代理、在三个窗口中点击、Alt-Tab 切换到 payload 列表”的例程,直接看一个网站。或者完全停止观察,让工具替你狩猎。
读取一切,不发送任何内容——直到你告诉它这么做。 设置范围,点击狩猎,合上笔记本电脑。醒来看到已起草的严重漏洞。
基于审计的 8 阶段重构。主要新增内容:
.env 赋值、Vault s./b. 前缀——以及 Spring Boot / Rails ActiveRecord / Django DEBUG / ASP.NET YSOD / Express / Apollo / MSSQL 响应体检测器。alg、iss、sub、aud、exp、iat、role、scope...)。当 exp 在未来且角色为管理员形状时,严重性会提升。完整的逐阶段详解请参见 CHANGES.md。迁移说明请参见 MIGRATION.md。
Pin 扩展。访问任意网站。点击 **P** 图标。PenScope 已在监控。
---
## 你能做什么
PenScope 为每个标签页捕获 60 多个数据字段。以下是实际应用场景:
**查看完整的攻击面。** 每个端点,包括在 JavaScript 中被引用但从未实际调用的端点。隐藏在源码映射中的 API 路径、从 POST 请求体重构的 GraphQL 操作、通过框架内省推断出的隐藏管理路由。
**发现本不应存在机密的泄露。** 硬编码在 `.js` 包中的 API 密钥。存储在 `localStorage` 中的 JWT。环境转储中的 AWS 凭证。响应体中的内部 ID。这类问题通常会出现在 P1 报告中。
**在浏览器中执行 36 种攻击步骤。** 认证绕过、BAC、IDOR、CORS 反射、JWT alg=none、SSTI、XXE、CRLF 注入、原型污染、参数发现、API 版本降级。三种攻击强度——谨慎、中等、全开。可粘贴自定义标头。隐身模式会打乱请求顺序,避免触发 WAF。
**将单个发现串联成实际漏洞利用。** 内存中的 JWT 是一个发现。同一 JWT 加上一个接受未签名令牌的 API 端点,再加上解码后的角色为 admin——这就是一个漏洞链,PenScope 会在报告顶部显示该链,包含置信度评分、复现命令和后续步骤。
**编辑并重发任意请求。** 右键点击风格。Repeater 在新标签页中打开,全窗口显示。修改参数,点击发送,查看响应。可拖入 Diff 功能与基线对比。
**使用插入点进行模糊测试。** 在请求的任意位置标记 `§payload§`,选择一个 payload 集合(40 个 XSS 字符串、30 个 SQLi、28 个 LFI、18 个 SSTI、22 个 SSRF、24 个命令注入、ID 1-100、经典认证绕过、常用用户名),选择攻击模式(Sniper / Cluster bomb / Pitchfork / Battering ram),实时查看结果表。异常行会用星号标记。
**同时以五个不同用户身份进行测试。** 保存认证上下文(匿名用户、用户 A、用户 B、管理员、内部用户)。一键切换活动上下文——所有 Repeater 请求、所有 Intruder 运行、所有探测都将使用这些凭证。然后运行 **授权矩阵**:PenScope 遍历每个端点 × 每个上下文,生成颜色编码的网格。行之间的差异就是你的 IDOR/BAC 发现,自动呈现。
**生成真正适合网站的 CSP。** 遍历页面发出的每个请求,按资源类型分类,构建一个严格策略。添加 `default-src 'none'`、`frame-ancestors 'none'`、`upgrade-insecure-requests`。检测内联脚本和 `eval()`,并在需要保留 `'unsafe-inline'` 时发出警告。与现有 CSP 进行差异比较——绿色表示收紧,红色表示放宽。
**双向与 Claude 对话。** 点击 `→ Claude` 将整个扫描内容作为结构化简报复制到剪贴板。询问 Claude 下一步该测试什么。Claude 会返回一个带格式的 JSON 队列。点击 `⟳ Sync from Claude`,PenScope 解析该队列,对实时目标运行每次攻击,并将结果反馈到链分析器。
**随时间跟踪你的范围。** 今天对某个网站进行快照,下一个 sprint 再次快照,点击 Compare。PenScope 会告诉你哪些发现是新增的、哪些已解决、哪些未变化。将差异导出为 Markdown 分享到团队 Slack。
**将发现映射到合规控制项。** 点击 Compliance Audit。每个发现都会映射到 PCI-DSS v4、NESA UAE IAS、SAMA CSF、DESC ISR、ISO 27001、OWASP Top 10 2021 和 CWE 中的具体控制项。导出 JSON 用于 SIEM。导出 PDF 用于审计人员。
---
## 狩猎模式
点击弹出窗口标题中的 `🎯 Hunt`。将打开一个新标签页。底部的 **预检面板** 会显示你的引擎状态——已捕获的端点、机密信息、检测到的技术、已保存的认证上下文——这样你在点击开始之前就能知道是否有足够的攻击面来进行一次高效的狩猎。如果端点少于 20 个,会显示黄色警告,建议你先浏览目标,或者依赖新的 DOM 自动爬取步骤。配置目标范围(范围内的路径、范围外的路径、攻击强度、时间预算)。点击 `▶ Start Hunt`。
PenScope 会自动执行:
1. 完成被动侦察
2. **自动启用深度模式**(CDP 调试器静默附加——无需用户提示)
3. **DOM 自动爬取**——遍历当前页面上的所有 `<a href>`、`<form action>`、``、`[routerLink]`、`[ng-href]`、`[to]`、`[data-href]`。过滤到同源 URL。将新的 URL 添加到探测队列。_纯 URL 提取——不点击、不导航、不产生改变会话的副作用。_
4. 运行完整的 36 步探测管道 + 8 个堆栈感知攻击包
5. 扫描已保存认证上下文的 **授权矩阵**
6. 运行链关联器,按你的范围规则过滤
7. **为每个严重和高危发现起草完整的 HackerOne 格式报告**——包括漏洞链 *和* 单个高危发现(暴露的机密信息、JWT alg=none、确认的 SSTI/XXE/CRLF)。每个草稿包括标题、严重性(含 CVSS 评估)、摘要、包含两步 curl 的复现步骤(无认证探测 + 认证基线用于差异对比)、针对该发现的影响陈述、从代码片段库中提供的修复建议以及参考资料。
8. 每条严重级发现触发一条 Chrome 通知:_"Hunt Mode 在 /api/users 上发现一个严重级 IDOR——报告草稿已准备就绪"_
9. 将草稿持久化到 `chrome.storage.local` 中,以主机名为键(关闭标签页或浏览器重启后仍保留)
**实时标签页** 会实时叙述每个过滤步骤——范围过滤前后的链数量、严重性分布、哪些被丢弃及其原因。如果狩猎结束时报告数为 0,会出现一个 "为什么没有报告?" 的诊断信息,引导你逐个过滤点并提供具体建议("取消选中严重+高危过滤器"、"保存 2 个以上的认证上下文"、"先更多地浏览目标")。不再需要猜测为什么狩猎结果为空。
**当你醒来时,会看到一队列预先写好的漏洞报告。** 阅读每份报告,点击复制或导出,粘贴到你的 HackerOne / Bugcrowd / Intigriti 平台提交。
这是 Burp 甚至不愿尝试的工作流程。Burp 的主动扫描器会运行攻击,但你仍然需要编写报告。PenScope 掌控了从扫描 → 漏洞利用 → 报告 → 提交的整个路径。
> 设置范围。点击开始。合上笔记本电脑。醒来时面前是一队列起草好的严重级报告。
### 质量控制——维护你的声誉
狩猎模式会主动过滤误报,以避免你因提交它们而损害声誉:
- **SPA HTML 外壳**——Angular/React/Vue 引导页面会为认证和未认证请求返回相同的 HTML,因为 JS 在客户端处理认证。狩猎模式会检测此模式(路径以 `.html` 结尾 + `sameBody=true`)并抑制该发现。真实的 API 仍然会报告。
- **良性的 Azure SAS 令牌**——用于媒体文件(`image.jpg?sv=...&sp=r&se=...`)的短期只读 SAS URL 是合法的 CDN 交付,而非凭证泄露。狩猎模式会检查 `sp=r` + 媒体文件扩展名 + `se - st < 7 天` 并抑制。长期有效、可写或非媒体类型的 SAS 令牌仍会作为真实泄露报告。
- **哈希片段规范化**——`/Dashboard#!/` 是客户端路由,而非服务器端点。狩猎模式在进行链分析前会去除哈希片段,因此报告会显示 `/Dashboard`(实际的服务器路径)。
- **每条 curl 命令中的真实 `baseUrl`**——链分析器从 `tab.url`(仅 HTTP/HTTPS)推导目标主机,若失败则回退到第一个观察到的端点。你的报告中不再出现 `https://target.tld` 占位符 URL。
- **透明的诊断信息**——每个过滤步骤(范围、严重性、去重)都会在实时反馈中记录其前后数量。当狩猎结束时报告数为 0,反馈会以一个 "为什么没有报告?" 的区块结束,精确解释每个潜在发现是在哪里被丢弃的,并提供根据你的具体配置量身定制的具体下一步建议。
### 一个真实的狩猎模式草稿
以下是在一个政府 LMS 系统上仅用 4 分钟生成的真实狩猎模式草稿的节选(已脱敏处理):```markdown
# Authentication bypass on sensitive endpoint: /api/DashboardApi/getUsefulLinks
**Severity:** CRITICAL (CVSS estimate: 9.0–10.0)
**Confidence:** 95%
**Target:** https://lms.example.gov/Dashboard
**Discovered:** 2026-05-01T07:31:13.151Z
**Detected by:** PenScope v6.2 Hunt Mode (chain pattern: chain-authbypass)
## Summary
PenScope's probe confirmed that GET /api/DashboardApi/getUsefulLinks returns
the same data whether or not authentication cookies are sent
(auth=200, noauth=200, sameBody=false). The path name strongly suggests this
endpoint should be role-gated — it's returning sensitive data to
unauthenticated callers.
## Steps to reproduce
# Verify unauthenticated access
curl -i "https://lms.example.gov/api/DashboardApi/getUsefulLinks"
# Compare to authenticated baseline (paste your real cookies):
curl -i "https://lms.example.gov/api/DashboardApi/getUsefulLinks" -b "session=..."
## Impact
Successful exploitation enables an attacker to bypass core security controls,
gain unauthorized access to sensitive functionality or data, and pivot to
broader compromise. This is a credible breach path warranting immediate
remediation.
## Suggested fix
Enforce server-side authentication on every endpoint that returns sensitive
data. The fact that PenScope received a 200 with no cookies means the
authorization middleware is missing or disabled for this route.
[ ... full Express/Django/Laravel snippet examples + references ... ]
这是一份可提交的漏洞报告。 在你做其他事情时起草的。
工作台将 PenScope 从"被动侦察工具"提升为"你会打开 Burp 做的一切"。在弹出窗口的头部点击 ⌘ Workbench,一个全屏的 Chrome 标签页会打开,包含六个工具,并与你的扫描共享状态。
捕获到一个你想修改的请求?在站点地图中点击它。完整的请求——方法、URL、头部、正文——会加载到编辑器中。编辑任何内容。点击 发送(或 Ctrl+Enter)。响应会显示在右侧,包含状态、大小、时间以及触发它的活动身份验证上下文。
历史栏保留你最近 50 次发送。三个按钮将当前请求转换为可操作的项目:复制为 curl(用于终端和报告)、发送至入侵器(预加载相同的头部和正文)、发送响应至差异比较器。
取任意请求。将你想要模糊测试的值包裹在 §...§ 中。选择一个载荷集。点击开始。
内置载荷库:
或者粘贴你自己的列表。四种攻击模式:狙击手(一次一个位置)、集束炸弹(所有组合)、音叉(位置同步)、攻城锤(所有位置使用同一载荷)。实时结果表,带有异常检测——状态码或响应大小与基线不同的行会被标记。
硬限制:每次攻击最多 200 个请求。不要意外地对你的漏洞赏金目标造成拒绝服务攻击。
针对猎人们每天都会遇到的格式进行可往返的转换:``` Base64 ↔ B64-URL ↔ URL ↔ HTML ↔ Hex ↔ MD5 / SHA-1 / SHA-256 / SHA-512
同时提供一个专用的 **JWT 卡片**:粘贴一个令牌,解码其头部和载荷,编辑任意部分,然后伪造一个新令牌。提供两种伪造模式:
- **alg=none** — 经典的 JWT 认证绕过测试(服务器信任未签名令牌)
- **HS256** — 使用猜测的弱密钥签名(常见的如 `secret`、`key`、`password`、`jwt-secret`)
输出为单个令牌,可直接复制粘贴。
### 差异对比
两个文本窗格。一键从 Repeater 发送响应。点击 `Compute Diff`。PenScope 运行基于 LCS 的行差异比较,并用颜色标记结果:`+` 表示新增,`−` 表示删除。顶部显示摘要计数。
这是 IDOR 确认的杀手锏。“用户 A 的响应是否与用户 B *完全相同*,还是服务器实际返回了用户 B 的数据?”Diff 在三秒内告诉你答案。
### 站点地图
PenScope 捕获的所有端点的层次树,按主机 → 路径组织。方法标签(`GET`、`POST`、`DELETE`...)。每个节点的状态码徽章,颜色编码为绿色/黄色/橙色/红色。点击任意路径即可加载到 Repeater 中。
完整的攻击面,一目了然,随时可以测试。
### 认证上下文 + 授权矩阵
这是差异化功能。Burp 不提供此功能。
保存命名的认证配置文件。每个配置文件 = 一个名称 + 一组 cookie + 一组头部。通过以每个用户身份登录、复制其会话 cookie 和 Authorization 头部、粘贴到编辑器中来构建它们。添加备注(“付费计划”、“只读角色”、“内部员工”)。一键切换活跃上下文。现在所有 Repeater / Intruder / 探测请求都会使用这些凭据发送。
然后点击 `Run authorization matrix`。PenScope 针对每个端点 × 每个上下文发起请求,并渲染一个网格:```
Anonymous User A User B Admin
GET /api/me 401 200 200 200
GET /api/users 401 403 403 200
GET /api/admin 401 403 403 200
DELETE /api/orders/5 405 403 403 ★ 200
PATCH /api/users/42 401 200 ★ 403 200
星标标记上下文不一致的行。这些行就是自动浮出水面的 IDOR 和 BAC 发现。
典型的挖掘者会花费整个下午手动以每个用户身份测试每个端点,并在文档中做笔记。PenScope 在 30 秒内完成并颜色编码结果。
相同的数据引擎,三种视图。选择与你当前工作匹配的。
在弹出窗口标题中使用 Classic / Red / Blue 药丸按钮切换模式。每个选项卡会记住你上次所处的模式。主题颜色随模式切换。
点击弹出窗口标题中的 Export ▾。十种格式,两种用途:
Markdown 报告专为共享而构建——每个凭据都会自动编辑,报告头部明确说明这一点。JSON 专为与挖掘伙伴同步而构建——每个凭据完整传输。
PenScope 和 Burp 从不同侧面解决相同问题。PenScope 存在于你的浏览器中;Burp 是一个 MITM 代理。两者各有优势。以下是诚实的对比。
PenScope 胜出之处:免费、设置更快、浏览器原生(使用你的真实会话,无需证书配置)、链关联、防御者模式工具、AI 桥梁。
Burp 胜出之处:TLS 级拦截让你可以在请求离开网络栈之前查看和修改它们——对于原生应用和 WebSocket 走私很有用。Collaborator 为你提供了盲 XXE / SSRF 的带外回调基础设施。
如果你只对浏览器中的 Web 应用进行漏洞赏金,PenScope 可替代 Burp 约 95% 的日常工作流程。如果你逆向移动应用或测试胖客户端,Burp 仍然是你的好帮手。
PenScope 不会在未经用户明确操作的情况下发送任何内容。不存在:
出站流量仅在三种情况下发生:
零 npm 包。零 CDN 脚本。零第三方 SDK。纯 vanilla JavaScript,MV3 清单,零供应链攻击面。
架构、36 种探测攻击、13 种链模式、文件映射,以及为什么这一切都不需要构建步骤。
┌──────────────────────────┐
│ state[tabId] │
│ 60+ fields populated by │
│ webRequest / content / │
│ CDP / probe layers │
└──────────┬───────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
Classic mode Red mode Blue mode renderClassic() renderRed() renderBlue() │ │ │ └───────────────────────┴───────────────────────┘ │ ┌────────────────┴────────────────┐ │ │ Workbench Hunt Mode (Repeater · Intruder · Encoder (autonomous orchestrator · Diff · Site Map · Auth Matrix) drafting H1 reports)
**一个引擎,三种模式,三个界面。** 数据引擎与模式无关——每个状态字段的收集方式在所有视图中都相同。模式是同一数据上的主题+渲染器选择。工作台和狩猎模式是独立的Chrome标签页,通过后台消息处理器共享 `state[tabId]`。
CSS变量覆盖(`body.mode-red`、`body.mode-blue`)无需修改任何规则选择器即可重新设置主题。这就是为什么经典模式与 v5.9 版本在字节级别上完全一致。
---
## 性能
PenScope 始终存在于每个标签页上。默认情况下,它会对大约50个已知的高噪音主机后缀(如视频CDN `googlevideo.com`、广告网络 `doubleclick.net`、遥测端点 `sentry.io`、大型静态CDN `gstatic.com`)跳过耗费资源的增强处理。YouTube 上每分钟数百个 `googlevideo.com` 的分块请求不再通过14个 AUTH_PATTERN 正则表达式 + 路径参数检测 + Swagger 查找——它们被记录为端点(站点地图仍然包含它们),并且其余处理被跳过。
对于任何主机上的 `image`/`media`/`font`/`stylesheet`/`object`/`ping` 资源类型,也采用相同的快速路径。Bug 几乎不会隐藏在 `.css` 的 URL 参数中。
内容脚本的 DOM 重新扫描通过 `requestIdleCallback` 执行(两次扫描之间至少间隔15秒),并在标签页隐藏时完全跳过。MutationObserver 过滤纯文本更改(例如计时器滴答、字符数据更新),这样 YouTube 持续的 DOM 变动就不会每3秒触发一次完整重新扫描。
提供覆盖选项:**探测器下拉菜单中的"对高噪音主机进行完整捕获"** 复选框。当您专门将 YouTube/Twitch/Sentry 等作为目标进行审计时,勾选它即可绕过快速路径。
---
## 45种探测器攻击
按需运行。三个攻击等级,具有强制约定:**谨慎** = 仅 GET/HEAD/OPTIONS,请求之间至少间隔200毫秒;**中等** = 增加 POST 用于读取形状操作(≤3个并行);**完全** = 所有方法,包括 DELETE/PUT/PATCH 以及竞争条件突发(≤10个并行)。自定义标头会粘贴到每个请求中。隐身模式使用 Fisher-Yates 算法打乱步骤顺序,并在步骤间延迟中增加0-80%的抖动。每个步骤的预期方法在探测器启动时会根据当前层级进行干运行检查;被阻止的步骤会列在诊断日志中。
| # | 攻击 | 功能 |
|---|---|---|
| 1 | GraphQL 自省 | 转储模式、类型、查询、变更 |
| 2 | 源映射收割 | 下载 `.map`,提取密钥和端点 |
| 3 | Swagger/OpenAPI 获取 | `/swagger.json`、`/openapi.json` 等 |
| 4 | OPTIONS 预检 | 在每个API路径上执行CORS预检 |
| 5 | 侦察路径探测 | `/admin`、`/.env`、`/.git/HEAD`、`/actuator` |
| 6 | API 前缀后缀爆破 | `/api/v1/<word>` |
| 7 | 智能后缀爆破 | 隐身打乱的前缀 × 后缀 |
| 8 | BAC(失效的访问控制) | 未经身份验证的状态更改端点 |
| 9 | IDOR 自动测试 | ID替换 + 相同正文比较 |
| 10 | CORS 反射测试 | 带凭据的来源反射 |
| 11 | 方法篡改 | GET/POST/PUT/PATCH/DELETE 互换 |
| 12 | 开放重定向探测 | `?redirect=evil.com` 变体 |
| 13 | 竞争条件探测 | 对幂等性敏感的端点进行并发请求 |
| 14 | HTTP 参数污染 | `?id=1&id=2` |
| 15 | 子域名枚举 | 来自CT日志和观察到的流量 |
| 16 | GraphQL 字段模糊测试 | 探测每个自省字段的身份验证 |
| 17 | JWT alg=none 接受 | 服务器信任未签名令牌? |
| 18 | 主机头注入 | `X-Forwarded-Host` 变体 |
| 19 | 缓存投毒 | 未键控标头注入 |
| 20 | IDOR 确认相同正文 | 跨ID的正文相似性 |
| 21 | 身份验证移除测试 | 删除cookie,寻找200响应 |
| 22 | CSRF 验证缺失 | 无令牌的状态更改端点 |
| 23 | gRPC 反射 | 暴露的gRPC反射服务 |
| 24 | 压缩预言(BREACH) | 启发式,不实际利用 |
| 25 | WebSocket 劫持 | 跨来源WS连接 |
| 26 | 缓存投毒探测 | 基于标头的未键控输入 |
| 27 | 时序预言 | 相同端点的时序差异 |
| 28 | COOP/COEP 绕过 | 跨来源隔离强度 |
| 29 | 存储分区 | 跨站点存储隔离 |
| 30 | 智能递归发现 | 3轮探测,从之前响应中链式推导 |
| 31 | 参数发现 | 38个隐藏参数爆破(`debug`、`admin`、`_method`、`bypass`...) |
| 32 | SSTI 探测 | `{{7*7}}`、`${7*7}`、`<%=7*7%>` |
| 33 | XXE 探测 | 带外部实体的XML |
| 34 | CRLF 注入 | 重定向参数中的 `%0d%0a` |
| 35 | API 版本降级 | 对每个观察到的 `/vN/` 进行 `/v1/`、`/v2/` 探测 |
| 36 | 原型污染 | JSON 正文中的 `__proto__` / `constructor.prototype` |
| 37 | SSRF 参数探测 | 26个SSRF参数名称,带有云元数据负载;标记反映的元数据内容 |
| 38 | NoSQL 操作符注入 | JSON ID 字段上的 `{"$ne":null}` / `{"$gt":""}` / `{"$exists":true}` |
| 39 | GraphQL 别名放大 | 50个别名查询 → DoS 放大表面(仅完全模式) |
| 40 | GraphQL 批量放大 | 25元素JSON数组批量 → DoS 放大(仅完全模式) |
| 41 | 缓存欺骗 | `/api/me/avatar.css` 风格——敏感内容缓存在静态扩展名后面 |
| 42 | 子域名接管 | 对捕获的子域名进行HEAD风格探测;匹配 GitHub Pages / S3 / Heroku / Netlify / Vercel / Bitbucket / Shopify 接管签名 |
| 43 | TabNabbing | 没有 `rel="noopener"` 的跨来源 `<a target="_blank">` |
| 44 | postMessage 来源关联 | 没有来源检查的 `addEventListener("message")` 监听器 |
| 45 | Service Worker 范围滥用 | 标记广泛的SW范围(尤其是 `/`) |
另外还有 **8个栈感知攻击包**,当红色模式检测到匹配的框架时会自动触发:Laravel、Spring Boot、Rails、ASP.NET、Django、Next.js、GraphQL、WordPress。每个包包含4-9个特定于栈的测试。Spring Boot 的包单独就击中 `/actuator/heapdump`、`/actuator/env`、`/jolokia/list`、`/h2-console`。
---
## 13种链式模式
单个发现是噪音。复合发现是漏洞。PenScope 的链式分析器遍历完整状态,并在多个信号组合成可利用的内容时发出链式模式。
1. **对敏感端点的身份验证绕过** — 确认缺失认证 + 管理员/账单/用户路径
2. **破坏性BAC** — 路径中包含 `delete`/`remove`/`purge` 的易受攻击端点
3. **易受CSRF攻击的GraphQL变更** — 确认缺失CSRF + 它是一个变更
4. **暴露的认证令牌 + 活跃API** — 内存中的JWT + 匹配的端点
5. **确认的IDOR与敏感数据** — 跨ID的相同骨架响应
6. **带有凭据的CORS反射** — 完整的SOP绕过
7. **认证流程中的开放重定向** — OAuth回调路径上的重定向参数
8. **隐藏的管理路由** — 代码中3个以上从未在流量中观察到的管理员路径
9. **JWT alg=none 被接受** — 服务器信任未签名令牌
10. **源映射泄露密钥** — 生产环境提供了带有硬编码密钥的 `.map` 文件
11. **WebRTC 内部IP泄露** — 通过STUN暴露的私有IP
12. **递归探测发现集群** — 跨多个端点的3个以上敏感发现
13. **特定栈的RCE表面** — 栈包发现了暴露的actuator/Ignition等
每个链式模式都有严重性、摘要、重现命令、后续步骤和置信度分数。按 `严重性 × 置信度` 排序。渲染在红色模式顶部以及每个Claude报告的顶部。
---
## 健康评分(蓝色模式)```
score = max(10, 100 − min(90, crit×22 + high×9))
严格有目的。只有严重和高危的发现会移动分数。中危和低危仍然会出现在计数块和Top-5修复中——它们值得修复——但它们不会拉低分数。
下限设为10,这样灾难性站点显示为“10/100”,而不是“0/100”(用户无法区分它与“扫描失败”)。
PenScope/ ├── manifest.json MV3 manifest, v6.3.0, "type":"module" service worker ├── popup.html Mode UI shell — three modes, glassmorphism dark theme ├── popup.js Renderers, mode router, weaponize panels, fix snippets, │ compliance, Hunt + Workbench launchers, exports ├── content.js Content script — DOM scanning, secrets, JSON islands, │ tech fingerprints, XSS sinks, postMessage scan │ ├── workbench.html / .js Workbench tab — Repeater / Intruder / Encoder / │ Diff / SiteMap / AuthCtx + AuthMatrix │ ├── hunt.html / .js Hunt Mode tab — autonomous orchestrator │ ├── regex-pack.json 81 secret patterns + 44 response-body patterns │ (loaded by SW at boot, merged into RESP_PATTERNS, │ fetched by content script via getRegexPack message) │ ├── src/ Service worker entry + module tree (Phase 7 migration) │ ├── background.js Entry — webRequest, CDP, probe orchestrator, │ │ chain correlator, message router (~7,000 lines) │ ├── probe/ │ │ └── stack-packs.js STACK_ATTACK_PACKS (8 stacks) — extracted module │ └── (other audit-named files are stubs — see MIGRATION.md) │ ├── fonts/ Local woff2: JetBrains Mono + Plus Jakarta Sans │ (4 + 5 weights, ~590 KB total). Replaces the │ Google Fonts beacon that earlier versions hit on │ every popup open. │ ├── icons/ 16, 48, 128 px PNG ├── CHANGELOG.md Full version history v5.1 → v6.3.0 ├── CHANGES.md v6.3 per-phase fix breakdown ├── MIGRATION.md Phase 7 module-migration map (real vs stub) ├── LICENSE MIT └── README.md You are here
四个旧版参考文件(`red-attacks.js`、`blue-fixes.js`、`blue-csp.js`、`blue-compliance.js`)已在 v6.3 中被移除——自 v6.0 起,其内容已内联到 `popup.js` / `background.js` 中;这些独立文件成为死代码。`STACK_ATTACK_PACKS` 现在是来自 `src/probe/stack-packs.js` 的真实 ES 模块导出。
---
## 无需构建步骤```bash
git clone https://github.com/spider12223/PenScope
# That's it.
No npm install. No webpack. No babel. No TypeScript. No bundler. 纯原生 JavaScript。popup.html 的 <script> 标签直接指向 popup.js。Service Worker 直接加载 background.js。CSS 内联在 <style> 中。
MD5 实现是约 50 行内联的 RFC 1321 参考代码(因为 crypto.subtle 不暴露 MD5)。LCS diff 约 30 行。JWT 签名使用原生的 crypto.subtle.sign。链式关联器是纯正则表达式加数组迭代。你在代码库中读到的每一行代码就是浏览器中实际运行的代码。
一个附带 200 个传递性 npm 依赖的侦察工具,就有 200 个包的供应链攻击面。PenScope 零依赖。
欢迎提交 bug 报告和 PR。一些温馨提示:
package.json。如果你需要一个小工具,写 20 行代码。state[tabId] 中。 不要引入新的全局存储。:focus-visible 轮廓、ARIA 标签、≥4.5:1 的对比度。new Function()。 MV3 service worker 禁止动态代码。使用具名函数声明 + args 进行 chrome.scripting.executeScript。MIT。随意使用、复制、发布。
如果 PenScope 为你发现了关键漏洞,请报告问题并告诉我们。我们收集实战故事。
Accessibility.getFullAXTree 会暴露敏感的 aria-label(admin/sudo/delete/destroy 按钮)。Storage.getCookies 会暴露 chrome.cookies.getAll 无法获取的 CHIPS 分区 cookie。<script type="application/json"> 块(Next 的 __NEXT_DATA__、Nuxt 的 __NUXT__、Remix 的 __remixContext、Apollo 的 __APOLLO_STATE__)会被解析为端点和 ID 字段,而不仅仅是正则扫描。curl 按钮、每行的 unauth 按钮(在不带 cookie 的情况下重放请求,并排显示结果)。路由表视图将 /users/123、/users/124 折叠为 /users/{id} 并显示计数。为 admin.*、api.*、internal.* 子域名提供自动透视栏。ffuf -w。window.__ps_ctx 不再将用户的 Authorization 标头泄漏到页面上下文中。链式重放命令默认会隐去会话 cookie(红色模式有一个可选开关用于实时值)。探测 IIFE 在启动时快照 fetch/JSON/Promise/atob/btoa/等,以防止受分析工具监测的页面通过覆盖全局变量拦截探测。本地字体嵌入——弹出窗口打开时零出站请求。"type":"module" 加载。src/ 目录树已就位;STACK_ATTACK_PACKS 已提取到 src/probe/stack-packs.js。其余模块是存根,记录了提取路径。| 集合 | 数量 | 用途 |
|---|
| XSS | 40 | 反射测试、DOM XSS、SVG/iframe 变体 |
| SQLi | 30 | 布尔盲注、基于错误的注入、基于时间的注入、UNION 查询 |
| LFI / 路径遍历 | 28 | 编码变体、Windows + Linux、日志投毒 |
| SSTI | 18 | Jinja2、Twig、Freemarker、Velocity、Smarty |
| SSRF | 22 | 本地主机变体、AWS/Azure/GCP 元数据、gopher/dict |
| 命令注入 | 24 | Bash、PowerShell、IFS 绕过 |
| ID 1-100 | 100 | 用于 IDOR 枚举 |
| 身份验证绕过 | 25 | 路径技巧、角色提升、SQL 身份验证绕过 |
| 常用用户名 | 25 | admin、root、test、support、service…… |
| 模式 | 面向 | 屏幕显示内容 |
|---|
| 🟣 | Classic | 熟悉的工作流,完整数据 | 每个选项卡,每个细节。原始的 PenScope。 |
| 🔴 | Red | 进攻性测试 | 顶部的利用链导轨带有武器化按钮(curl、Nuclei YAML、Burp 请求、H1 报告草稿、Claude 队列)。基于栈的攻击包自动触发检测到的框架(Laravel、Spring Boot、Rails、ASP.NET、Django、Next.js、GraphQL、WordPress)。链优先,经典选项卡折叠在下方。 |
| 🔵 | Blue | 防御者/安全审查 | 健康评分(0-100,严格——仅计入严重和高危)。按严重性×易用性排序的前 5 个修复项,每个都带有可复制粘贴的代码片段(Nginx / Apache / IIS / Express / Django / Laravel / Rails / ASP.NET)。基于观察流量的 CSP 生成器。7 框架合规审计。快照与回归差异。持续监控,当新秘密泄露时通过 Chrome 通知。 |
| 导出选项 | 包含凭据? | 用途 |
|---|
| JSON(完整数据) | ✅ 是 | 团队共享格式。两名挖掘者共同处理同一目标时,需要共享的认证上下文以重现发现。通过 Signal / 加密通道发送。 |
| 📄 完整报告(.md) | ❌ 已编辑 | 漏洞赏金提交、客户参与,或任何离开你团队的场合。认证头值(Authorization、Cookie、X-API-Key、X-Auth-Token、X-CSRF-Token、X-Amz-Security-Token 等)替换为 <redacted, N chars>。包含嵌入的 Hunt 模式草稿报告、栈攻击包命中、持续监控警报和已标记为已修复的工单状态。 |
| Burp URL 列表 | 仅 URL 列表 | 粘贴到 Burp 的目标范围或提供给 ffuf/nuclei |
| 参数词表 | 仅名称 | 模糊测试字典——查询参数 + 表单输入名称 + 隐藏字段名称 |
| 参数词表(ffuf) | 仅名称 | 相同数据以 param=FUZZ 行输出,用于 ffuf -w |
| 端点(txt) | 仅 URL 列表 | 制表符分隔的方法/状态/路径/主机/标签/大小——观察到的 + 发现的路由 |
| 📤 HAR 导出 | 头部 + 主体 | 完整的 HAR-1.2 捕获,可导入 Chrome DevTools / HAR 查看器 / 交给队友 |
| 🔧 Swagger 规范(.yaml) | 仅 URL 列表 | 从观察流量重建的 OpenAPI 3.0 规范 |
| 🗺️ 源码映射(JSON) | 仅源码提取 | 完整的已解析源码映射,包含文件树、秘密、路由、环境变量、依赖项 |
| ⚔️ Nuclei 模板(.yaml) | 仅探测 URL | 放入 ~/.config/nuclei/custom/ 进行持续扫描 |
| 特性 | PenScope(免费) | Burp Suite Pro($449/年) |
|---|
| Repeater | ✅ | ✅ |
| Intruder(4 种攻击模式) | ✅ | ✅ |
| Decoder(B64/URL/Hex/JWT) | ✅ | ✅ |
| Comparer / Diff | ✅ | ✅ |
| Target / Site Map | ✅ | ✅ |
| Active scanner(45 个探测 + 8 个栈包) | ✅ | ✅ |
| 会话/认证上下文处理 | ✅(已保存配置文件 + 矩阵) | ✅(基于规则) |
| 授权矩阵测试器 | ✅(内置) | ❌(付费扩展) |
| 链关联(复合发现) | ✅(13 种模式) | ❌ |
| 子域名接管启发式(8 种服务签名) | ✅ | ❌(付费扩展) |
| GraphQL DoS 表面测试(别名 + 批处理) | ✅ | ❌ |
| 每个端点的未经认证重放按钮 | ✅ | ❌ |
| HAR 导入 + 导出 | ✅(往返) | ✅(单向) |
| IndexedDB 差异(捕获客户端状态泄露) | ✅ | ❌ |
| CHIPS 分区 cookie 捕获 | ✅ | ❌ |
| JSON 孤岛解析器(Next/Nuxt/Remix 水合数据) | ✅ | ❌ |
| 合规映射(PCI/NESA/SAMA/ISO/OWASP) | ✅(7 个框架) | ❌ |
| 基于观察流量的 CSP 生成器 | ✅ | ❌ |
| 回归差异(快照 + 比较) | ✅ | ❌ |
| AI 集成(Claude 双向) | ✅ | ❌ |
| 自主 Hunt 模式(在你睡觉时起草 H1 报告) | ✅ | ❌ |
| 设置时间 | 60 秒 | ~30 分钟(代理 + 证书 + 浏览器配置) |
| TLS 级代理拦截 | ❌(浏览器限制) | ✅ |
| 带外测试(Collaborator) | ❌(计划中) | ✅ |
| 扩展市场 | ❌ | ✅ |
| 成本 | $0 | $449 / 用户 / 年 |
| State | Score |
|---|
| 0严重, 0高危 | 100 (干净) |
| 1高危 | 91 |
| 3高危 | 73 |
| 1严重 | 78 |
| 1严重 + 3高危 | 51 |
| 3严重 | 34 |
| 5+严重 | 10 (下限) |
| 权限 | 原因 |
|---|
webRequest | 捕获每个请求/响应,无需重新获取 |
webNavigation | 检测 SPA 的 pushState/replaceState 路由变化(v6.3+),避免当 SPA 跨源导航时,来自 app.com 的端点混入新源的 state |
activeTab | 读取当前标签页的 URL 并发送内容脚本消息 |
scripting | 向页面上下文注入探测运行器、堆叠包和 Workbench 请求 |
tabs | 将发现映射到正确的标签页;在新标签页中打开 Workbench |
cookies | 读取 document.cookie 无法看到的 HttpOnly cookie |
debugger | 深度模式必需——启用 CDP 以获取完整的响应体、运行时自省、源码提取、审计问题、无障碍树、分区 cookie |
notifications | 持续监控到新的秘密泄露时发出警报 |
alarms | 持续监控每 5 分钟触发的定时器 |
storage | 在 SW 重启后持久化 state(session)和快照(local) |
<all_urls> 主机权限 | 捕获不针对特定目标;用户控制打开哪个标签页 |