kent-tokyo/diego

GitHub: kent-tokyo/diego

一款用纯 Rust 编写的非特权只读 Active Directory 安全诊断工具,帮助防御者通过 LDAP 和 Kerberos 审计识别域内风险配置并生成多格式安全报告。

Stars: 1 | Forks: 0

# DIEGO - 域内网隐形守护者与攻击侦察兵 **面向防御者的 Active Directory 安全诊断工具** —— 这是一个用纯 Rust 编写的、非特权的、只读的审计代理,用于**授权评估和防御性基线建立**。(它不是漏洞利用框架 —— 请参阅[威胁模型](docs/THREAT_MODEL.md))。 **DIEGO** 帮助防御者和授权评估者从标准域用户上下文中识别有风险的 Active Directory 配置。它执行只读的 LDAP/Kerberos 诊断,生成结构化的证据(JSON / Markdown / HTML / MCP),并支持基线比较 —— **不写入目录,不执行 OS 命令**。它以单个静态二进制文件的形式发布,没有嘈杂的网络产物。(它不是漏洞利用框架 —— 请参阅[威胁模型](docs/THREAT_MODEL.md))。 ### HTML 报告示例 [![diego HTML report](https://static.pigsec.cn/wp-content/uploads/repos/cas/78/783a6e186faac84cf9e814e8d93c2ea8f813801712830c5d884160c712d6547a.png)](docs/sample-report.html) 一个单一的自包含 HTML 文件(无 CDN,适用于物理隔离环境),包含严重性摘要、攻击路径概览、带有**严重性 × 置信度**的可排序/过滤的发现结果表、基线差异对比,以及审计风格的附录。**[▶ 在线演示](https://kent-tokyo.github.io/diego/sample-report.html)** · [JSON 示例](docs/sample-findings.json) ## 架构 ``` flowchart LR subgraph DC["Active Directory"] LDAP["LDAP :389
(read-only)"] KRB["Kerberos :88"] NET["Broadcast traffic
(LLMNR / NBT-NS)"] end LDAP --> COL KRB --> COL NET --> COL COL["Collector
ldap · kerberos · passive modules"] --> AN AN["Analyzer
severity + confidence
(optional Claude AI narrative)"] --> FIND FIND["Findings
(Report)"] --> OUT["Output
HTML · JSON · Markdown · MCP"] ``` 输入标准用户凭据,输出已区分优先级的发现结果 —— 没有写操作,没有 OS 命令执行。 ## 核心支柱 - **非特权** —— 仅使用标准域用户凭据运行。任何阶段都不需要管理员权限。 - **隐蔽性(对 OPSEC 友好)** —— 仅发出合法的 AD 查询。没有激进的扫描。请求之间可配置的抖动可与正常的域流量混为一体。 - **便携性** —— 单个静态二进制文件,零运行时依赖。下载并在任何目标主机上运行。 - **纯 Rust** —— 无 .NET CLR,无 PowerShell,无 Python 解释器。每个协议交互 —— Kerberos ASN.1 帧封装、LDAP、RC4-HMAC —— 均以纯 Rust (RustCrypto) 实现。这避免了 EDR 产品最严重依赖的、针对 .NET/PowerShell 工具的*基于主机*的 ETW / AMSI / Script Block Logging 遥测数据。关于这**不能**规避什么,请参阅[检测注意事项](#detection-considerations)。 - **AI 优先** —— Claude API 集成将扫描输出合成为连贯的攻击叙述。MCP 服务器模式允许 LLM 客户端直接调度各个诊断工具。 ## 快速开始 ``` # CLI 模式 — 运行所有诊断模块 # 可以省略 password;diego 将依次尝试:env var → keytab → TGT cache → 交互式提示 diego --dc 10.0.0.1 --domain corp.local --username jdoe # 使用显式 password(安全性最低;改用 env var 以避免 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 server 模式(用于 Claude Desktop / MCP 客户端) diego --mcp ``` ### 密码解析(优先级顺序) 如果未使用 `--password` 提供密码,diego 将按以下顺序尝试这些方法: 1. **`$DIEGO_PASSWORD` 环境变量** —— 对脚本而言 OPSEC 最友好 export DIEGO_PASSWORD="P@ssw0rd" diego --dc 10.0.0.1 --domain corp.local --username jdoe 2. **Kerberos keytab** —— `~/.diego/keytab`(无需密码) # 设置 keytab(需要 kinit 或 ktutil) ktutil: addent -password -p user@CORP.LOCAL -k 1 -e aes256-cts-hmac-sha1-96 ktutil: write_kt ~/.diego/keytab # 然后无需 password 运行 diego --dc 10.0.0.1 --domain corp.local --username jdoe 3. **Kerberos TGT 缓存** —— `KRB5CCNAME` 环境变量或 `/tmp/krb5cc_*`(无需密码) # 如果已登录 Kerberos realm: klist # Check cached ticket 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 用法与示例 ### 语法 ``` diego [OPTIONS] ``` ### 必需选项(适用于 CLI 模式) | 选项 | 描述 | 示例 | |--------|-------------|---------| | `--dc ` | 域控制器 IP 地址 | `--dc 10.0.0.1` | | `--domain ` | 域名 | `--domain corp.local` | | `--username ` | 用于身份验证的域用户 | `--username jdoe` | | `--password ` | 密码(或 `DIEGO_PASSWORD` 环境变量) | `--password 'P@ssw0rd'` | ### 可选参数 | 选项 | 默认值 | 描述 | |--------|---------|-------------| | `--modules ` | `all` | 特定模块:`kerberos`, `ldap`, `passive`, 或 `all` | | `--output ` | `stdout` | 输出文件路径 | | `--format ` | `json` | 输出格式:`json`, `markdown`, 或 `html` | | `--baseline ` | — | 用于对比差异的先前 diego JSON 报告(显示新增 / 已解决 / 严重性变更的发现) | | `--timeout ` | `10` | 每次查询的超时时间(秒) | | `--interface ` | 自动检测 | 用于被动监听的网络接口 | | `--ai-model ` | `claude-sonnet-4-6` | 用于分析的 Claude 模型 | ### 示例 #### 1. 完整扫描(所有模块) 运行所有诊断模块并输出 JSON 发现结果: ``` diego --dc 10.0.0.1 --domain corp.local \ --username jdoe --password 'P@ssw0rd' \ --format json --output findings.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 Roastable Account Detected", "description": "Account 'svc_backup' has Kerberos pre-authentication disabled", "affected_object": "svc_backup", "object_type": "user", "mitre_tactic": "T1558.001", "mitre_technique": "Steal or Forge Kerberos Tickets / AS-REP Roasting", "remediation": "Enable Kerberos pre-authentication on the account" }, { "id": "KRB-ASREP-HASH-svc_backup", "severity": "Critical", "title": "AS-REP Hash Captured", "description": "Kerberos AS-REP hash captured for offline cracking", "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": "Unconstrained Delegation Detected", "description": "Computer account 'admin-host-01' has unconstrained delegation enabled", "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): ``` 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 拓扑并提取策略信息: ``` 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 请求,以识别欺骗目标: ``` 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 凭据) - 易受基于 Responder 攻击的主机 #### 5. AI 驱动的攻击叙述 分析发现结果并综合攻击路径: ``` 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 ### 执行摘要 The domain has 3 critical misconfigurations enabling rapid escalation to Domain Admin. ### 攻击链 1. **Initial Access** — AS-REP roast 'svc_backup' account (pre-auth disabled) 2. **Privilege Escalation** — Kerberoast 'ms-sql-svc' (weak password) 3. **Lateral Movement** — Use roasted ticket + unconstrained delegation on 'admin-host-01' 4. **Domain Compromise** — Steal KRBTGT key via DCSync ### 前 5 项修复措施(按影响排序) 1. Enable Kerberos pre-authentication (blocks AS-REP) 2. Rotate service account passwords and enforce complexity 3. Disable unconstrained delegation; use constrained delegation instead ... ``` #### 6. 交互式 AI 对话 交互式探索发现结果: ``` diego --dc 10.0.0.1 --domain corp.local \ --username jdoe --password 'P@ssw0rd' \ --chat ``` 然后向 Claude 提问: ``` > What are the most critical risks? > Can you explain the Kerberoasting attack in detail? > What's the fastest path to Domain Admin? > How would EDR detect these techniques? ``` #### 7. Markdown 报告(人类可读) ``` 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 报告(单一自包含文件) ``` 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. 基线差异(跟踪扫描间的配置漂移) ``` # 首次扫描 → 保存 JSON baseline diego ... --format json --output baseline.json # 后续扫描 → 与 baseline 进行 diff diego ... --format html --baseline baseline.json --output report.html ``` 报告将增加一个**基线差异**部分:🆕 新增、✅ 已解决和 ⚠️ 严重性变更的发现结果,以及未更改的数量。适用于 `json`、`markdown` 和 `html` 输出。 #### 8. MCP 服务器模式(LLM 集成) 作为 MCP 服务器运行,供 Claude Desktop 或自定义 LLM 代理使用: ``` diego --mcp ``` 然后在 Claude 中,使用如下工具: - `enumerate_asrep_candidates` — 列出禁用预身份验证的账户 - `run_asrep_roasting` — 执行 AS-REP Roasting - `run_kerberoasting` — 执行 Kerberoasting 攻击 - `check_password_policy` — 获取域密码策略 - `enumerate_privileged_groups` — 列出 DA/EA 成员 #### 9. 自定义超时与抖动 ``` diego --dc 10.0.0.1 --domain corp.local \ --username jdoe --password 'P@ssw0rd' \ --timeout 20 \ --modules ldap ``` 超时适用于单个 LDAP 查询。请求之间会添加内部抖动(100–500ms)以与正常流量混合。 #### 10. 用于密码的环境变量 ``` export DIEGO_PASSWORD="MyP@ssw0rd" export DIEGO_USERNAME="jdoe" diego --dc 10.0.0.1 --domain corp.local ``` (避免在命令行中传递凭据 —— 对 OPSEC 更友好) ## 诊断模块 ### Kerberos — `Asn1Kerberos` 使用原始 ASN.1/Kerberos 数据帧直接通过 88 端口与 KDC 交互。 - **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 驱动的攻击叙述 - 通向 Domain Admin 的关键路径综合分析 - 优先推荐的修复建议 - 用于后续调查的交互式对话模式 ## MCP 服务器模式 当使用 `diego --mcp` 启动时,二进制文件会暴露一个 Model Context Protocol 服务器。兼容 MCP 的客户端(Claude Desktop、自定义 LLM 代理)可以直接调用各个诊断工具。 | 工具 | 描述 | |------|-------------| | `enumerate_asrep_candidates` | 列出禁用预身份验证的账户 | | `enumerate_spn_accounts` | 列出注册了 SPN 的账户 | | `enumerate_constrained_delegation` | 查找具有 S4U2Self→S4U2Proxy 委派的账户/计算机 | | `enumerate_rbcd` | 查找具有基于资源的约束委派 (RBCD) 的对象 | | `enumerate_privileged_groups` | 列出高权限组(DA/EA/Backup Ops 等)的成员 | | `enumerate_stale_service_passwords` | 查找密码超过 365 天的 SPN 账户 | | `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 / Script Block Logging | 高 — .NET, 已知特征 | 中 | | DC 端的行为检测(例如 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 枚举方面很强大,但在现代 SOC 中,PowerShell 是审查最严格的执行环境。 - **PingCastle** 在意图上最接近 diego(域健康检查),但它需要提升的特权,仅生成 HTML,并且不具备隐蔽态势。 - **diego** 填补了这一空白:一个可以在 Linux 或 Windows 上从标准用户会话运行的单一二进制文件,避免了基于主机的 EDR 运行时,并将发现结果直接馈送到 AI 中以进行叙述综合。 ## 检测注意事项 diego 是**对 OPSEC 友好的,但并非不可见**。我们将经常被混为一谈的两件事区分开来: 1. **基于主机的工具检测。** 由于 diego 是一个纯 Rust 单一二进制文件,因此它不会生成 .NET CLR / PowerShell / Python 运行时产物 —— 因此捕获跳板机上 Rubeus/PowerView/Impacket 的 ETW、AMSI 和 Script Block Logging 信号不会触发。这是一个真正且可衡量的优势。 2. **DC 端的行为检测。** diego 执行的*操作* —— LDAP 枚举、Kerberoasting(TGS 请求,特别是 RC4)、AS-REP Roasting —— 正是诸如 **Microsoft Defender for Identity (MDI)** 之类的目录端传感器旨在检测的内容,**无论客户端使用什么语言**。特别是,**RC4 (`etype 23`) Kerberoasting 在现代环境中是一个响亮且特征明显的事件**。 抖动/节流能做什么和不能做什么: - ✅ 平滑*时间和数量*,使请求与正常流量混合。 - ❌ **不**改变单个请求的*行为特征*(例如,针对 SPN 账户的 RC4 TGS 看起来仍然像 Kerberoasting)。 **结论:** diego 减少了基于主机的 EDR 暴露和请求突发异常。它适用于授权诊断,并假设防御者仍然可以观察到目录端的行为。请将“低主机遥测”和“不可检测”视为不同的主张 —— diego 仅保证前者。 ## 构建 ``` cargo build --release # 静态 Linux 二进制文件(需要 musl target) cargo build --release --target x86_64-unknown-linux-musl ``` release 配置文件应用了 LTO、单一代码生成单元和二进制剥离,以最小化体积并最大化性能。 ## OPSEC 注意事项 - 任何时候都不执行 OS 命令 —— 所有操作都是纯粹的网络协议交互。 - LDAP 和 Kerberos 请求之间应用了随机抖动,以避免统一的*时序*特征(注意:抖动不会改变单个请求的*行为*特征 —— 请参阅[检测注意事项](#detection-considerations))。 - 所有查询在功能上与标准 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 Schema](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
标签:Active Directory, Checkov, HTTP, Plaso, Rust, 可视化界面, 模拟器, 网络流量审计, 通知系统