KingOfTheNOPs/TailscaleHound
GitHub: KingOfTheNOPs/TailscaleHound
面向 Tailscale 网络的 BloodHound 数据收集器,将身份、设备和访问控制关系转化为可视化攻击路径图。
Stars: 43 | Forks: 2
# TailscaleHound
TailscaleHound 是一个针对 Tailscale 的 BloodHound OpenGraph 收集器。它会收集 tailnet 用户、设备、组、标签、ACL、授权(grants)、SSH 规则、路由、app connector、服务、邀请、webhook 以及相关的控制平面元数据,然后生成一个与 BloodHound 兼容的 OpenGraph JSON 文件。
其目标是将 Tailscale 的访问关系以图表路径的形式直观呈现出来:
```
MATCH p=(u:TS_User)-[:TS_IsMemberOf]->(s)-[:TS_AclSource|TS_GrantSource]->(r)-[:TS_AclTargetsDevice|TS_GrantTargetsDevice]->(d:TS_Device)
RETURN p
```
## 特性
- 通过 Tailscale API 进行远程收集。
- 从 `tailscale status --json` 的输出中进行本地收集。
- 通过 `TS_AZUserSyncedToUser` 进行 Azure 混合攻击路径映射。
## 当前覆盖范围
TailscaleHound 目前定义了 39 种节点类型和 64 种关系类型。
主要节点类型包括:
| 领域 | 节点类型 |
| --- | --- |
| Tailnet | `TS_Network`, `TS_IDP`, `TS_ExternalTailnet` |
| 身份标识 | `TS_User`, `TS_ExternalUser`, `TS_Group`, `TS_AutoGroup`, `TS_Tag`, `TS_ExternalTag`, `TS_Wildcard` |
| 设备 | `TS_Device`, `TS_ExternalDevice`, `TS_Route`, `TS_Cidr`, `TS_HostAlias` |
| 策略 | `TS_ACL`, `TS_Grant`, `TS_SSHRule`, `TS_ACLTest`, `TS_SSHTest`, `TS_PortSpec` |
| 状态 | `TS_Posture`, `TS_DefaultSrcPosture`, `TS_NodeAttr`, `TS_Attr` |
| Tailnet 对象 | `TS_APIKey`, `TS_AuthKey`, `TS_ClientKey`, `TS_FederatedKey`, `TS_UnknownKey`, `TS_Service`, `TS_AppConnector`, `TS_Webhook`, `TS_UserInvite`, `TS_DeviceInvite` |
主要关系类别包括:
| 领域 | 关系示例 |
| --- | --- |
| 身份与角色 | `TS_IsMemberOf`, `TS_IsOwnerOf`, `TS_IsAdminOf`, `TS_IsNetworkAdminOf`, `TS_IsITAdminOf` |
| 设备 | `TS_RegisteredDevice`, `TS_HasTag`, `TS_EnabledRoute`, `TS_IsExitNode` |
| ACL 与授权 | `TS_AclSource`, `TS_AclTargetsDevice`, `TS_GrantSource`, `TS_GrantTargetsRoute`, `TS_RequiresPosture` |
| SSH | `TS_SSHRuleSource`, `TS_SSHRuleTargetsDevice`, `TS_SSHRuleTargetsSelf`, `TS_SSHRuleAllowsUser` |
| Funnel 与服务 | `TS_HasFunnelCapabilities`, `TS_HasFunnelEnabled`, `TS_HasService`, `TS_ServiceRunsOn`, `TS_ServiceHasTag` |
| 混合身份标识 | `TS_AZUserSyncedToUser` |
## 安装
```
git clone https://github.com/KingOfTheNOPs/TailscaleHound.git
cd TailscaleHound
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
```
你可以通过根启动器运行该收集器:
```
python3 TailscaleHound.py --help
```
或者在本地安装该包,以使用 `tailscalehound` 控制台入口点:
```
pip3 install -e .
tailscalehound --help
```
## 认证
### Tailscale OAuth Client
同样支持使用 OAuth client 凭据:
```
python3 TailscaleHound.py \
--ts-client-id "$TAILSCALE_CLIENT_ID" \
--ts-oauth-secret "$TAILSCALE_OAUTH_SECRET" \
--output ./tailscalehound-output
```
要生成 OAuth token,请以 Owner、Admin、IT Admin 或 Network Admin 的身份登录 [Tailscale](https://login.tailscale.com/)。依次前往 settings -> Trust Credentials -> + Credential...

授予该密钥对所有资源的只读权限

### Tailscale API Key
当你希望远程收集器直接从 Tailscale API 拉取数据时,请使用 Tailscale API key:
```
python3 TailscaleHound.py \
--ts-api-key "$TAILSCALE_API_KEY" \
--output ./tailscalehound-output
```
我不推荐使用此选项,但如果你需要 [Tailscale API Key](https://tailscale.com/docs/reference/tailscale-api),请以 Owner、Admin、IT Admin 或 Network Admin 的身份登录 [Tailscale](https://login.tailscale.com/)。依次前往 settings -> Keys -> Generate access tokens...
### 本地 Tailscale Status
本地收集从 Tailscale client 的状态 JSON 开始。这对于快速查看设备/会话状态非常有用。当无法使用 API 访问时,你也可以提供导出的 Tailscale Access Policy 文件,以添加与远程收集相同的 ACL、授权、SSH、组、标签、状态以及 app connector 图表扩充信息。
```
tailscale status --json > tailscale-status.json
python3 TailscaleHound.py \
--status-file tailscale-status.json \
--access-policy-file access-policy.json \
--output ./tailscalehound-output
```
### 可选的 Admin-Panel 扩充
该收集器使用的公共 API 路径无法获取某些有用的字段。如果你提供了 `tailcontrol` cookie,TailscaleHound 将尝试使用 admin-panel 的机器、用户、密钥、身份提供者、计费和设置数据来扩充图表。
因此,我建议创建/授予一个具有 Auditor 角色的用户,以便在运行此工具时能够拥有对网络的完全可见性。要向用户授予此角色,请使用 Owner、Admin 或 IT Admin 账户登录并转到 [Users](https://login.tailscale.com/admin/users) 面板,点击用户旁边的 `...` 并选择 `Edit Role`。为他们授予 Auditor 角色,使其能够以只读方式访问管理控制台。

要获取 tailcontrol cookie,请打开浏览器并通过按 F-12 启动 DevTool 控制台中的“网络”(Network)标签页。登录 [Tailscale](https://login.tailscale.com) 并查找任何对 `/admin/api` endpoint 的网络调用,例如 `self`、`tailnets` 等。

选择其中一个调用(例如 `machines`),并在 Headers 标签页下的 Cookie 部分获取你的 `tailcontrol` cookie。

使用 tailcontrol cookie 和 OAuth 凭据来枚举 Tailscale 环境:
```
python3 TailscaleHound.py \
--ts-client-id "$TAILSCALE_CLIENT_ID" \
--ts-oauth-secret "$TAILSCALE_OAUTH_SECRET"\
--tailcontrol "$TAILCONTROL_COOKIE" \
--output ./tailscalehound-output
```
请将此 cookie 视为凭据。它非常敏感,不应被提交到代码库、粘贴到日志中或与他人共享。
除了收集器使用的公共 API 响应之外,admin-panel 扩充目前还会添加或填充以下字段:
| 领域 | 附加字段 |
| --- | --- |
| 用户 | `UserID`, `StableID`, `IsAdmin`, `IsOwner`, `OrgTailnetID`, `DomainName`, `SharedDomain`, `CanEditBilling`, `NeedsOnboarding`, `UseBusinessPricing`, `NoLongerProvisioned` |
| 设备 | `StableID`, `FQDN`, `MachineName`, `OSVersion`, `ParsedOSVersion`, `IPNVersion`, `Creator`, `Domain`, `AvailableUpdateVersion`, `AutomaticNameMode`, `AutoUpdatesEnabled`, `CanNat`, `Endpoints`, `ExtraIPs`, `AllowedTags`, `InvalidTags`, `AdvertisedIPs`, `AcceptedShareCount`, `ShareID`, `HasExitNode`, `AdvertisedExitNode`, `AllowedExitNode`, `HasSubnets`, `SSHUsernames`, `OtherSSHUsernamesAllowed`, `FunnelEnabled`, `NeverExpires` |
| 密钥 | `Creator`, `Invalid`, `AuthKey`, `ApiKey`, `OAuthClient`, OAuth `Scopes` |
| Tailnet 设置 | 管理员设置(例如身份提供者元数据),以及 `StripeSubscription` 和 `StripeBillingUsage` |
## BloodHound 设置
### 1. 上传 OpenGraph Schema
通过 OpenGraph Extension Management 将 `schema.json` 上传到 BloodHound,或者使用辅助脚本:
```
python3 helper-scripts/upload_schema.py \
--url https://bloodhound.example.com \
--username admin \
--secret "$BLOODHOUND_SECRET"
```
该 schema 使用:
- 命名空间:`TS`
- Environment 类型:`TS_Network`
- 常用查询入口:`MATCH (n:TS_User) RETURN n`
### 2. 上传自定义节点类型
可选的 `custom_types.json` 文件用于配置 TailscaleHound 节点类型的显示图标和颜色。
```
python3 helper-scripts/upload_custom_icons.py \
--url https://bloodhound.example.com \
--username admin \
--secret "$BLOODHOUND_SECRET"
```
### 3. 上传保存的查询
TailscaleHound 在 `SavedQueries/` 目录下提供了内置的保存查询。
```
python3 helper-scripts/upload_saved_queries.py \
--url https://bloodhound.example.com \
--username admin \
--secret "$BLOODHOUND_SECRET"
```
### 4. 上传收集器输出
收集器需要指定 `--output`,并在需要时创建该目录,将生成的文件写入其中。
远程收集输出:
```
标签:BloodHound, Tailscale, Web报告查看器, 攻击路径分析, 数据泄露, 网络安全, 逆向工具, 隐私保护