原文链接:Mimikatz DCSync Usage, Exploitation, and Detection – Active Directory Security
2015 年 8 月添加到 Mimkatz 的一个主要功能是“DCSync”,它有效地“模拟”域控制器并从目标域控制器请求帐户密码数据。DCSync 由 Benjamin Delpy 和 Vincent Le Toux 编写。
DCSync 之前的漏洞利用方法是在域控制器上运行 Mimikatz 或 Invoke-Mimikatz 以获取 KRBTGT 密码哈希来创建黄金票。使用 Mimikatz 的 DCSync 和适当的权限,攻击者可以通过网络从域控制器中提取密码哈希以及以前的密码哈希,而无需交互式登录或复制 Active Directory 数据库文件 (ntds.dit)。
运行 DCSync 需要特殊权限。管理员、域管理员或企业管理员以及域控制器计算机帐户的任何成员都能够运行 DCSync 来提取密码数据。请注意,默认情况下不允许只读域控制器为用户提取密码数据。
上图中的凭据部分显示了当前的 NTLM 哈希值以及密码历史记录。此信息对攻击者来说可能很有价值,因为它可以为用户(如果被破解)提供密码创建策略。
DCSync 的工作原理:
- 发现指定域名中的域控制器。
- 请求域控制器通过GetNCChanges复制用户凭据(利用目录复制服务 (DRS) 远程协议)
我之前已经为域控制器复制做了一些数据包捕获,并确定了关于域控制器如何复制的内部 DC 通信流。
Samba Wiki 描述了DSGetNCChanges 函数:
“当第一个想要从第二个获取 AD 对象更新时,客户端 DC 向服务器发送 DSGetNCChanges 请求。响应包含客户端必须应用于其 NC 副本的一组更新。
对于只有一个响应消息,更新集可能太大。在这些情况下,会完成多个 DSGetNCChanges 请求和响应。这个过程称为复制循环或简称循环。”
“当 DC 收到 DSReplicaSync 请求时,对于它从中复制的每个 DC(存储在 RepsFrom 数据结构中),它会执行一个复制周期,它的行为就像一个客户端,并向该 DC 发出 DSGetNCChanges 请求。因此,它从它复制的每个 DC 中获取最新的 AD 对象。”
来自 MSDN:
IDL_DRSGetNCChanges 方法从服务器上的NC 副本复制更新。
ULONG IDL_DRSGetNCChanges( [in, ref] DRS_HANDLE hDrs, [输入] DWORD dwInVersion, [in, ref, switch_is(dwInVersion)] DRS_MSG_GETCHGREQ* pmsgIn, [out, ref] DWORD* pdwOutVersion, [输出,参考,switch_is(*pdwOutVersion)] DRS_MSG_GETCHGREPLY* pmsgOut );hDrs:IDL_DRSBind方法返回的RPC上下文句柄。
dwInVersion:请求消息的版本。
pmsgIn:指向请求消息的指针。
pdwOutVersion:指向响应消息版本的指针。
pmsgOut:指向响应消息的指针。
返回值: 0 如果成功,否则为Windows 错误代码。
抛出的异常:除了底层 RPC 协议(如[MS-RPCE] 中指定的)所抛出的异常之外,此方法可能会抛出以下异常:ERROR_INVALID_HANDLE、ERROR_DS_DRS_EXTENSIONS_CHANGED、ERROR_DS_DIFFERENT_REPL_EPOCHS 和 ERROR_INVALID_PARAMETER。
委派拉取账户数据的权利:
可以使用常规域用户帐户来运行 DCSync。需要在域级别委派以下三种权限的组合,才能使用户帐户使用 DCSync 成功检索密码数据:
- 复制目录更改 ( DS-Replication-Get-Changes )
扩展权限只需要复制来自给定 NC 的那些更改,这些更改也复制到全局目录(不包括秘密域数据)。此约束仅对域 NC 有意义。 - 复制所有目录更改 ( DS-Replication-Get-Changes-All )
控制访问权限,允许复制给定复制 NC 中的所有数据,包括秘密域数据。 - 复制过滤集中的目录更改(罕见,仅在某些环境中需要)
请注意,默认情况下,管理员和域控制器组的成员拥有这些权限。
使用 DCSync 提取密码数据
一旦账户被授予复制对象的能力,账户就可以运行 Mimikatz DCSync:
mimikatz “lsadump::dcsync /domain:rd.adsecurity.org /user:krbtgt”
使用 DCSync 定位管理员帐户还可以提供帐户的密码历史记录(以哈希格式)。由于列出了 LMHashes,因此有可能破解这些并深入了解管理员使用的密码策略。如果访问丢失,这可能使攻击者猜测管理员使用的下一个密码。
mimikatz “lsadump::dcsync /domain:rd.adsecurity.org /user:Administrator”
DCSync防御与检测
检测 DCSync 使用情况
虽然可能存在可用于识别 DCSync 使用情况的事件活动,但最好的检测方法是通过网络监控。
步骤 1:识别所有域控制器 IP 地址并添加到“复制允许列表”。
PowerShell Active Directory 模块 cmdlet:
Get-ADDomainController -filter * | 选择 IPv4 地址
powershell:
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().DomainControllers | 选择 IP 地址
Nslookup(如果 DC 运行 DNS):
nslookup
Set type=all
_ldap._tcp.dc._msdcs.DOMAIN.COM
步骤 2:配置 IDS 以在 DsGetNCChange 请求发起的 IP 不在“复制允许列表”(DC IP 列表)中时触发。