Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
TATS — 分析并跟踪来自 Burp、mitmproxy 或 Chrome DevTools 捕获的 OAuth 2.0、OIDC 和 Microsoft Entra ID 令牌。可视化令牌生命周期,检测高风险作用域,并通过交互式仪表板导出令牌以供重放。 | Kitploit
工具/GitHubGitHub/icemoonhsv/tats
Web安全渗透测试身份与访问管理 (IAM)身份验证日志分析
GitHubicemoonhsv/tats

TATS

分析并跟踪来自 Burp、mitmproxy 或 Chrome DevTools 捕获的 OAuth 2.0、OIDC 和 Microsoft Entra ID 令牌。可视化令牌生命周期,检测高风险作用域,并通过交互式仪表板导出令牌以供重放。

查看仓库
712816天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

TATS — Token 分析与追踪系统

跨捕获的网络流量追踪 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 会话时,产生的捕获数据非常庞大,而大多数工具要么:

  • 一次只显示一个令牌(Burp 的 JWT 扩展),或者
  • 不遵循 Microsoft 的 OAuth 方言(FOCI、BroCI、ESTSAUTH Cookie),或者
  • 不追踪 WebSocket 帧,而 Teams / Skype / SignalR 正是在其中发送令牌,或者
  • 不告诉你哪些令牌当前仍然有效。

