cumakurt/adar
GitHub: cumakurt/adar
一款面向 Active Directory 的授权渗透侦察与攻击工具,覆盖多层次技术与认证方式。
Stars: 10 | Forks: 2
# ADAR — 活动目录攻击与侦察工具
[](https://www.gnu.org/licenses/agpl-3.0)
[](https://www.python.org/downloads/)
## 架构概述
```
adar/
├── core/
│ ├── engine.py # Main orchestration engine (ScanEngine)
│ ├── result_store.py # Async-safe user aggregation & dedup
│ └── noise_controller.py # Adaptive rate limiting & jitter
├── techniques/
│ ├── base.py # Abstract BaseTechnique
│ ├── dns_enum.py # [T1] DNS SRV record queries
│ ├── ldap_enum.py # [T1] LDAP anonymous bind + paged dump
│ ├── kerberos_enum.py # [T1] Kerberos AS-REQ user probing (wordlist or built-in)
│ ├── smb_enum.py # [T1] SMB null session probe
│ ├── samr_enum.py # [T2] MS-SAMR user enumeration
│ ├── rid_cycling.py # [T2] SID+RID brute-force (500-2000)
│ ├── oxid_resolver.py # [T2] OXID ServerAlive2 interface enum
│ ├── ldap_auth_enum.py # [T3] Authenticated LDAP full attribute dump
│ ├── asreproast_enum.py # [T3] AS-REP Roasting — hashcat hash dump
│ ├── kerberoast_enum.py # [T3] Kerberoasting SPN accounts
│ ├── sysvol_enum.py # [T3] SYSVOL/GPO script & Groups.xml parse
│ ├── adcs_enum.py # [T4] ADCS cert template enum + ESC1/2/3/4 vuln detection
│ ├── azure_enum.py # [T4] Azure AD GetCredentialType user enum
│ ├── smtp_enum.py # [T4] SMTP VRFY/EXPN user validation
│ ├── owa_timing.py # [T4] OWA/EWS HTTP timing side-channel
│ ├── printer_spooler.py # [T4] MS-RPRN job owner enum + PrinterBug detection
│ └── ldap_referral.py # [T2] Forest/trust referral chase
├── intelligence/
│ ├── dc_fingerprint.py # DC service & capability detection
│ └── technique_selector.py # Tier-aware technique pipeline builder
├── output/
│ └── reporter.py # Rich terminal + JSON + CSV + HTML
├── types_/
│ └── models.py # Pydantic v2 models & enums
└── adar.py # Click CLI entry point
```
## 安装
**从 GitHub 安装(推荐):**
```
git clone https://github.com/cumakurt/adar.git
cd adar
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
adar --help
```
**从源码安装(仅依赖项):**
```
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python adar.py --help
```
要求 **Python 3.10+**。有关依赖项,请参阅 [requirements.txt](requirements.txt)。
## 用法
### 基础扫描(无凭证)
如果省略域名,则会自动发现(LDAP/SMB/Kerberos/rDNS)。
```
python adar.py -t 192.168.1.10
python adar.py -t 192.168.1.10 -d corp.local
```
在没有凭证的情况下,**所有未经认证的战术**都会运行:Tier 1–2 和无需凭证的 Tier 4(DNS、LDAP 匿名、Kerberos AS-REQ、SMB 空会话、LLMNR/被动监听器、OXID、SAMR、RID 循环、DNS LDAP 转储、全局编录、SCCM、MS-RPRN)。在默认的 `--Noise high` 下,除非您明确降低噪声预算,否则技术将以最大速度运行。
### Kerberos、Azure 和 OWA 用户枚举
如果未提供字典(`-w`),Kerberos 将使用内置的智能列表(administrator、guest、krbtgt 等);当未提供字典时,**Azure 枚举**和 **OWA 计时**也会使用内置列表(请参阅下文的 Tier 4 详细信息)。
```
python adar.py -t 192.168.1.10 -d corp.local -w /path/to/users.txt
```
### 认证扫描
```
python adar.py -t dc01.corp.local -d corp.local \
-u admin -p 'Password1!' \
-f json -f html -o ./reports/
```
### 隐蔽模式(IDS 规避)
```
python adar.py -t 10.0.0.5 -d lab.test \
--noise very_low --timeout 15 -w users.txt
```
### Pass-the-Hash(NT hash)
```
python adar.py -t 10.0.0.5 -d corp.local \
-u admin --hash aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
```
## CLI 参数
| 参数 | 简写 | 默认值 | 描述 |
|-----------|-------|---------|-------------|
| `--target` | `-t` | *必填* | DC IP 或主机名 |
| `--domain` | `-d` | — | AD 域(如果省略则自动发现) |
| `--username` | `-u` | — | 用户名 |
| `--password` | `-p` | — | 密码 |
| `--hash` | — | — | NTLM hash |
| `--wordlist` | `-w` | — | 用于 Kerberos、Azure AD、OWA 计时、SMTP VRFY 的用户列表 |
| `--profile` | — | `default` | `default`(所有层级),`stealth`(仅 T1–2),`full`,`soc-full` |
| `--noise` | — | `high` | `very_low` / `low` / `medium` / `high` |
| `--timeout` | — | `10` | 连接超时(秒) |
| `--output-dir` | `-o` | `.` | 报告输出目录 |
| `--format` | `-f` | `terminal,json,html` | 输出格式(可重复) |
| `--concurrent` | — | `3` | 每个层级的并发技术数 |
| `--listen-time` | — | `60`(隐蔽模式:300) | 被动监听器持续时间(秒) |
| `--verbose` | `-v` | `false` | 调试日志 |
## JSON 输出示例
```
{
"username": "admin",
"confidence": "confirmed",
"found_by": ["kerberos_enum", "ldap_anon"],
"attributes": {
"email": "admin@corp.local",
"display_name": "Admin",
"groups": ["Domain Users", "IT Staff"],
"enabled": true
},
"timestamp": "2024-01-15T10:23:41Z"
}
```
## 技术细节
### 未经认证的技术(层级摘要)
| 层级 | 技术 | 描述 |
|------|-----------|-------------|
| T1 | DNS 枚举 | SRV 记录,区域传送尝试 |
| T1 | LDAP 匿名 | 匿名绑定 + 用户搜索 |
| T1 | Kerberos 枚举 | AS-REQ 用户存在性检查(字典或内置) |
| T1 | SMB 空会话 | 空会话,OS/域信息 |
| T1 | LLMNR/NBT-NS 监听器 | 被动;名称查询和 NTLM 捕获 |
| T1 | 被动流量 | mDNS/NBNS 被动监听 |
| T2 | LDAP 引荐 | 林/信任引荐追踪 |
| T2 | OXID 解析器 | RPC endpoint 列表 |
| T2 | SAMR | MS-SAMR 用户列表(匿名/认证) |
| T2 | RID 循环 | SID+RID 账户名解析 |
| T2 | DNS LDAP 转储 | ADIDNSDump 风格的 DNS 记录转储 |
| T2 | 全局编录 | GC 绑定 + 用户搜索 |
| T2 | SCCM 枚举 | SCCM/MDT MP 和 NAA 发现 |
| T4 | 打印后台处理服务 | MS-RPRN 作业所有者枚举,PrinterBug 检查 |
Tier 3(LDAP 认证、AS-REP Roasting、Kerberoasting、SYSVOL、脆弱账户)需要凭证(`-u`/`-p` 或 `--hash`)。T4 中的 ADCS 需要凭证;**Azure 枚举**和 **OWA 计时**不需要凭证,并在未提供字典时使用内置的智能列表(请参阅下文的“Azure 和 OWA 详细信息”)。
## 枚举技术 — 详细说明
每项技术都包含**方法**(工作原理)和**原理**(为何使用)的描述。
### Tier 1 — 未经认证,极低噪声
| 技术 | 方法 | 原理 |
|-----------|--------|-----------|
| **dns_enum** | 通过将目标作为 DNS 服务器,查询标准的 AD DNS SRV 记录(`_kerberos._tcp`、`_ldap._tcp`、`_ldap._tcp.dc._msdcs`、`_gc._tcp` 等)。可选择探测 TXT 和区域传送。 | 在无需任何认证的情况下确认 DC 的存在,并发现其他 DC/林成员。从 AD 认证的角度来看完全是被动行为;仅有 DNS 流量。 |
| **ldap_anon** | 使用**匿名**认证绑定到 LDAP(端口 389)。尝试多种策略:(1) 带有完整属性的分页用户搜索;(2) 带有备用过滤器的最少属性(sAMAccountName)搜索;(3) 通过 DN 查找知名账户(Administrator、Guest、krbtgt);(4) CN=Users 子树。 | 许多配置错误或老旧的 DC 允许匿名 LDAP 绑定;当 ACL 允许时,这会直接产生用户对象列表。噪声极低。 |
| **kerberos_enum** | 为每个候选用户名(字典或内置智能列表)发送 Kerberos **AS-REQ**(认证服务请求)。解析 KDC 响应:`KDC_ERR_PREAUTH_REQUIRED` (25) → 用户存在;`KDC_ERR_C_PRINCIPAL_UNKNOWN` (6) → 用户不存在。 | KDC 在不需要密码的情况下暴露了用户的存在。这是行业标准的用户枚举方法;基于字典且可进行速率限制。 |
| **smb_null** | 建立到端口 445 的**未经认证(空)** SMB 会话(用户名/密码为空)。通过 SMB 调用检索 NetBIOS 域名、DNS 主机名和 OS 版本。 | 确认是否允许空会话,这是在旧版 DC 上运行 SAMR/RID 循环的前提条件。它本身不枚举用户,但丰富了 DC 指纹信息。 |
| **llmnr_listener** | **仅限被动**(无数据包注入)。绑定到 LLMNR(UDP 5355,多播 224.0.0.252)、NBT-NS(UDP 137)和 mDNS(UDP 5353)。捕获主机名查询,并在存在时捕获 NTLM Type-1/2/3 消息(用户名以及可选的 NTLMv2 hash)。 | 相当于 Responder 的“analysis”模式:观察主机请求的名称以及网络上的任何 NTLM 流量。零中毒风险;适用于在共享网段中发现用户/hash。 |
| **passive_traffic** | **完全被动** — 不发送任何数据包。在本地网段上嗅探 mDNS(UDP 5353)和 NBNS(UDP 137)。提取机器名称,并从命名约定中推断计算机账户(HOSTNAME$)和可能的用户名。 | 补充了仅针对多播/广播捕获的 LLMNR 监听器。揭示通常映射到 AD 用户的主机名和命名模式;需要 CAP_NET_RAW 权限。 |
### Tier 2 — 被动 / 旁路 / 低认证
| 技术 | 方法 | 原理 |
|-----------|--------|-----------|
| **ldap_referral** | 通过 LDAP 查询域的 **trustedDomain** 对象,以列出林和外部信任。对于入站/双向信任,它会跟随 LDAP 引荐到受信任的 DC,并尝试匿名绑定和 base DN / 用户枚举。 | 信任映射对于跨域和跨林提权至关重要。如果允许匿名绑定,引荐追踪可以获取受信任域中的用户。 |
| **oxid_resolver** | 向端口 135(RPC Endpoint Mapper)发起单个 RPC 调用 **IObjectExporter::ServerAlive2**。解析响应中的网络接口字符串(IP 和主机名)。 | 暴露 DC 提供的备用主机名和 IP;用作后续技术和 pivot 目标的侦察。噪声极低(单次调用)。 |
| **samr_enum** | 通过 SMB 命名管道 `\pipe\samr` 使用 **MS-SAMR**。使用空会话或提供的凭证进行连接,打开域句柄,并通过 `SamrEnumerateUsersInDomain`(分页)枚举用户。 | SAMR 是通过网络列出域用户的经典方式。空会话适用于旧版 DC;现代 DC 需要凭证。经过认证后的结果是 CONFIRMED 的。 |
| **rid_cycling** | (1) 通过 LSA 或 SAMR 解析**域 SID**。(2) 为 RID 500–2000 构建 SID+RID 组合(可配置)。(3) 批量使用 **MS-SAMR LookupRids** 将 RID 解析为账户名。过滤掉组 RID(512–520),保留用户。 | 当 SAMR 枚举受限时,RID 循环仍然可以解析已知的 RID(例如 500=Administrator),并通过暴力破解 RID 空间发现额外的账户。 |
| **dns_ldap_dump** | **adidnsdump 风格**:查询 LDAP 分区 `DC=DomainDnsZones` 和 `DC=ForestDnsZones` 中的 DNS 节点。解析 `dnsRecord` 二进制大对象,构建主机名到 IP 的映射,并从命名中推导**服务账户**候选者(例如 `svc-`、`sql-`、`web-`)。 | 集成到 AD 中的 DNS 存储在 LDAP 中;转储它会揭示主机名和隐藏记录。从主机名推断出的服务账户名称是高价值目标。允许时可以匿名工作;有凭证效果更好。 |
| **global_catalog** | 连接到**全局编录**(端口 3268 或用于 LDAPS 的 3269)。搜索基为 `""`;在整个**林**中查询用户对象。使用带有用户属性的分页搜索。 | GC 包含林中每个域的部分副本;通过一次连接即可枚举所有子域的用户,而无需知道它们的 DN。在某些 DC 上可以匿名;凭证可提高覆盖率。 |
| **sccm_enum** | (1) **LDAP**:查找 SCCM Management Points 和站点。(2) **HTTP**:探测 MP endpoint 以获取可能包含用户名的 XML。(3) **SMB**:检查 MDT 共享中的 `Bootstrap.ini` 或 `CustomSettings.ini`,以获取 **NAA** 凭证。 | SCCM/MDT 经常以纯文本形式存储部署和 NAA 凭证。发现 MP 并解析配置文件可以获取服务账户甚至密码。 |
### Tier 3 — 需要凭证
| 技术 | 方法 | 原理 |
|-----------|--------|-----------|
| **ldap_auth** | 使用**提供的凭证**(Simple 或 NTLM)绑定到 LDAP(389)或 LDAPS(636)。对具有**完整属性集**的所有用户对象执行分页搜索。 | 有了有效的凭证,LDAP 是用户和组数据保真度最高的来源。这是用于完整用户转储和属性获取的单项技术。 |
| **asreproast** | (1) **LDAP**(已认证):查找具有 **DONT_REQUIRE_PREAUTH** 属性的用户。(2) 为每个此类用户发送 **AS-REQ**(无预认证)。(3) 提取加密的 AS-REP 部分并输出 **hashcat** 格式。 | 没有预认证的账户可以被“roasted”:KDC 返回一个可以在离线状态下被破解的加密票据。 |
| **kerberoast | (1) **LDAP**(已认证):查询设置了 **servicePrincipalName**(且未被禁用)的用户。(2) 使用提供的凭证获取 TGT,然后为每个 SPN 请求 **TGS**。(3) 提取 **hashcat** 格式的 RC4 加密服务票据部分。 | 具有 SPN 的服务账户会得到使用其密码派生密钥加密的 TGS 票据;这些 hash 可以在离线状态下被破解。标准的 Kerberoasting 攻击。 |
| **sysvol_enum** | 使用凭证通过 **SMB** 连接到 `SYSVOL` 和 `NETLOGON`。递归遍历共享以查找与 GPO 相关的文件。解析 **Groups.xml** 和其他 GPO XML 中的 **cpassword**(GPP 加密密码);使用微软发布的 AES 密钥进行解密。 | GPP 通常包含凭证;cpassword 是可解密的。发现明文的 GPP 凭证对于权限提升和横向移动至关重要。 |
| **ldap_vuln_accounts** | **LDAP**(已认证):搜索具有敏感 **userAccountControl** 标志和 **adminCount=1** 的账户。扫描 **description**,查找指示嵌入密码的正则表达式模式。 | 薄弱的 UAC 设置和描述字段中的凭证是常见的配置错误。此技术会标记高价值和易于滥用的账户。 |
### Tier 4 — 专用 / 高级
| 技术 | 方法 | 原理 |
|-----------|--------|-----------|
| **adcs_enum** | **LDAP**(已认证):读取 **Configuration** 分区以获取证书模板和 CA。评估模板是否存在 **ESC1–8** 漏洞。从 ACE 中提取可注册的主体。 | AD CS 配置错误(ESC1–8)允许进行权限提升。枚举可识别易受攻击的模板和可以注册的高价值账户。 |
| **azure_enum** | 针对目标域名,在 `login.microsoftonline.com` 上调用**未经认证的** `GetCredentialType` API。发送候选用户名(内置列表或字典);解析 **IfExistsResult**(0/5/6 = 存在,1 = 未找到)。仅当域已在 Azure 中注册时才运行(OpenID 配置探测)。 | 混合和纯云的 Azure AD 账户可以通过这个公开的 API 进行枚举。 |
| **smtp_enum** | 探测 **SMTP**(端口 25,备用 587/465/2525)。首先尝试 **VRFY**;如果被禁用(501/502),则退回到 **EXPN**。对于每个候选者,解析回复:2xx = 用户存在,5xx = 未找到。使用抖动进行速率限制。 | 老旧和配置错误的 SMTP 服务器在未经认证的情况下即可暴露有效的邮箱。 |
| **owa_timing** | **计时旁路**:发现 OWA/EWS endpoint。发送带有**已知无效**用户名的认证请求,以建立基准响应时间。对于每个候选者,比较平均响应时间;**明显更慢**的响应表明是有效账户。由于在高负载下存在误报,置信度为 POSSIBLE。 | Exchange/OWA 对有效用户的响应时间通常比无效用户长。当其他方法被锁定时,这允许在没有有效凭证的情况下进行用户枚举。 |
| **printer_spooler** | 通过 `\pipe\spoolss` 使用 **MS-RPRN**。调用 **EnumPrinters** 和 **EnumJobs** 列出打印机和**打印作业所有者**(用户名)。可选择在没有凭证的情况下检查 **OpenPrinterEx**,以评估 **PrinterBug** (SpoolSample) NTLM 中继面。 | 打印作业由真实的 AD 账户所有;枚举作业所有者可以揭示用户以及通常具有特权或服务账户。PrinterBug 检查可识别中继目标。 |
### Azure 和 OWA 枚举 — 运行时机与测试方式
当满足各自的前提条件时,这两种技术都会运行。如果未提供字典,它们将使用**内置的智能用户名列表**。
#### Azure 枚举(`azure_enum`)
- **运行时机:** (1) 目标域必须**已在 Azure AD 中注册**(通过 OpenID 配置探测验证)。(2) 候选用户名如果提供了 `-w` 字典则从中获取,否则来自内置的智能列表。
- **如何验证:** 请求 `https://login.microsoftonline.com/{domain}/.well-known/openid-configuration`;在 `issuer` 字段中查找 `microsoftonline.com` 或 `login.windows.net`。如果未找到,则跳过该技术。
- **如何测试:** 如果该域在 Azure 中,向 **GetCredentialType** API(`/common/GetCredentialType`)POST `user@domain`。`IfExistsResult`:0/5/6 → 用户存在,1 → 未找到。
- **总结:** 如果该域不是 Azure AD 租户,则跳过 Azure 枚举。示例:`adar -t dc -d corp.local --profile full`(使用内置列表);添加 `-w users.txt` 以通过文件进行扩展。
#### OWA 计时(`owa_timing`)
- **运行时机:** (1) 目标上的 **OWA 必须可访问**:端口 443 或 80 打开,并且可以发现 OWA/EWS endpoint。(2) 如果提供了字典,候选者从中获取,否则来自内置的智能列表。
- **如何被发现:** 检查目标上的 443/80 是否打开,然后探测:`/owa/auth.owa`、`/owa/`、`/EWS/Exchange.asmx`、`/autodiscover/autodiscover.xml`、`/Microsoft-Server-ActiveSync`。第一个未返回 5xx 的 URL 将被用作 OWA endpoint。
- **如何测试:** 使用已知无效的用户名(例如 `nonexistent_user_xzqj7`)建立**计时基准**。对于每个候选者,发送一个 OWA 登录 POST 并测量响应时间;明显高于基准的值(例如 ~80 ms + 2σ)被视为“可能有效”(计时旁路)。
- **总结:** 如果目标没有 HTTP/HTTPS 或 OWA(例如目标只是一个 DC),则跳过 OWA 计时或以“未发现 OWA endpoint”结束。要测试 OWA,目标必须提供 Exchange/OWA 服务;`-w users.txt` 是可选的(如果未提供则使用内置列表)。
### 噪声等级
| 等级 | 用例 | 延迟 |
|--------|----------|-------|
| `very_low` | 隐蔽 — 被动/DNS | 0.5秒 + 抖动 |
| `low` | 正常的渗透测试 | 0.2秒 + 抖动 |
| `medium` | 快速扫描 | 0.05秒 + 抖动 |
| `high` | 最大速度 | 0秒 + 抖动 |
### 置信度分数
| 分数 | 含义 |
|-------|---------|
| `confirmed` | 确定的 — LDAP 属性转储或 KDC_ERR_PREAUTH_REQUIRED |
| `probable` | 可能有效的 — 多个来源 |
| `possible` | 弱信号 — 单一来源,间接的 |
## 许可证
GNU Affero General Public License v3.0 (AGPL-3.0) — 请参阅 [LICENSE](LICENSE)。仅用于授权的安全测试。
## 开发者
- **邮箱:** cumakurt@gmail.com
- **LinkedIn:** [cuma-kurt-34414917](https://www.linkedin.com/in/cuma-kurt-34414917/)
- **GitHub:** [cumakurt/adar](https://github.com/cumakurt/adar)
标签:Python, Windows域安全, 安全工具, 无后门, 模拟器, 活动目录, 渗透测试, 红队工具