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 报告示例
[](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 标签:Active Directory, Checkov, HTTP, Plaso, Rust, 可视化界面, 模拟器, 网络流量审计, 通知系统