内容
# DIEGO - 域内 elusive 守护者 & 进攻侦察
**主动目录安全诊断工具,为防御者提供帮助** — 一种非特权、只读审计代理,用于**授权评估和防御基线**,使用纯 Rust 编写。(不是利用框架 — 请参见 [威胁模型](docs/THREAT_MODEL.md)。)
---
**DIEGO** 帮助防御者和授权评估者从标准域用户上下文中识别高风险的主动目录配置。它执行只读 LDAP/Kerberos 诊断,生成结构化证据(JSON / Markdown / HTML / MCP),并支持基线比较 — **无需目录写入和 OS 命令执行**。它作为单个静态二进制文件发布,无需嘈杂的网络伪影。(不是利用框架 — 请参见 [威胁模型](docs/THREAT_MODEL.md)。)
### 示例 HTML 报告
[](docs/sample-report.html)
单个自包含的 HTML 文件(无需 CDN,可在断网环境中使用),包含严重性摘要、攻击路径概览、可排序/可筛选的发现表格,带有**严重性 × 置信度**,基线差异和审计风格附录。 **[▶ 在线演示](https://kent-tokyo.github.io/diego/sample-report.html)** · [示例 JSON](docs/sample-findings.json)
## 架构
```mermaid
flowchart LR
subgraph DC["主动目录"]
LDAP["LDAP :389<br/>(只读)"]
KRB["Kerberos :88"]
NET["广播流量<br/>(LLMNR / NBT-NS)"]
end
LDAP --> COL
KRB --> COL
NET --> COL
COL["收集器<br/>ldap · kerberos · 被动模块"] --> AN
AN["分析器<br/>严重性 + 置信度<br/>(可选的 Claude AI 叙述)"] --> FIND
FIND["发现<br/>(报告)"] --> OUT["输出<br/>HTML · JSON · Markdown · MCP"]
```
标准用户凭证输入,优先发现输出 — 无写入,无 OS 命令执行。
---
## 关键支柱
- **无特权** — 仅使用标准域用户凭证。任何阶段都不需要管理员权限。
- **隐身(OPSEC 友好)** — 仅发出合法的 AD 查询。无侵略性扫描。可配置的请求间隔与正常域流量混合。
- **便携** — 单个静态二进制文件,无运行时依赖。直接复制并在任何目标主机上运行。
- **纯 Rust** — 无 .NET CLR,无 PowerShell,无 Python 解释器。每个协议交互 — Kerberos ASN.1 帧、LDAP、RC4-HMAC — 均在纯 Rust 中实现(RustCrypto)。这避免了 **基于主机** 的 ETW / AMSI / 脚本块日志记录,EDR 产品主要依赖这些来检测 .NET/PowerShell 工具。有关这不规避的内容,请参见 [检测考虑](#detection-considerations)。
- **AI 优先** — Claude API 集成将扫描输出综合成连贯的攻击叙述。MCP 服务器模式允许 LLM 客户端直接编排各个诊断工具。
---
## 快速入门
```bash
# CLI 模式 — 运行所有诊断模块
# 可以省略密码;diego 将尝试:环境变量 → keytab → TGT 缓存 → 交互式提示
diego --dc 10.0.0.1 --domain corp.local --username jdoe
# 显式密码(安全性最低;使用环境变量避免 shell 历史记录)
diego --dc 10.0.0.1 --domain corp.local --username jdoe --password P@ss
# AI 分析(需要 ANTHROPIC_API_KEY)
diego --dc 10.0.0.1 --domain corp.local --username jdoe --ai-analyze
# 扫描后交互式 AI 聊天
diego ... --ai-analyze --chat
# MCP 服务器模式(适用于 Claude Desktop / MCP 客户端)
diego --mcp
```
### 密码解析(优先级顺序)
当未提供密码时,使用 `--password` 时,diego 按以下顺序尝试这些方法:
1. **`$DIEGO_PASSWORD` 环境变量** — 脚本最优选的 OPSEC
```bash
export DIEGO_PASSWORD="P@ssw0rd"
diego --dc 10.0.0.1 --domain corp.local --username jdoe
```
2. **Kerberos keytab** — `~/.diego/keytab`(无需密码)
```bash
# 设置 keytab(需要 kinit 或 ktutil)
ktutil: addent -password -p user@CORP.LOCAL -k 1 -e aes256-cts-hmac-sha1-96
ktutil: write_kt ~/.diego/keytab
# 然后运行,无需密码
diego --dc 10.0.0.1 --domain corp.local --username jdoe
```
3. **Kerberos TGT 缓存** — `KRB5CCNAME` 环境变量或 `/tmp/krb5cc_*`(无需密码)
```bash
# 如果已经登录到 Kerberos 领域:
klist # 检查缓存票券
diego --dc 10.0.0.1 --domain corp.local --username jdoe
```
4. **交互式提示** — 以上均不可用时的备用方案
```
$ diego --dc 10.0.0.1 --domain corp.local --username jdoe
Password: █████████
```
---
## CLI 用法和示例
### 语法
```bash
diego [OPTIONS]
```
### CLI 模式所需选项
| 选项 | 描述 | 示例 |
|--------|-------------|---------|
| `--dc <DC>` | 域控制器 IP 地址 | `--dc 10.0.0.1` |
| `--domain <DOMAIN>` | 域名 | `--domain corp.local` |
| `--username <USERNAME>` | 身份验证的域用户 | `--username jdoe` |
| `--password <PASSWORD>` | 密码(或 `DIEGO_PASSWORD` 环境变量) | `--password 'P@ssw0rd'` |
### 可选参数
| 选项 | 默认值 | 描述 |
|--------|---------|-------------|
| `--modules <MODULES>` | `all` | 特定模块:`kerberos`、`ldap`、`passive` 或 `all` |
| `--output <OUTPUT>` | `stdout` | 输出文件路径 |
| `--format <FORMAT>` | `json` | 输出格式:`json`、`markdown` 或 `html` |
| `--baseline <PATH>` | — | 要与之差异的先前 diego JSON 报告(显示新的 / 已解决的 / 严重性更改的发现) |
| `--timeout <TIMEOUT>` | `10` | 每查询超时(秒) |
| `--interface <INTERFACE>` | 自动检测 | 被动监听的网络接口 |
| `--ai-model <AI_MODEL>` | `claude-sonnet-4-6` | 分析的 Claude 模型 |
### 示例
#### 1. 完整扫描(所有模块)
运行所有诊断模块并输出 JSON 发现结果:
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--format json --output findings.json
```
**示例输出(JSON):**
```json
{
"domain": "corp.local",
"dc_ip": "10.0.0.1",
"timestamp": "2025-06-14T10:30:45Z",
"modules_run": ["ldap", "kerberos", "passive"],
"findings": [
{
"id": "LDAP-ASREP-candidate-001",
"severity": "Critical",
"title": "检测到 AS-REP 可烘焙账户",
"description": "账户 'svc_backup' 禁用了 Kerberos 预认证",
"affected_object": "svc_backup",
"object_type": "user",
"mitre_tactic": "T1558.001",
"mitre_technique": "窃取或伪造 Kerberos 票券 / AS-REP 烘焙",
"remediation": "启用账户的 Kerberos 预认证"
},
{
"id": "KRB-ASREP-HASH-svc_backup",
"severity": "Critical",
"title": "捕获 AS-REP 哈希值",
"description": "捕获了用于离线破解的 Kerberos AS-REP 哈希值",
"affected_object": "svc_backup",
"object_type": "hash",
"hash_value": "$krb5asrep$23$svc_backup@CORP.LOCAL:...",
"mitre_tactic": "T1558.001"
},
{
"id": "LDAP-UNCONSTRAINED-admin-host-01",
"severity": "High",
"title": "检测到无约束委派",
"description": "计算机账户 'admin-host-01' 启用了无约束委派",
"affected_object": "admin-host-01",
"object_type": "computer",
"mitre_tactic": "T1187"
}
],
"summary": {
"total_findings": 3,
"critical": 2,
"high": 1,
"medium": 0,
"low": 0
}
}
```
#### 2. 仅 Kerberos 扫描
针对特定攻击(AS-REP Roasting + Kerberoasting):
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--modules kerberos \
--output kerb_hashes.json
```
生成 Hashcat 兼容的哈希值( `$krb5asrep$` 、 `$krb5tgs$` )用于离线破解。
#### 3. 仅 LDAP 枚举
映射 AD 拓扑并提取策略信息:
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--modules ldap \
--format markdown --output domain_report.md
```
**发现内容包括:**
- 域控制器和站点拓扑
- 密码策略(锁定阈值、年龄、复杂度)
- 无约束委派账户
- SPN 和服务账户
- 高特权组成员
- 描述字段凭证泄漏
#### 4. 被动监控(LLMNR/NBT-NS)
捕获基于广播的 DNS 请求以识别欺骗目标:
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--modules passive \
--interface eth0 \
--timeout 30
```
检测:
- 未解析的主机名查询(LLMNR/NBT-NS)
- 明文协议使用(HTTP 认证、FTP、SMTP、Telnet 凭证)
- 易受响应者攻击的主机
#### 5. AI 驱动的攻击叙述
分析和综合攻击路径:
```bash
export ANTHROPIC_API_KEY="sk-ant-..."
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--ai-analyze \
--format markdown --output attack_narrative.md
```
**AI 输出示例:**
```
## 攻击叙述:CORP.LOCAL
### 执行摘要
该域有 3 个关键配置错误,使得可以快速提升权限至域管理员。
### 攻击链
1. **初始访问** — AS-REP 烘焙 'svc_backup' 账户(禁用预认证)
2. **权限提升** — Kerberoasting 'ms-sql-svc' (弱密码)
3. **横向移动** — 使用烘焙的票券 + 'admin-host-01' 上的无约束委派
4. **域破坏** — 通过 DCSync 盗取 KRBTGT 密钥
### 5 大整改措施(按影响程度排序)
1. 启用 Kerberos 预认证(阻止 AS-REP)
2. 轮换服务账户密码并强制实施复杂度
3. 禁用无约束委派;改为使用约束委派
...
```
#### 6. 交互式 AI 聊天
交互式探索发现结果:
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--chat
```
然后询问 Claude:
```
> 最关键的风险是什么?
> 能详细解释一下 Kerberoasting 攻击吗?
> 提升权限至域管理员的最快捷路径是什么?
> EDR 如何检测这些技术?
```
#### 7. Markdown 报告(适合人类阅读)
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--format markdown --output findings.md
```
输出结构化的 markdown,包含:
- 执行摘要
- 按严重性分组的发现结果
- MITRE ATT&CK 交叉引用
- 每个发现结果的整改步骤
- 网络抖动 / OPSEC 注意事项
#### 7b. HTML 报告(单个自包含文件)
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--format html --output report.html
```
生成一个自包含的 `report.html` (内联 CSS/JS,无 CDN — 离线可用),包含严重性摘要卡片、攻击路径概览和可排序/可筛选的发现结果表格。所有从 AD 获取的字符串均进行 HTML 转义,因此攻击者控制的值(例如描述字段)呈现为惰性。
#### 7c. 基线差异(跟踪扫描间的变化)
```bash
# 首次扫描 → 保存 JSON 基线
diego ... --format json --output baseline.json
# 后续扫描 → 与基线进行差异比较
diego ... --format html --baseline baseline.json --output report.html
```
报告中新增了一个 **基线差异** 部分: 🆕 新增、 ✅ 已解决和 ⚠️ 严重性变更的发现结果,以及未变更的计数。与 `json` 、 `markdown` 和 `html` 输出一起工作。
#### 8. MCP 服务器模式(LLM 集成)
作为 MCP 服务器运行,用于 Claude Desktop 或自定义 LLM 代理:
```bash
diego --mcp
```
然后在 Claude 中,使用以下工具:
- `enumerate_asrep_candidates` — 列出预认证禁用的账户
- `run_asrep_roasting` — 执行 AS-REP 烘焙
- `run_kerberoasting` — 执行 Kerberoasting 攻击
- `check_password_policy` — 检索域密码策略
- `enumerate_privileged_groups` — 列出高特权组成员
#### 9. 自定义超时和抖动
```bash
diego --dc 10.0.0.1 --domain corp.local \
--username jdoe --password 'P@ssw0rd' \
--timeout 20 \
--modules ldap
```
超时应用于单个 LDAP 查询。内部抖动(100–500ms)添加到请求间隔,以与正常流量混合。
#### 10. 环境变量密码
```bash
export DIEGO_PASSWORD="MyP@ssw0rd"
export DIEGO_USERNAME="jdoe"
diego --dc 10.0.0.1 --domain corp.local
```
(避免在命令行上传递凭证 — 更适合 OPSEC)
---
## 诊断模块
### Kerberos — `Asn1Kerberos`
直接与 KDC 在 88 端口上交互,使用原始 ASN.1/Kerberos 帧。
- **AS-REP Roasting** — 确定禁用了 Kerberos 预认证的账户并捕获 AS-REP 哈希值
- **Kerberoasting** — 请求所有具有 SPN 的账户的 TGS 票券
- 所有哈希均以 Hashcat 兼容的格式发出( `$krb5asrep$` 、 `$krb5tgs$` )
### LDAP — `LdapQuery`
对域控制器执行只读 LDAP 查询。
- AD 拓扑结构枚举(域、森林、站点、信任)
- 描述字段凭证泄漏检测
- 无约束委派发现
- 密码策略提取(锁定阈值、最小长度、复杂度)
### 被动 — `PassiveListen`
在不发送任何数据包的情况下监控本地网络流量。
- LLMNR / NBT-NS 广播检测 → 识别易受名称伪造攻击的主机
- 明文协议监控(LDAP、HTTP、FTP、Telnet)
### AI 分析
需要 `ANTHROPIC_API_KEY`。
- 基于原始扫描结果的 Claude 攻击叙述
- 关键路径至域管理员合成
- 优先排序的整改建议
- 交互聊天模式用于后续调查
---
## MCP 服务器模式
当使用 `diego --mcp` 启动时,二进制文件会公开一个 Model Context Protocol 服务器。MCP 兼容的客户端(Claude Desktop、自定义 LLM 代理)可以直接调用个别诊断工具。
| 工具 | 描述 |
|------|-------------|
| `enumerate_asrep_candidates` | 列出预认证禁用的账户 |
| `enumerate_spn_accounts` | 列出具有注册 SPN 的账户 |
| `enumerate_constrained_delegation` | 查找具有 S4U2Self→S4U2Proxy 委派的账户/计算机 |
| `enumerate_rbcd` | 查找具有基于资源的约束委派的对象 |
| `enumerate_privileged_groups` | 列出高特权组成员 |
| `enumerate_stale_service_passwords` | 查找 SPN 账户密码 >365 天旧 |
| `check_unconstrained_delegation` | 查找具有无约束委派的计算机/账户 |
| `check_password_policy` | 检索域密码和锁定策略 + 喷洒估计 |
| `scan_description_leaks` | 搜索 AD 描述中的嵌入凭证 |
| `run_asrep_roasting` | 捕获 AS-REP 哈希值以离线破解 |
| `run_kerberoasting` | 捕获 TGS 哈希值以离线破解 |
| `listen_llmnr` | 被动 LLMNR/NBT-NS 广播监控 |
| `full_scan` | 运行所有模块并返回合并的 JSON 报告 |
---
## 与类似工具的比较
| 功能 | **diego** | BloodHound / SharpHound | Impacket (GetUserSPNs 等) | PowerView | Rubeus | PingCastle |
|---------|-----------|-------------------------|-----------------------------|-----------|--------|------------|
| 语言/运行时 | Rust — 单个静态二进制文件 | C# (.NET) + Python | Python 3 | PowerShell | C# (.NET) | C# (.NET) |
| **纯 Rust / 无 C 运行时** | **是** | 否 (.NET CLR) | 否 (CPython) | 否 (PS 运行时) | 否 (.NET CLR) | 否 (.NET CLR) |
| 所需权限 | **仅标准用户** | 端点本地管理员 | 域用户(某些操作需要管理员) | 域用户 | 域用户 | 推荐域管理员 |
| 基于主机的运行时遥测(ETW/AMSI/SBL) | **避免** — 无 .NET/PS/Python | 高 — .NET 反射,AMSI | 中等 | 高 — AMSI / 脚本块日志记录 | 高 — .NET,已知签名 | 中等 |
| 直流侧行为检测(例如 MDI) | **仍然适用** †| 适用 | 适用 | 适用 | 适用 | 适用 |
| 主动扫描/噪音 | **否** — 仅只读 LDAP + Kerberos | 是 — SMB、RPC、大规模 LDAP 转储 | 中等 | 中等 | 是 | 是 — 广泛的 LDAP/RPC |
| 抖动/OPSEC 节流 | **是** | 否 | 否 | 否 | 否 | 否 |
| AS-REP Roasting | **是** | 否(仅数据) | 是 (`GetNPUsers.py`) | 否 | **是** | 否 |
| Kerberoasting | **是** | 否(仅数据) | 是 (`GetUserSPNs.py`) | 否 | **是** | 否 |
| 无约束委派 | **是** | **是** | 部分 | **是** | 否 | **是** |
| 密码策略 | **是** | 否 | 否 | **是** | 否 | **是** |
| 描述凭证泄漏 | **是** | 否 | 否 | 部分 | 否 | 否 |
| LLMNR/NBT-NS 检测 | **是** | 否 | 否 | 否 | 否 | 否 |
| 明文协议检测 | **是** | 否 | 否 | 否 | 否 | 否 |
| 跨平台(Linux) | **是** | 否 | **是** | 否 | 否 | 否 |
| AI 分析(Claude API) | **是** | 否 | 否 | 否 | 否 | 否 |
| MCP 服务器模式 | **是** | 否 | 否 | 否 | 否 | 否 |
| 结构化 JSON 输出 | **是** | **是** (Neo4j) | 部分 | 否 | 部分 | 否 (HTML) |
| 零安装/直接运行 | **是** | 否 | 否 | 否 | 否 | 否 |
### 概要
- **BloodHound** 是攻击路径可视化的金标准,但需要本地管理员权限来进行 SharpHound 收集,并会产生大量的噪音(SMB、RPC、LDAP 批量转储)。它不像 Roasting 那样执行主动利用。
- **Impacket** 能很好地覆盖 Roasting,但需要在攻击者机器上安装 Python 环境,并且不能在立足点主机上运行。
- **Rubeus** 是最强大的 Kerberos 攻击工具,但仅限于 .NET 和 Windows,并且被 EDR 重度签名。
- **PowerView** 在 LDAP 枚举方面很强大,但 PowerShell 是现代安全运营中心(SOC)中最受审查的执行环境。
- **PingCastle** 的意图与 diego 最接近(域健康检查),但需要提升的权限,只生成 HTML,没有隐身姿态。
- **diego** 填补了空白:一个单独的二进制文件,从 Linux 或 Windows 的标准用户会话中运行,避免基于主机的 EDR 运行时,并直接将发现结果输入 AI 进行叙事合成。
> † **诚实的免责声明。** 避免 .NET/PowerShell/Python 减少了基于主机的运行时遥测,但这并**不**使底层行为不可见。请参阅 [检测考虑](#检测考虑)。
---
## 检测考虑
diego 是 **OPSEC 友好的,不是不可见的**。我们区分两件事,经常被混淆:
1. **基于主机的工具检测。** 由于 diego 是一个纯 Rust 的单个二进制文件,它不会生成 .NET CLR / PowerShell / Python 运行时工件 —— 因此 ETW、AMSI 和 Script Block Logging 信号不会触发 Rubeus/PowerView/Impacket 在立足点主机上的操作。这是一个真正的、可衡量的优势。
2. **DC 端行为检测。** diego 执行的操作 —— LDAP 枚举、Kerberoasting(TGS 请求,特别是 RC4)、AS-REP roasting —— 正是目录侧传感器(如 **Microsoft Defender for Identity (MDI)**)旨在检测的,无论客户端语言如何。特别是,**RC4 (`etype 23`) Kerberoasting 在现代环境中是一个响亮的、签名良好的事件**。
抖动/节流的作用:
- ✅ 平滑*时间和数量*,使请求与正常流量融合。
- ❌ 不会改变单个请求的*行为签名*(例如,RC4 TGS 仍然像 Kerberoasting 一样)。
**底线:** diego 减少了基于主机的 EDR 暴露和请求突发异常。它适用于授权的诊断,并假设防御者仍可能观察到目录侧行为。 将“低主机遥测”和“无法检测”视为不同的声明 —— diego 只实现了前者。
---
## 构建
```bash
cargo build --release
# 静态 Linux 二进制文件(需要 musl 目标)
cargo build --release --target x86_64-unknown-linux-musl
```
发布配置文件应用了 LTO、单代码生成单元和二进制文件剥离,以最小化大小并最大化性能。
---
## OPSEC 注意事项
- 在任何时候都不执行 OS 命令 —— 所有操作都是纯粹的网络协议交互。
- 在 LDAP 和 Kerberos 请求之间应用随机抖动,以避免统一的*时间*签名(注意:抖动不会改变单个请求的*行为签名* —— 请参阅 [检测考虑](#检测考虑))。
- 所有查询在功能上与标准 Windows 域工作站和域管理工具发出的查询相同。
- 不写入目录;所有操作都是严格只读的。
- **不是规避的替代品。** diego 降低了基于主机的 EDR 暴露;目录侧传感器(例如 MDI)仍可以观察到 Kerberoasting/AS-REP 行为。仅在您有权运行 AD 诊断的情况下使用。
---
## 文档
- [威胁模型](docs/THREAT_MODEL.md) —— 目标、非目标、检测假设、支持的环境、限制
- [路线图](ROADMAP.md) —— 0.2.x 稳定化焦点;已暂停/延期项目
- [贡献](CONTRIBUTING.md) · [安全策略](SECURITY.md) · [测试层](docs/TESTING.md)
- [报告 JSON 模式](docs/report.schema.json) —— 集成商的输出契约
- [基准](docs/BENCHMARKS.md) —— 方法论(结果待实验室验证)
- [变更日志](CHANGELOG.md)
- [示例报告(HTML)](docs/sample-report.html) · [示例 JSON](docs/sample-findings.json) · [▶ 现场演示](https://kent-tokyo.github.io/diego/sample-report.html)
---
## 许可证
MIT
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器