跨捕获的网络流量追踪 OAuth 2.0、OIDC 和 Microsoft Entra ID 令牌。将 Burp Suite XML 导出、mitmproxy 流文件或实时 Chrome DevTools Protocol 流摄取到单个 SQLite 数据库中,然后提供交互式 Web 仪表板,用于过滤令牌、遍历交换、发现高风险作用域、导出令牌以供重放,并将令牌生命周期可视化为 Mermaid 图。
状态: TATS 在个人 / 参与测试使用场景下已稳定。针对 Microsoft 365 / Entra 生态系统(FOCI、BroCI/NAA、ESTSAUTH 会话 Cookie、entrascopes.com 增强)进行了优化,但也可用于任何标准 OAuth/OIDC 流量。
当你通过 Burp / mitmproxy 代理一个长时间的 Microsoft 365 或 Azure 会话时,产生的捕获数据非常庞大,而大多数工具要么:
此工具提取每一个观察到的 access / refresh / id 令牌,对它们进行指纹识别以便跨来源关联同一令牌,解码 JWT 声明,将 Microsoft 客户端 / 资源 GUID 对照 entrascopes.com 进行解析,并将整个图景渲染为单个仪表板——包括一个 refresh-token 链视图,用于追踪 FOCI 跨应用交换和 BroCI 嵌套应用令牌签发。
本项目主要面向研究和教育目的,但提供了命令预览和令牌导出等功能选项,可支持某些攻击性工具。
ingest — Burp Suite “Save items” XML 导出mitm — mitmproxy .mitm 流文件(HTTP WebSocket 帧)cdp — 通过 DevTools Protocol 实时附加到 Chrome / Edge
(实时,无需代理 CA 即可捕获 TLS 解密后的 HTTP 和 WebSocket 帧;通过浏览器级自动附加追踪每个现有标签页以及运行期间打开的每个标签页)--append 运行以合并到现有数据库;令牌会被 upsert(使用次数 + 观察到的生命周期累积),事件和交换会被追加,行的 source_tag 记录每个见过该令牌的摄取过程。pip install mitmproxy)。access_token、refresh_token、id_token)和 Cookie 名称启发式规则决定令牌类型。ESTSAUTH、ESTSAUTHPERSISTENT、ESTSAUTHLIGHT、SignInStateCookie)被明确识别为 refresh 等效令牌(否则它们会被通用的 “auth” Cookie 提示错误分类)。foci 字段检测。brk_client_id、brk_redirect_uri 和 brk-<guid>:// 重定向方案检测。--enrich 标志从 https://entrascopes.com/ 获取 firstpartyscopes.json 和 resources.json,并将 appid / azp / aud GUID 解析为带可点击链接的友好名称。upn / preferred_username / unique_name / email / name 对令牌分桶,回退到 sub@iss 或 oid,并单独呈现仅应用和未知身份桶。当用户出现在 ≥2 个 source_tag 中时,每个身份行会显示一个 captures 徽章(跨捕获存活,这是 --append 研究的核心信号),外加一个 first_seen → last_seen 时间跨度,以及一个 timeline 按钮,用于在 Sequence-diagram 标签页上高亮该用户的每个令牌。appid / azp / 表单正文 client_id / brk_client_id / brk_nested_id),带有 FOCI / brokerable / broker / nested 徽章。aud 声明,尽可能解析为 entrascopes 资源名称。tid 值,以及令牌 / 用户 / 应用计数。scp / scope / roles 与一份精选的高影响 Microsoft Graph 权限和 Azure 资源作用域监视列表进行比对。(token, host) 对,其中令牌被用于与其 aud 声明不一致的主机(表明凭据泄露或滥用)。amr)— pwd / mfa / pop / smartcard 分布。xms_cc=CP1)、持有证明绑定(cnf 声明,并跨受众检测共享 kid)、step-up 认证要求(acrs)以及 acr 认证上下文级别。每一行都可点击,并将 Tokens 标签页过滤为仅显示携带该标记的令牌。⚠ priv 徽章——这是 FOCI / BroCI 式权限扩展研究信号。source_tag 统计令牌计数,以便查看每次摄取过程产生了多少行。roadtx describe、roadtx auth、curl、Python requests 和 PowerShell Invoke-RestMethod 的可复制粘贴片段。ws-frame-sent / ws-frame-received,来源为 ws[body_json[<key>]],并带有一个 ws_session_id,用于将单个 WebSocket 连接内的所有帧分组。数据库存储每个观察到的令牌的 SHA-256 指纹(前 12 个十六进制字符)和 12 字符前缀。完整令牌字符串绝不会离开输入文件。
解码后的 JWT 声明内容(header + payload,包括 oid、sub、upn、email、tid、作用域列表等)默认原样存储,因为它们正是分析的全部意义。只要存在 JWT,就应将数据库和任何共享的仪表板 URL 视为敏感信息。
--redact-claims(可用于 ingest、mitm 和 cdp)会在列出的声明值进入数据库之前,将其替换为稳定的哈希占位符。默认字段列表涵盖 sub、oid、upn、email、name、unique_name、preferred_username、emails、mail、ipaddr、given_name、family_name。传入显式的逗号分隔列表(例如 --redact-claims sub,upn,oid)可覆盖默认值。相同输入始终映射到相同占位符,因此仪表板的 Users / Tenants 分组仍然有效,而不会泄露用户身份。
--store-tokens(可用于 ingest、mitm 和 cdp,默认关闭)选择将完整令牌字符串写入数据库,以便仪表板可以提供:
.roadtools_auth,任何 roadtx 子命令都会读取它)。tid、appid 和 aud 声明预填最常见的重放调用——roadtx describe、roadtx auth、curl、Python requests、PowerShell Invoke-RestMethod。dataclasses)。已在 3.12 上测试。python -m tats。| 需求 | 安装 |
|---|---|
mitm 子命令 | pip install mitmproxy |
| 从 Chrome / Edge 实时捕获 | 无 — 使用 stdlib WebSocket 客户端 |
--enrich(entrascopes.com) | 无 — 使用 urllib.request |
从检出目录运行(无需安装):```bash git clone tats cd tats python -m tats --help
仪表盘的 HTML / CSS / JS 位于 `tats/static/`,并在首次导入时加载,因此无需构建步骤——直接从检出目录运行该模块即可。
**作为包安装(会提供 `tats` 控制台脚本):**```bash
pip install . # core only
pip install .[mitm] # + mitmproxy flow file support
pip install .[test] # + pytest for the test suite
pip install .[all] # everything
安装完成后,你可以通过其短名称调用该工具:```bash tats ingest engagement.xml -o tokens.db --enrich tats serve tokens.db
如果你只需要 Burp / CDP 路径,该文件完全自包含,仅依赖 Python 标准库——无需安装或额外依赖。
---
## 快速开始
**分析 Burp XML 导出文件并打开仪表盘:**```bash
tats ingest examples/fixture.xml -o tokens.db --enrich
tats serve tokens.db
将 Burp 捕获与 mitmproxy 流文件合并到一个数据库中:```bash tats ingest engagement.xml -o tokens.db --enrich tats mitm chat-session.mitm -o tokens.db --enrich --append tats serve tokens.db
**从 Chrome 浏览器实时捕获(可查看 TLS 解密后的 HTTP + WebSocket 帧,无需代理 CA)——让工具启动浏览器:**```bash
# Terminal 1 — auto-launch Chrome / Edge / Chromium / Brave
tats cdp -o tokens.db --enrich --launch-chrome
# Terminal 2 — open the dashboard (auto-refreshes every 5 s)
tats serve tokens.db
当你按下 Ctrl-C 终止 cdp 命令时,启动的浏览器会被终止,其临时配置文件也会被删除。
如果你更愿意附加到一个已经运行的浏览器,请使用 --remote-debugging-port=9222 --user-data-dir=/tmp/cdp-profile 启动它,并在运行 cdp 时不带 --launch-chrome。
在共享数据库之前对其进行脱敏(PII 脱敏):```bash
tats ingest engagement.xml -o tokens.db
--enrich --redact-claims
脱敏是内容稳定的:相同的值映射到相同的占位符,因此仪表板的按用户分组仍然有效,而无需显示用户。
一旦数据开始流入,仪表板的标题会显示 `live · updated <time>`。
---
## 子命令
每个子命令都接受 `--help` 以获取规范选项列表。下面的说明解释了*何时*以及*如何*使用每一个子命令。
### 全局标志
这些标志适用于每个子命令,并且位于子命令名称*之前*:
* `-v` / `--verbose` — 添加 INFO 日志行(富化状态、摄取脱敏计数)。`-vv` 添加 DEBUG(每个服务器请求)。
* `-q` / `--quiet` — 静默 INFO 日志行;仅显示 WARNING 和 ERROR。最终用户输出行(例如 `wrote tokens.db (...)`)以及任何 `error: …` 诊断信息不受影响,因此你仍然可以从脚本中看到重要内容。
* `--version` — 打印工具版本并退出。
### `ingest` — Burp Suite XML 导出
读取“Save items”XML(Proxy → HTTP history → 右键单击 → Save items)。二进制 `.burp` 项目文件**不**受支持——该格式是专有的,并且在不同的 Burp 版本之间不稳定;导出你关心的项目是受支持的工作流程。```bash
tats [-v|-q] ingest <burp_items.xml> -o tokens.db \
[--enrich] [--enrich-cache-dir DIR] [--no-enrich-cache] \
[--append] [--source-tag TAG] [--no-progress] \
[--redact-claims [CLAIMS]] [--no-serve-hint]
示例:```bash
tats ingest burp.xml -o tokens.db --enrich
tats ingest day2.xml -o tokens.db --append
--source-tag burp:day2
### `mitm` — mitmproxy `.mitm` 流量文件
读取由 `mitmdump`、`mitmproxy` 或 `mitmweb` 生成的流量文件。这是唯一无需实时浏览器会话即可捕获 **WebSocket 帧** 的摄取路径——流量文件会保留每个文本/二进制帧的负载。```bash
tats [-v|-q] mitm <flow_file.mitm> -o tokens.db \
[--enrich] [--enrich-cache-dir DIR] [--no-enrich-cache] \
[--append] [--source-tag TAG] [--no-progress] \
[--redact-claims [CLAIMS]] [--no-serve-hint]
需要 pip install mitmproxy。如果缺少该包,工具会输出明确的错误信息。
使用 mitmproxy 捕获流量文件:```bash mitmdump -w session.mitm
tats mitm session.mitm -o tokens.db --enrich
### `cdp` — 实时附加到 Chrome / Edge
通过 DevTools 协议连接到正在运行的 Chromium 系列浏览器,
并将 `Network.*` 事件流式写入数据库。捕获 HTTP 请求 /
响应(通过 `Network.getResponseBody` 获取响应体)、WebSocket
升级,以及双向的每一个 WebSocket 帧。缓冲区每 N 个事件刷新到
数据库(默认 25),因此仪表板的 5 秒轮询
能在浏览器发出请求后的几秒内捕获到新的令牌。```bash
tats [-v|-q] cdp [-o tokens.db] \
[--host 127.0.0.1] [--port 9222] [--target ID] \
[--launch-chrome [PATH]] [--flush-every N] \
[--enrich] [--append] [--redact-claims [CLAIMS]]
--launch-chrome)```bashtats cdp -o tokens.db --launch-chrome
tats cdp -o tokens.db
--launch-chrome /opt/google/chrome-canary/chrome
启动的浏览器使用 `--remote-debugging-port=<port>` 和一个全新的临时 user-data-dir 运行。当你停止 `cdp` 命令(Ctrl-C)时,浏览器会被终止,临时配置文件会被删除。
### 附加到已运行的浏览器
自行启动浏览器,使用全新的配置文件,然后在不带 `--launch-chrome` 的情况下运行 `cdp`:```bash
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--remote-debugging-port=9222 ^
--user-data-dir="%TEMP%\cdp-profile"
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 --user-data-dir=/tmp/cdp-profile
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/cdp-profile
单独的 user-data-dir 可避免附加到个人配置文件,并防止正在运行的浏览器拒绝调试标志。
默认情况下,cdp 在 浏览器 级别附加,并跟踪启动时存在的每个标签页以及运行期间打开的每个标签页(window.open、Ctrl-点击、新建标签页按钮)。所有标签页通过 CDP 扁平协议会话多路复用器共享同一个 WebSocket,因此在捕获运行期间打开或关闭标签页是完全支持的。每个标签页的附加/分离都会在 INFO 级别向 stderr 打印一行说明。
如果你更希望固定到单个标签页,并在该标签页关闭时结束附加,请列出可用的目标:```bash curl http://127.0.0.1:9222/json/list
…然后传入 `--target <id>`。
按 Ctrl-C 停止。进程退出前,任何进行中缓冲区的尾部内容都会被刷新到数据库中。
### `serve` — Web 仪表盘
读取现有数据库,并在 `127.0.0.1:8765` 上提供单页 Web UI。该服务器为只读模式;它从不写入数据库,因此可以安全地与正在进行的 `cdp` 或 `mitm` 数据摄取同时运行。```bash
tats serve <tokens.db> \
[--host 127.0.0.1] [--port 8765] [--no-browser]
示例:```bash
tats serve tokens.db
tats serve tokens.db --port 9000 --no-browser
tats serve tokens.db --host 0.0.0.0
> **警告:** Web UI 会向任何能够访问绑定地址的人暴露已解码的 JWT 载荷(声明)、令牌指纹、活动时间线以及 Mermaid 图表。如果你使用 `--store-tokens` 进行摄取,它还会通过 `/api/token/<fp>` 和 `/api/export?fps=...` 暴露**完整的原始令牌**。这里**没有身份验证**。除非你明确另有打算,否则请将 `--host` 保持在 `127.0.0.1`。
#### 可重放导出
当数据库使用 `--store-tokens` 构建时,Tokens 标签页中每个展开的令牌都会获得一行一键操作:
* **复制原始值** — 将完整令牌字符串复制到剪贴板。
* **复制 Bearer 头** — `Authorization: Bearer <token>`,可直接粘贴。
* **复制 curl 示例** — 一条针对该令牌 `aud`(或其颁发者主机)并附带 bearer 头的单行命令。
* **下载 JSON** — 一个包含原始值、声明、观察到的事件和交换的单令牌 JSON 文件。
* **复制为 roadtx** — roadtools 令牌缓存(`tokenType`、`accessToken` / `refreshToken` / `idToken`、`expiresOn`、`tenantId`、`_clientId`、`resource`、`foci`、`scope`)的 JSON 结构。可直接粘贴到 `.roadtools_auth` 文件中。
* **下载 .roadtools_auth** — 相同载荷,以文件形式下载。将其重命名为 `.roadtools_auth`(或通过 `roadtx <cmd> --tokens-file` 传入),任何 roadtx 子命令都会识别它。
Tokens 标签页工具栏还有 **导出所选以供重放**,它会请求 `/api/export?fps=fp1,fp2,...` 并下载一个包含最多 200 个令牌(原始值、声明、事件)的单一 JSON 文档。如果没有 `--store-tokens`,相同的按钮会显示提示,要求重新摄取后才能进行可重放导出。
#### 命令预览
每个展开的令牌还有一个可折叠的 **命令预览** 块,它使用令牌的实际声明(当 `--store-tokens` 开启时还包括完整原始值)预填充最常见的重放 / 检查调用。每个片段都有一个一键复制按钮。具体组合取决于令牌类型:
* **任何 JWT:** `roadtx describe -t '<token>'`(无需网络即可解码)。
* **刷新令牌:**
* `roadtx auth --refresh-token '...' -c <client_id> -t <tenant_id>` — 用刷新令牌换取新的访问令牌。
* `curl -X POST .../oauth2/v2.0/token` — 适用于不使用 roadtx 的用户的 OAuth 等效命令。
* **访问 / id / 未知令牌:**
* `curl -H 'Authorization: Bearer ...' '<aud>'`
* 设置 bearer 头的 Python `requests.get(...)`。
* 使用相同头的 PowerShell `Invoke-RestMethod`。
* **始终包含:** 可放入 `.roadtools_auth` 的 JSON 对象。
当 `--store-tokens` 关闭时,片段会以 `<TOKEN>` 作为占位符渲染,因此该面板仍可作为文档参考使用。
---
## Web UI 详解
### 顶部导航
`Summary | Tokens | Exchanges | FOCI | BroCI | Graph | Sequence`
每个标签页都独立地从 `/api/data` 的同一内存快照渲染。切换标签页是瞬时的;图表和序列图按需重新渲染,并遵循 Tokens 标签页中的当前选择。
### Summary
顶部的统计磁贴(tokens / access / refresh / id / unknown / used / unused / events / exchanges / FOCI exchanges / BroCI exchanges / hosts),随后是 [功能 → 仪表板卡片](#dashboard-cards) 中描述的卡片网格。
点击任何卡片中的任何行都会跳转到预筛选的 Tokens 标签页 — 例如,点击某个租户行会将清单筛选为携带该 `tid` 的令牌。
### Tokens
可筛选、可排序的清单。多选驱动高亮 / 隔离 / 序列按钮。行展开会显示完整的已解码 JWT(头部 + 载荷作为原始 JSON)、涉及该令牌的每个事件,以及它作为输入或输出的每次交换。
### Exchanges
所有检测到的令牌换令牌交换的可排序列表 — 刷新令牌轮换、FOCI 交叉兑换以及 BroCI 嵌套应用交换。BroCI 列并排显示代理 + 嵌套客户端 ID,以及触发检测的证据。
### FOCI
两个表格:每个标记为 FOCI 家族的刷新令牌(目前 Microsoft 仅发出 `"1"`),以及每个响应携带 `foci` 字段的交换。
### BroCI
嵌套应用身份验证交换。对于每一个:代理应用(`brk_client_id`)、嵌套客户端(`client_id`)、触发检测的证据(`brk_client_id`、`brk_redirect_uri`、`brk-<guid>://` 重定向 URI),以及输入 / 输出令牌指纹。
### Graph
令牌 ↔ 服务关系的 Mermaid `flowchart LR`。刷新令牌绘制为圆柱体,访问 / id 令牌绘制为体育场形状。边显示颁发、出示、交换和轮换。高亮(来自 Tokens 标签页)会添加黄色强调;隔离会仅使用所选令牌及其交换的令牌重新渲染图表。
### Sequence
按捕获顺序显示每个事件的 Mermaid 序列图。选择单个令牌仅显示其序列;选择多个令牌会保留完整视图,但会为所选令牌加星标。可配置的最大事件上限(默认 200;超过几百条消息后 Mermaid 序列图会变得难以阅读)。
---
## Microsoft 特定支持
### 客户端 ID 家族 (FOCI)
Microsoft 允许颁发给某个“家族”中一个应用的刷新令牌在令牌终结点被同一家族中的**任何其他应用**兑换。该工具通过解析令牌终结点响应 JSON 中的 `foci` 字段(目前对于唯一已知家族始终为 `"1"`)来检测线上的 FOCI。在此类响应中颁发的刷新令牌会被标记家族 ID,并显示在专用的 **FOCI** 标签页中。
如果启用了 `--enrich`,清单的应用列还会显示 `firstpartyscopes.json` 的 `foci: true/false` 标志 — 请注意,这可能与线上检测不一致(entrascopes 数据集有时较为保守)。线上的 `foci` 字段始终是权威信号。
### 代理客户端初始化 / 嵌套应用身份验证 (BroCI / NAA)
Office 加载项、Teams 应用和 Azure 门户使用 NAA 通过代理应用为嵌套客户端获取令牌。该工具在请求侧通过以下方式检测:
* `brk_client_id` 表单参数(代理应用的 GUID),
* `brk_redirect_uri` 表单参数(代理的实际重定向 URI),
* 形式为 `brk-<guid>://...` 的 `redirect_uri`(其中 `<guid>` 是代理)。
生成的访问令牌的 `appid` / `azp` 声明是嵌套客户端;代理仅出现在线上 — 从不作为 JWT 声明出现。仪表板清晰地显示双方。
### `ESTSAUTH` 会话 Cookie
`ESTSAUTH`、`ESTSAUTHPERSISTENT`、`ESTSAUTHLIGHT` 和 `SignInStateCookie` 是 Microsoft Entra 会话 Cookie,它们不会在 `Authorization: Bearer` 中传输,但浏览器使用它们通过静默身份验证流铸造新的访问令牌。该工具将它们标记为 `refresh`(其功能角色),而不是让通用的 `auth` 子字符串规则将它们误分类为 `access`。
### entrascopes.com 增强 (`--enrich`)
从 <https://entrascopes.com/> 获取并缓存 `firstpartyscopes.json`(约 2.8 MB;504 个第一方应用及其 FOCI 标志、重定向 URI、作用域和代理能力)和 `resources.json`(约 170 KB;1,750+ 资源 → 显示名称映射)。缓存位于:
| 变量 | 默认值 |
|---|---|
| `$TATS_CACHE` | (最高优先级;`$BURP_TOKEN_TRACKER_CACHE` 作为一次性版本迁移的回退被支持) |
| `$XDG_CACHE_HOME/tats` | (Linux/macOS) |
| `%LOCALAPPDATA%\tats\cache` | (Windows) |
| `~/.cache/tats` | (回退) |
TTL 为 7 天。使用 `--no-enrich-cache` 强制重新获取。当工具离线运行时,缓存会作为过期回退被重用。
当 `--enrich` 开启时,每个 `appid` / `azp` / `client_id` GUID 以及每个 GUID 或 URL 形式的 `aud` 声明都会被解析为友好名称,并附带可点击的 `https://entrascopes.com/?appId=<guid>` 链接。
---
## 架构
### 一次性:文件 → 数据库 → Web UI```
burp.xml ─┐
.mitm ─┼─→ Tracker ─→ ingest_to_db ─→ tokens.db ─→ Store ─→ /api/data ─→ dashboard
CDP WS ─┘ ▲ │
(live, repeated) └───── --append upserts on every flush ─┘
每个源路径都会生成相同的 Tracker 对象。ingest_to_db
将其转换为数据库中的行。Store 为 HTTP 服务器读取数据库,该服务器通过 /api/data、/api/meta、
/api/token/<fp>、/api/export、/api/graph 和 /api/sequence 暴露 JSON。
tokens(主键 fp)—— 指纹、样本前缀、类型、
格式、观察到的生命周期、JWT 头部 / 载荷(JSON 格式)、富化
字段、派生字段(user_identity、exp_unix、tenant_id、
scopes_text)、逗号分隔的 source_tag、raw(完整令牌
字符串,除非使用 --store-tokens 摄取,否则为 NULL),以及
security_features(描述检测到的 CAE / PoP /
步骤升级标记的紧凑 JSON —— 参见 Security features 卡片)。
较旧的 v2 / v3 数据库在以追加模式重新打开时自动迁移:
v2 → v3 添加可空的 raw 列;v3 → v4 添加可空的
security_features 列,并在首次打开时从每个令牌存储的
jwt_payload_json 回填。已存在的行保持两列
为其先前的值。events —— 每次观察到的令牌交互:HTTP 请求 /
响应或 WebSocket 帧。角色:issued / returned /
presented / used / exchanged-in / ws-frame-sent /
ws-frame-received。携带 ws_session_id 用于在连接内
分组帧。exchanges —— 当对令牌端点的携带令牌请求
在其响应中产生了新令牌时。记录 FOCI / BroCI 元数据。exchange_inputs、exchange_outputs —— 每次交换
每一侧的令牌指纹。hosts —— 不同的 host:port 标签。meta —— 模式版本、源列表、generated_at、last_modified
(由仪表板的实时轮询使用)、计数。写入数据库的每一行都携带一个 source_tag —— 默认情况下
burp:<filename>、mitm:<filename> 或 cdp:<host>:<port>,但
可通过 --source-tag 覆盖。当同一指纹被
多个摄取过程看到时,source_tag 字段会累积为
逗号分隔的列表,因此仪表板的 Sources 卡片可以显示
每个令牌的来源。
--append 保留现有数据库并通过 UPSERT 合并到其中
(令牌使用计数 + 观察到的生命周期累积,未知类型
升级),并对事件 / 交换使用 INSERT(其 seq 编号
偏移超过现有最大值,因此活动时间线保持
单调)。模式版本不匹配会拒绝合并以防止静默
数据丢失。
Web 服务器的 /api/meta 端点返回 meta 表(约 200
字节)。仪表板每 5 秒轮询一次,并且仅在 last_modified 变化时
重新获取完整的 /api/data。cdp 摄取路径默认每 25 个事件
将其内存跟踪器刷新到数据库,因此
从浏览器请求到仪表板更新的挂钟延迟通常 < 10 秒。
.burp 项目文件。 使用 Save items 生成
该工具消费的 XML。alg=none 和密钥混淆攻击
不在范围内。请使用专用的 JWT 审计器进行这些操作。unknown,默认隐藏,除非在(仅 Burp)较旧标志上
设置了 --include-unknown。--enrich 会发出站 HTTP 请求 到
https://entrascopes.com/。如果您的环境不允许,请跳过该标志。| 症状 | 可能原因 | 修复 |
|---|---|---|
error: could not parse <file> as XML | 尝试摄取二进制 .burp 项目文件 | 在 Burp 中:Proxy → HTTP history → 选择项目 → 右键 → Save items |
error: no <item> elements found | XML 不是由 Burp 的 Save items 生成的 | 从 Burp 重新导出;根元素应为 <items> |
error: cannot append to DB with schema_version 1 | 数据库由较早的构建创建 | 删除数据库并重新摄取原始源;模式迁移有意不自动进行 |
error: the 'mitm' source needs the mitmproxy Python package | 未安装 mitmproxy | pip install mitmproxy |
error: cannot reach Chrome at 127.0.0.1:9222 | Chrome 未使用 --remote-debugging-port 启动 | 参见 cdp 子命令 中的启动咒语 |
| CDP 附加但无事件流动 | 页面尚未发出任何网络请求,或所有活动都在 OOPIF / worker 中(未自动附加) | 重新加载页面;确认标签页已注册(在 stderr 上查找 tab attached: … 日志行) |
no browser-level webSocketDebuggerUrl at /json/version | Chrome 版本对于浏览器级 CDP 太旧,或返回了错误的形状 | 更新 Chrome,或传递 --target <id> 以使用旧版单标签页附加 |
target … has no webSocketDebuggerUrl | 另一个调试器(例如 DevTools 窗口)已附加 | 关闭 DevTools,或附加到不同的目标 |
仪表板显示 Failed to load /api/data | 服务器无法读取数据库文件 | 检查数据库路径是否正确、文件可读且模式版本匹配 |
| 实时更新停止到达 | cdp 进程已退出或网络缓冲区刷新尚未触发 | 检查 cdp 终端是否有错误;减小 --flush-every 以获得更快的更新 |
两个夹具构建器位于 examples/:```bash
python examples/make_fixture.py examples/fixture.xml tats ingest examples/fixture.xml -o tokens.db --enrich
python examples/make_mitm_fixture.py examples/fixture.mitm tats mitm examples/fixture.mitm -o tokens.db --enrich --append
两次运行后,`tokens.db` 包含 15 个令牌(11 个来自 Burp + 4 个来自
mitmproxy)、23 个事件(包括一个 WebSocket 帧事件)以及 3
次交换。
### 测试套件```bash
pip install .[test]
pytest
该测试套件涵盖令牌提取、JWT 解析、Microsoft 会话 Cookie 分类、FOCI / BroCI 检测、声明摘要、PII 脱敏、带追加模式 UPSERT 语义的 Burp XML 摄取路径,以及 mitmproxy WebSocket 帧摄取路径(当可选的 mitmproxy 依赖缺失时自动跳过)。```text
$ pytest tests/
============================= test session starts =============================
…
======================== 62 passed in 1.4s =================================
### 在前台运行服务器```bash
tats serve tokens.db --no-browser
…并手动打开 http://127.0.0.1:8765。服务器会将每个请求以及任何处理程序错误记录到 stderr。
| 路径 | 用途 |
|---|---|
tats/__init__.py | 整个工具——解析器、数据库层、HTTP 服务器、CDP 客户端;从 tats/static/ 加载仪表板 |
tats/__main__.py | python -m tats 的入口点;与已安装的 tats 控制台脚本逻辑相同 |
tats/static/index.html | 带有 {{CSS}} / {{JS}} 占位符的仪表板 HTML 骨架 |
tats/static/style.css | 仪表板样式——使用你常用的 CSS 工具进行编辑 |
tats/static/app.js | 仪表板逻辑——使用你常用的 JS 工具(LSP / lint / formatter)进行编辑 |
pyproject.toml | 打包元数据、可选附加项([mitm]、[test]、[all])、控制台入口点 |
LICENSE | GNU 通用公共许可证 v3 |
README.md | 本文件 |
examples/ | 合成捕获数据 + 夹具构建脚本(参见 examples/README.md) |
examples/make_fixture.py | 合成 Burp XML 生成器 |
examples/make_mitm_fixture.py | 合成 mitmproxy 流文件生成器 |
examples/fixture.xml | 预构建的 Burp XML 夹具 |
examples/fixture.mitm | 预构建的 mitmproxy 流夹具 |
tests/ | pytest 测试套件(使用 pytest 运行) |
单文件布局是有意为之:该工具旨在让任何安装了 Python 的人都能阅读、审计,并将其直接用于调查中。没有隐藏的设置,没有需要评估的依赖树,除了文件本身之外没有任何其他表面。
如果你更改了子命令、模式、仪表板卡片或公共 API 表面(CLI 标志、/api/* 端点),请在同一次更改中更新本文件的相关章节。最可能发生偏移的章节:
GNU 通用公共许可证 v3.0 或更高版本 — 完整文本见仓库根目录下的 LICENSE 文件。脚本源代码带有指向同一许可证的标准简短头部。
你可以根据 GPL v3(或你选择的任何更高版本)的条款重新分发和/或修改本工具。本工具在没有任何担保的情况下分发;完整条款请参见 LICENSE。
/api/export?fps=... 在一个 JSON 包中返回最多 200 个令牌(raw、claims、events、exchanges),供下游工具使用。启用此项会将数据库变成一份完整的凭据——重放任何捕获会话所需的每个字节都在其中。可与 --redact-claims 结合使用以清理解码后的 JWT 视图,但请注意原始令牌内部仍携带未脱敏的声明编码。当该标志关闭时,仪表板的命令预览块仍会渲染,只是使用 <TOKEN> 作为占位符,因此可作为语法参考;导出按钮会渲染一个提示,要求重新摄取。