跨捕获的网络流量追踪 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。/api/export?fps=... 在一个 JSON 包中返回最多 200 个令牌(raw、claims、events、exchanges),供下游工具使用。启用此项会将数据库变成一份完整的凭据——重放任何捕获会话所需的每个字节都在其中。可与 --redact-claims 结合使用以清理解码后的 JWT 视图,但请注意原始令牌内部仍携带未脱敏的声明编码。当该标志关闭时,仪表板的命令预览块仍会渲染,只是使用 <TOKEN> 作为占位符,因此可作为语法参考;导出按钮会渲染一个提示,要求重新摄取。
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` 以获取规范选项列表。下面的说明解释了*何时*以及*如何*使用每一个子命令。
### 全局标志
这些标志适用于每个子命令,并且位于子命令名称*之前*: