xzycd/gatecrash
GitHub: xzycd/gatecrash
Gatecrash 通过用不同权限角色的 session 重放捕获的 Web 请求并比对响应,帮助测试者高效发现潜在的越权访问路由。
Stars: 0 | Forks: 0

**使用错误的 session 重放捕获的请求,看看哪些请求仍然能够进入。**
[](https://github.com/xzycd/gatecrash/actions/workflows/ci.yml)
[](https://nodejs.org/)
[](LICENSE)
寻找路由很容易。但以管理员、成员和匿名访问者的身份反复重新检查它们,
很快就让人感到厌烦。
Gatecrash 可以读取浏览器的 HAR、URL 列表或爬虫的 JSONL。它会使用 `gatecrash.yml` 中配置的 session
重放每个符合条件的请求,对响应进行指纹识别,并在终端中绘制出访问地图。
匹配成功的响应将成为审查线索。
Gatecrash 不会直接声明漏洞。HTTP 相似度无法告诉你应用程序的预期策略,
因此最终判断权仍掌握在测试人员手中。
## 安装
从 npm 安装:
```
npm install --global @xzycd/gatecrash
gatecrash --version
```
为了进行更严格地安装,可以禁用所有包的生命周期脚本并固定到特定的发布版本:
```
npm install --global --ignore-scripts @xzycd/gatecrash@0.6.0
```
从 Gatecrash 的代码检出中安装:
```
npm ci
npm run check
npm install --global .
gatecrash --version
```
只有在当前代码检出之外使用 `gatecrash` 时,才需要进行全局安装。
在开发过程中,`npm run dev -- --help` 可以直接从源码树运行相同的 CLI。
## 尝试本地实验环境
```
npm install --global @xzycd/gatecrash
gatecrash demo
```
演示程序会绑定到一个随机的环回端口,包含两个故意设置的授权错误,并在运行结束后关闭。
```
gatecrash http://127.0.0.1:54751 ───────────────────── 3 routes · 3 sessions · 212 ms
╭─ EXACT MATCH ──────────────────────────────────────────────────────────────────────────╮
│ 2 routes returned a byte-identical successful response to bob, anonymous. Check each │
│ against the access policy the application is supposed to enforce, then treat what is │
│ left as a finding. │
╰────────────────────────────────────────────────────────────────────────────────────────╯
2 sessions received responses they should have had to earn.
access map ───────────────────────────────────────────────────── 3 routes · 3 sessions
request alice/base bob anonymous
▌ GET /api/account/alice 200 ● 200 ! 401 ✓
▌ GET /api/member/export 200 ● 200 ≠ 200 !
▌ GET /api/me 200 ● 200 ≠ 401 ✓
● baseline · ! review · ✓ blocked · ≠ changed · ? inconclusive
▌ ██████████ exact GTC-7A1F0B GET /api/account/alice review
▌ ├ alice 200 → bob 200
▌ │ bob received the same successful response as alice.
▌ └ the normalized response bodies are identical
▌ ██████████ exact GTC-B0BB10 GET /api/member/export review
▌ ├ alice 200 → anonymous 200
▌ │ anonymous received the same successful response as alice.
▌ └ the normalized response bodies are identical
██████████████████ 3 routes · 2 review · 2 changed · 2 blocked · 2 skipped
› gatecrash explain GTC-7A1F0B to read the evidence behind one
```
每次运行时的端口和时间都会发生变化。其余内容来自当前的演示程序。
## 实际运行
从配置文件开始:
```
gatecrash init
```
```
target:
origin: https://app.example.test
requests_per_second: 2
concurrency: 4
profiles:
admin:
level: 100
headers:
Authorization: "Bearer ${ADMIN_TOKEN}"
member:
level: 10
headers:
Authorization: "Bearer ${MEMBER_TOKEN}"
anonymous:
level: 0
compare:
baseline: admin
against: [member, anonymous]
similarity_threshold: 0.92
exclude:
paths: [/health, /assets/**]
```
在发送流量前预览范围:
```
gatecrash inspect session.har
```
`inspect` 会读取配置,但不会解析 session 密钥。它会显示
目标、允许的方法、路由、跳过的请求以及总重放次数。
它不会发起网络请求。
当预览看起来没问题后,运行比较:
```
ADMIN_TOKEN=... MEMBER_TOKEN=... gatecrash check session.har
```
打开其中一个结果的证据:
```
gatecrash explain GTC-7A1F0B
```
这些命令并不是模拟的:`check` 会加载捕获的记录和配置,
将范围内的请求使用每个配置文件发送到精确配置的源站,
并比较接收到的响应。请仅在您拥有或已获授权测试的系统上使用它。
## 从 GitHub 更新
在不更改当前安装的情况下,检查 GitHub 上最新的稳定版本:
```
gatecrash update --check
```
安装它,或者选择一个特定的稳定版本:
```
gatecrash update
gatecrash update 0.6.0
```
Gatecrash 仅接受发布在 `xzycd/gatecrash` 下的发布资产,然后在
启动禁用包脚本的全局 npm 安装之前,将下载的 npm 压缩包与该版本的 `SHA256SUMS` 进行匹配。尝试结束后将删除临时的更新
文件。安装较旧的版本需要使用
`--force`。
## 捕获格式
HAR 文件可直接使用。您可以从浏览器的网络面板或您的
代理中导出。
普通的 URL 文件可以包含一个可选的方法:
```
https://app.example.test/api/me
GET https://app.example.test/api/admin/users
HEAD https://app.example.test/downloads/report
```
JSONL 接受 `url`、`endpoint`、`request.url` 或 `request.endpoint`。常见的
爬虫输出(包括 Katana JSONL)无需转换脚本。
查询值会被重放,但绝不会被打印或保存。访问地图仅显示查询
名称,例如 `/search?q&page`。
## 阅读访问地图
每个单元格都包含状态码和符号,因此即使在禁用颜色的情况下也能读取结果。
此处的颜色仅作为辅助标签,绝不会单独承载含义。
| 符号 | 结果 | 含义 |
|---:|---|---|
| `●` | baseline | 配置的 baseline 响应。 |
| `!` | review | 较低或相等权限的 profile 接收到了匹配的成功响应。 |
| `✓` | blocked | 挑战者收到了重定向、`401`、`403` 或 `404`。 |
| `≠` | changed | 两个 session 都成功了,但它们的响应体不同。 |
| `=` | same | 响应体匹配,但挑战者具有更高的配置级别。 |
| `?` | inconclusive | baseline 失败或挑战者返回了其他状态。 |
JSON 使用稳定的键排序,并会替换配置中指定的易失性值。HTML
会被解析,并通过可见文本和标签结构进行比较。纯文本使用
token 重叠度进行比较。二进制响应体使用 SHA-256。
有关分类规则,请参阅 [docs/checks.md](docs/checks.md);
有关保存的输出,请参阅 [docs/report-schema.md](docs/report-schema.md)。
## 安全模型
Gatecrash 仅适用于您拥有或已获授权测试的系统。
- 每次重放都必须与 `target.origin` 完全匹配。
- 目标 URL 和捕获 URL 中嵌入的凭据会被拒绝。
- 捕获的自定义 header 会被丢弃。只有 `Accept`、`Accept-Language` 和
`Content-Type` 会在提取后保留。
- Authorization header、cookie 和其他 session 值均来自配置。
环境变量仅在检查开始时才会被解析。
- `Host`、`Content-Length`、逐跳 header、原始 cookie header 以及包含
控制字符的 header 值都会在 profile 中被拒绝。
- 默认情况下仅运行 `GET`、`HEAD` 和 `OPTIONS`。
- 重定向会被记录,但永远不会被跟随。
- 默认情况下,响应大小限制为 1 MB。
- 捕获文件大小限制为 100 MB,条目数限制为 100,000。每次检查的
重放请求限制为 100,000 个,以防止意外的导出变成无限制的
运行。
- 报告不包含任何请求 header、响应 header、cookie、token、请求
体、响应体或查询值。不包含 `=` 的查询部分会被视为
值而不是名称,因此单纯的 token 永远不会出现在保存的报告中。
- 报告文件会进行原子替换,并在平台支持的
情况下使用 `0600` 模式,且通过对打开的文件描述符进行有限读取来验证,
而不是检查路径大小。
- 响应指纹识别在堆栈、堆和时间上都有严格限制,因此对于返回深度嵌套 JSON 或标签炸弹的
目标,只需消耗固定的计算资源,
而不会导致运行崩溃或每个路由卡住十秒钟。
- 输出到终端的任何内容都会首先移除控制字符、双向字符和零宽
字符,因此来自恶意捕获的路径无法重新绘制
屏幕或颠倒其显示的内容。
- 保存的 Markdown 会转义链接和图片语法,因此精心构造的路径无法
作为有效的链接出现在审查者面前。
只有在检查其副作用后才允许使用其他方法:
```
gatecrash inspect session.har --allow-method POST
gatecrash check session.har --allow-method POST
```
## 脚本与 CI
```
gatecrash check session.har --format json --no-save
gatecrash check session.har --format markdown --out report.md
gatecrash check session.har --plain --fail-on-review
gatecrash inspect session.har --format json
```
退出代码是稳定的:
- `0` 表示命令成功完成。
- `1` 表示命令未能完成。
- `2` 表示检查已完成并带有审查结果,且设置了 `--fail-on-review`。
实时进度行会在 stderr 上内联渲染,并在运行
结束后自动清除。它不会使用备用屏幕或清除滚动历史,因此已完成的
报告会保留在滚动历史中。颜色显示会从 24 位降级到 256 调色板,最后降为无色。当终端无法保证 UTF-8 支持时,框线绘制会降级为 ASCII,并且
JSON 标准输出将仅包含 JSON。
## 当前限制
一次运行只能有一个 baseline profile。Gatecrash 不会刷新 session、执行
登录流程、抓取浏览器或推断业务策略。原始交互数据将保留在
最初的浏览器或代理捕获中,因为保存的报告经过了严格的
脱敏处理。配置最多接受 64 个 profile,并会拒绝未知的设置
名称,因此拼写错误不会悄无声息地削弱某次
运行。
## 开发
```
git clone https://github.com/xzycd/gatecrash.git
cd gatecrash
npm install
npm run check
npm run demo
```
测试套件涵盖了配置解析、捕获脱敏、范围强制执行、
指纹识别、分类、报告隐私、恶意输入、五种终端宽度下的每条渲染
路径、CLI 进程,以及针对环回
实验环境的完整运行。在更改报告 schema 或重放
行为之前,请阅读
[CONTRIBUTING.md](CONTRIBUTING.md)。
## 许可证
MIT。详见 [LICENSE](LICENSE)。
标签:GNU通用公共许可证, MITM代理, Modbus, Node.js, Web安全, 授权测试, 文档结构分析, 暗色界面, 自动化攻击, 蓝队分析, 越权检测