此工具提取每一个观察到的 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 帧;通过浏览器级自动附加追踪每个现有标签页以及运行期间打开的每个标签页)
  • 一个规范 SQLite 存储,仪表板从中读取。每次摄取过程都可以使用 --append 运行以合并到现有数据库;令牌会被 upsert(使用次数 + 观察到的生命周期累积),事件和交换会被追加,行的 source_tag 记录每个见过该令牌的摄取过程。
  • 实时 Web 仪表板,由 stdlib HTTP 服务器提供。每 5 秒轮询数据库,并在底层数据变化时重新渲染——因此正在运行的 CDP 捕获会近乎实时地更新仪表板。
  • 核心路径无专有依赖。 Burp 摄取、数据库层、Web UI 和 CDP 附加均仅使用 stdlib。mitmproxy 导入是唯一可选依赖(pip install mitmproxy)。
  • 令牌分类与增强

    • OAuth 正文键(access_token、refresh_token、id_token)和 Cookie 名称启发式规则决定令牌类型。
    • Microsoft 会话 Cookie(ESTSAUTH、ESTSAUTHPERSISTENT、ESTSAUTHLIGHT、SignInStateCookie)被明确识别为 refresh 等效令牌(否则它们会被通用的 “auth” Cookie 提示错误分类)。
    • JWT 声明(header + payload)被解码并原样存储——绝不截断。
    • Microsoft FOCI(Family of Client IDs)通过令牌端点响应中的 foci 字段检测。
    • Microsoft BroCI / Nested App Authentication 通过请求正文中的 brk_client_id、brk_redirect_uri 和 brk-<guid>:// 重定向方案检测。
    • 可选的 --enrich 标志从 https://entrascopes.com/ 获取 firstpartyscopes.json 和 resources.json,并将 appid / azp / aud GUID 解析为带可点击链接的友好名称。

    仪表板卡片

    • 摘要磁贴 — 令牌计数、主机、交换(带有 FOCI / BroCI 标注)以及增强状态指示器。
    • 用户 — 按 upn / preferred_username / unique_name / email / name 对令牌分桶,回退到 sub@iss 或 oid,并单独呈现仅应用和未知身份桶。当用户出现在 ≥2 个 source_tag 中时,每个身份行会显示一个 captures 徽章(跨捕获存活,这是 --append 研究的核心信号),外加一个 first_seen → last_seen 时间跨度,以及一个 timeline 按钮,用于在 Sequence-diagram 标签页上高亮该用户的每个令牌。
    • 令牌有效性 — 当前有效与已过期 access token 的计数、refresh-token 过期状态(对于不透明令牌显示 “unknown expiry”),以及一个 top-3 “next to expire” 列表,每 30 秒自动刷新。
    • 客户端 — 交换中出现过的每个不同应用(appid / azp / 表单正文 client_id / brk_client_id / brk_nested_id),带有 FOCI / brokerable / broker / nested 徽章。
    • 受众 — 观察到的每个 aud 声明,尽可能解析为 entrascopes 资源名称。
    • 租户 — 不同的 tid 值,以及令牌 / 用户 / 应用计数。
    • 主机 — 每个主机的事件、不同 bearer 接收方、不同签发者和交换计数。
    • 特权作用域与角色 — 将每个令牌的 scp / scope / roles 与一份精选的高影响 Microsoft Graph 权限和 Azure 资源作用域监视列表进行比对。
    • 受众 / 主机不匹配 — 标记每个 (token, host) 对,其中令牌被用于与其 aud 声明不一致的主机(表明凭据泄露或滥用)。
    • 认证方法(amr)— pwd / mfa / pop / smartcard 分布。
    • 安全功能 — 标记 Continuous Access Evaluation(xms_cc=CP1)、持有证明绑定(cnf 声明,并跨受众检测共享 kid)、step-up 认证要求(acrs)以及 acr 认证上下文级别。每一行都可点击,并将 Tokens 标签页过滤为仅显示携带该标记的令牌。
    • Refresh-token 链 — 遍历交换边以识别轮换谱系、最长链长度和空闲 refresh token。每条链显示一个 Δ scopes 列(跨跳添加 / 移除的作用域,悬停时显示完整的逐跳差异),并标记其中添加的作用域匹配特权作用域监视列表的链,带有 ⚠ priv 徽章——这是 FOCI / BroCI 式权限扩展研究信号。
    • 来源 — 按 source_tag 统计令牌计数,以便查看每次摄取过程产生了多少行。

    Tokens / Exchanges 标签页

    • 点击列标题进行排序。
    • 多选复选框驱动一个工具栏:
      • Highlight in Graph — 对选中节点加黄色强调。
      • Isolate in Graph — 仅重绘显示选中令牌及其交换对象的图。
      • Show in Sequence — 为选中令牌显示聚焦的序列图。
    • 点击一行可展开内联面板,其中包含完整 JWT header + payload(原始 JSON)、所有事件、相关交换、可重放导出按钮(raw / Bearer / curl / JSON / roadtx token cache),以及一个命令预览块,包含 roadtx describe、roadtx auth、curl、Python requests 和 PowerShell Invoke-RestMethod 的可复制粘贴片段。
    • 过滤器: 类型 chips(access / refresh / id / unknown)、格式 chips(jwt / opaque)、used / unused 下拉框、有效性下拉框(any / valid / expired / unknown expiry)、FOCI-only、BroCI-only、has-app-match、has-resource-match,以及跨 fp / sample / claims / host / app / resource / source_tag / user 的自由文本搜索。
    • CSV / JSON 导出当前已过滤 + 排序的行。
    • URL hash 持久化 — 活动标签页和每个过滤器状态都会序列化到 URL hash,因此指向特定过滤视图的链接可共享。

    WebSocket 支持

    • mitmproxy 和 CDP 捕获会保留每个 WebSocket 文本 / 二进制帧负载。帧内容会使用与处理 HTTP 正文相同的 JSON / form / raw-JWT 遍历器扫描令牌。
    • 在帧中找到的令牌会生成事件,角色为 ws-frame-sent / ws-frame-received,来源为 ws[body_json[<key>]],并带有一个 ws_session_id,用于将单个 WebSocket 连接内的所有帧分组。
    • 握手会作为普通 HTTP 事件捕获,因此带入升级过程的 Cookie / bearer 令牌也会被追踪。

    隐私

    • 数据库存储每个观察到的令牌的 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,默认关闭)选择将完整令牌字符串写入数据库,以便仪表板可以提供:

      • Copy raw / Copy Bearer / Copy curl 操作。
      • 下载令牌 JSON(raw + claims + observed events)。
      • 复制 / 下载为 roadtools token cache(将文件放入 .roadtools_auth,任何 roadtx 子命令都会读取它)。
      • 每个令牌的 Command preview 块,使用令牌实际的 tid、appid 和 aud 声明预填最常见的重放调用——roadtx describe、roadtx auth、curl、Python requests、PowerShell Invoke-RestMethod。

    安装

    要求

    • Python 3.10+(使用适合 match 语句的类型语法和现代 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

    root@kitploit:~
    仪表盘的 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

    root@kitploit:~
    如果你只需要 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

    root@kitploit:~
    **从 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

    every sub / oid / upn / email / name / unique_name / preferred_username

    (and a few related claims) is replaced with a stable hash placeholder

    root@kitploit:~
    脱敏是内容稳定的:相同的值映射到相同的占位符,因此仪表板的按用户分组仍然有效,而无需显示用户。
    
    一旦数据开始流入,仪表板的标题会显示 `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

    fresh DB, with Microsoft enrichment

    tats ingest burp.xml -o tokens.db --enrich

    add another Burp export to an existing DB without losing the first one

    tats ingest day2.xml -o tokens.db --append
    --source-tag burp:day2

    root@kitploit:~
    ### `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

    ... drive the browser ...

    Ctrl-C to stop

    tats mitm session.mitm -o tokens.db --enrich

    root@kitploit:~
    ### `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)```bash

    auto-detect Chrome / Edge / Chromium / Brave

    tats cdp -o tokens.db --launch-chrome

    explicit path (useful for non-default installs / sandboxed builds)

    tats cdp -o tokens.db
    --launch-chrome /opt/google/chrome-canary/chrome

    root@kitploit:~
    启动的浏览器使用 `--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

    root@kitploit:~
    …然后传入 `--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

    default — opens a browser tab automatically

    tats serve tokens.db

    bind to a different port without auto-launching the browser

    tats serve tokens.db --port 9000 --no-browser

    (do this only on a trusted network — no auth)

    tats serve tokens.db --host 0.0.0.0

    root@kitploit:~
    > **警告:** 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。

    数据库模式(v4)

    • 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 .burp 项目文件。 使用 Save items 生成 该工具消费的 XML。
    • 无代理 CA 管理。 此工具本身不拦截 TLS。 在 Burp / mitmproxy 下游使用它,或使用 CDP 路径,该路径 从浏览器内部看到 TLS 解密后的流量。
    • CDP 附加覆盖顶层页面目标。 进程外 iframe (OOPIF)和专用 worker 不会递归自动附加,因此 流经这些目标类型的事件可能会被遗漏。对于 此工具所围绕的 Microsoft / OAuth 流程,顶层页面 附加能捕获所有重要内容。
    • 无签名验证(针对 JWT)。该工具解码声明用于 显示;签名检查、alg=none 和密钥混淆攻击 不在范围内。请使用专用的 JWT 审计器进行这些操作。
    • 不透明令牌误报。 “这是令牌吗?”启发式 将 OAuth 形状上下文中任何 20+ 字符的 URL 安全字符串视为 令牌。长随机 ID 可能会被错误标记。无法推断类型的令牌 最终为 unknown,默认隐藏,除非在(仅 Burp)较旧标志上 设置了 --include-unknown。
    • --enrich 会发出站 HTTP 请求 到 https://entrascopes.com/。如果您的环境不允许,请跳过该标志。
    • Web UI 没有身份验证。 将其绑定到 localhost,除非 您在前面放置了另一个认证层。

    故障排除

    症状可能原因修复
    error: could not parse <file> as XML尝试摄取二进制 .burp 项目文件在 Burp 中:Proxy → HTTP history → 选择项目 → 右键 → Save items
    error: no <item> elements foundXML 不是由 Burp 的 Save items 生成的从 Burp 重新导出;根元素应为 <items>
    error: cannot append to DB with schema_version 1数据库由较早的构建创建删除数据库并重新摄取原始源;模式迁移有意不自动进行
    error: the 'mitm' source needs the mitmproxy Python package未安装 mitmproxypip install mitmproxy
    error: cannot reach Chrome at 127.0.0.1:9222Chrome 未使用 --remote-debugging-port 启动参见 cdp 子命令 中的启动咒语
    CDP 附加但无事件流动页面尚未发出任何网络请求,或所有活动都在 OOPIF / worker 中(未自动附加)重新加载页面;确认标签页已注册(在 stderr 上查找 tab attached: … 日志行)
    no browser-level webSocketDebuggerUrl at /json/versionChrome 版本对于浏览器级 CDP 太旧,或返回了错误的形状更新 Chrome,或传递 --target <id> 以使用旧版单标签页附加
    target … has no webSocketDebuggerUrl另一个调试器(例如 DevTools 窗口)已附加关闭 DevTools,或附加到不同的目标
    仪表板显示 Failed to load /api/data服务器无法读取数据库文件检查数据库路径是否正确、文件可读且模式版本匹配
    实时更新停止到达cdp 进程已退出或网络缓冲区刷新尚未触发检查 cdp 终端是否有错误;减小 --flush-every 以获得更快的更新

    开发

    冒烟测试夹具

    两个夹具构建器位于 examples/:```bash

    Burp XML fixture (HTTP-only, includes FOCI + BroCI exchanges)

    python examples/make_fixture.py examples/fixture.xml tats ingest examples/fixture.xml -o tokens.db --enrich

    mitmproxy flow fixture (HTTP + WebSocket frames carrying tokens)

    python examples/make_mitm_fixture.py examples/fixture.mitm tats mitm examples/fixture.mitm -o tokens.db --enrich --append

    root@kitploit:~
    两次运行后,`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 =================================

    root@kitploit:~
    ### 在前台运行服务器```bash
    tats serve tokens.db --no-browser
    

    …并手动打开 http://127.0.0.1:8765。服务器会将每个请求以及任何处理程序错误记录到 stderr。

    文件布局

    路径用途
    tats/__init__.py整个工具——解析器、数据库层、HTTP 服务器、CDP 客户端;从 tats/static/ 加载仪表板
    tats/__main__.pypython -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])、控制台入口点
    LICENSEGNU 通用公共许可证 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 的人都能阅读、审计,并将其直接用于调查中。没有隐藏的设置,没有需要评估的依赖树,除了文件本身之外没有任何其他表面。

    维护本 README

    如果你更改了子命令、模式、仪表板卡片或公共 API 表面(CLI 标志、/api/* 端点),请在同一次更改中更新本文件的相关章节。最可能发生偏移的章节:

    • 功能 — 在添加摄取源或仪表板卡片时
    • 子命令 — 在更改标志时
    • Microsoft 特定支持 — 在检测逻辑发生变化时
    • 架构 — 在模式或实时更新流程发生变化时
    • 故障排除 — 在出现新的错误消息时

    许可证

    GNU 通用公共许可证 v3.0 或更高版本 — 完整文本见仓库根目录下的 LICENSE 文件。脚本源代码带有指向同一许可证的标准简短头部。

    你可以根据 GPL v3(或你选择的任何更高版本)的条款重新分发和/或修改本工具。本工具在没有任何担保的情况下分发;完整条款请参见 LICENSE。

    下载工具
  • /api/export?fps=... 在一个 JSON 包中返回最多 200 个令牌(raw、claims、events、exchanges),供下游工具使用。
  • 启用此项会将数据库变成一份完整的凭据——重放任何捕获会话所需的每个字节都在其中。可与 --redact-claims 结合使用以清理解码后的 JWT 视图,但请注意原始令牌内部仍携带未脱敏的声明编码。当该标志关闭时,仪表板的命令预览块仍会渲染,只是使用 <TOKEN> 作为占位符,因此可作为语法参考;导出按钮会渲染一个提示,要求重新摄取。