xzycd/gatecrash

GitHub: xzycd/gatecrash

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

Stars: 0 | Forks: 0

Gatecrash terminal access map comparing routes across three sessions **使用错误的 session 重放捕获的请求,看看哪些请求仍然能够进入。** [![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/xzycd/gatecrash/actions/workflows/ci.yml) [![node](https://img.shields.io/badge/node-22.12%2B-5FA04E)](https://nodejs.org/) [![license](https://img.shields.io/badge/license-MIT-C9FF43)](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安全, 授权测试, 文档结构分析, 暗色界面, 自动化攻击, 蓝队分析, 越权检测