Windows域环境攻击技术详解

GPP (MS14-025)

管理员为了统一管理计算机本地管理员的密码,有时会通过组策略(Group Policy Preferences)来统一设置,该方法会将配置信息写入 \\<DC>\SYSVOL\<Domain FQDN>\Policies\ 域控共享目录的XML文件中,类似的文件有drives.xml, groups.xml, printers.xml等。

SYSVOL共享目录保存了登录脚本、组策略数据等其它域内共享数据,所以域内任意用户均对该目录具有读权限,并且这些数据在所有域控服务器之间自动同步。

XML文件中的密码字段(cpassword)采用AES256加密存储,但是微软在2012年公开了加密密钥,导致密文可轻易还原。MS14-025补丁禁用了组策略保存密码的功能,但即使打了该补丁,之前保存的配置文件依然存在,需要手动删除相应xml文件。

本质:域控通过组策略保存密码时,由于都是保存在域控共享目录的XML文件中,域内任意用户均对该目录具有读权限,而且这些数据在所有域控服务器之间都是自动同步的。

漏洞关键:XML中的密码字段采用AES,但由于密钥公开,导致密文可以轻易还原。

GoldenPAC (MS14-068)

前面提到过,PAC是微软对Kerberos协议做的扩展,其中包含了用户名、ID、所属组等信息,并且用krbtgt及目标服务的帐户密码(long-term secret key)进行签名确保其完整性,以防止用户伪造身份信息。

但是微软在实现的过程中,除了支持默认的HMAC-MD5、HMAC-SHA1等需要密钥(keyed)的加密算法外,还支持弱加密算法,比如MD4、MD5、CRC32等,这类算法不需要密钥(unkeyed),所以攻击者可以任意伪造PAC中的信息(比如该用户所属组),只需要用MD5算法对伪造的PAC数据进行签名,域控TGS服务即认为该PAC数据是有效可信的。

虽然PAC是可以伪造的,但是PAC包含在票据的加密部分内,以TGT为例,PAC所在的部分外层被krbtgt帐户密码加密,客户端无法解密,也就无法替换其中的PAC数据。

上文提到过,用户在预认证阶段(AS-REQ)如果指定PA-PAC-REQUEST为False,域控AS服务会为其生成一个不包含PAC数据的TGT票据,同样以krbtgt帐户密码加密且有效。

客户端伪造高权限(比如”Domain Admins”管理员组)的PAC并采用不需要密钥的弱加密算法进行签名,附加到上一步域控返回的不包含PAC的TGT中,向域控TGS服务发起TGS-REQ发起请求,申请krbtgt服务的服务票据,也就是TGT。存在该漏洞的域控TGS服务验证用户提交的TGT及PAC都是有效的,所以生成有效的TGT票据(管理员组权限)返回给客户端。

客户端可以用域管理员权限的TGT(身份证)继续向域控的TGS服务申请域内任意服务的ST,比如域控服务器的CIFS服务,从而获取域控服务器权限。

攻击步骤

  1. 伪造PAC:攻击者可以修改PAC中的信息,比如把用户的权限提升为管理员,然后使用不需要密钥的MD5算法来签名这个伪造的PAC。
  2. 获取不带PAC的TGT:在请求TGT(票据)时,攻击者可以告诉域控不需要PAC数据,域控就会生成一个没有PAC的TGT,虽然没有PAC,但仍然被加密,且在一定情况下是有效的。
  3. 伪造PAC并插入TGT:攻击者将伪造的PAC插入到不带PAC的TGT中,然后用这个修改过的TGT向域控TGS(服务票据发放服务)请求一个服务票据(比如CIFS服务票据)。
  4. 获取管理员权限:TGS验证这个伪造的TGT时,并没有检查PAC的完整性,所以认为它是有效的,最终返回给攻击者一个带有管理员权限的服务票据。攻击者可以使用这个票据进一步攻击域控服务器,获取更高权限。

PrivExchange (SSRF & NTLM Relay)

Exchange SSRF

Exchange Web Services (EWS) API中的 PushSubscriptionRequest 函数存在SSRF(Server Side Request Forgery)漏洞,任意拥有邮箱的域用户可以利用该功能诱使Exchange服务向其指定的URL发起HTTP请求(定时推送订阅通知)。如果攻击者伪造HTTP服务,要求Exchange服务进行NTLM认证(基于HTTP),则可将认证请求转发至域内其它服务(比如域控的LDAP服务)进行认证,从而获取运行Exchange服务的计算机帐户的权限。

Exchange权限过高 (too high privileges by default)

当服务在域成员计算机上的LocalSystem帐户下运行时,该服务具有授予该计算机帐户的任何网络访问权限。运行Exchange服务的计算机帐户在AD内具有较高的权限,其属于”Exchange Trusted Subsystem”组,而该组又属于”Exchange Windows Permissions”组。

“Exchange Windows Permissions”组对域对象具有WriteDacl权限

WriteDacl权限:让持有者能够修改对象的访问控制规则,从而影响其他用户对该对象的访问权限。这是一个非常强大的权限,通常只会授予给系统管理员或者需要修改资源访问控制的用户。

也就是说Exchange服务可以对域内任意对象新增或删除ACE(Access Control Entries),比如为某个用户增加DCSync权限(相当于拥有域管理员权限),DCSync实际上需要以下三个权限:

  • Replicating Directory Changes
  • Replicating Directory Changes All
  • Replicating Directory Changes In Filtered Set

DCSync权限 == 域控权限

NTLM Relay

NTLM Relay 101

NTLM实际上也叫NTHash,其加密算法为MD4(UTF-16-LE(password)),NTLMv1/v2(也叫Net-NTLMv1/v2)是由NTHash衍生而来(引入随机数进行加密),做网络认证用。

NTHash存储在系统SAM(Security Account Manager)及域控的NTDS.dit数据库中,可以用来执行Pass-The-Hash攻击,而Net-NTLMv1/v2不能用来执行Pass-The-Hash,仅能用来转发(relay)。

NTLM是基于挑战-应答机制的认证协议,使用共享密钥(即用户的密码)来对客户端进行认证:

  1. 第一步:客户端向服务端发起认证请求,协商使用的协议版本(Net-NTLMv1/v2)、是否启用签名等信息。
  2. 第二步:服务端选择一个版本并返回一段随机字符作为challenge(也叫nonce)。
  3. 第三步:客户端使用NTHash对challenge加密并发送给服务端(response),如果加密结果与服务端计算的结果匹配,则客户端认证成功。

NTLM认证协议天然存在转发攻击的风险,攻击者诱使客户端向其自身发起NTLM认证,并将其转发至目标服务器,通过中间人攻击实现在不需要用户密码的情况下,以客户端身份向服务器发起认证。SMB签名可以阻止此类转发攻击,但是默认情况下,只有域控的SMB服务默认强制启用签名校验。

Reflective NTLM Relay is Dead?

在MS08-068补丁之前,基于SMB的NTLM认证可以转发至客户端自身的SMB服务,所以也叫反射型转发,这个补丁之后,客户端发起的基于HTTP的NTLM认证依然可以转发至自身的SMB服务,该漏洞通常用来实现本地提权,MS16-075修复了这种跨协议(Cross-protocol)的反射型转发。

Cross protocol relaying

NTLM认证通常封装在其它协议内部,比如SMB、HTTP(s)、LDAP、IMAP、SMTP、POP3、MSSQL,其内部的NTLM认证部分是一样的,所以可以将一种协议内部的NTLM认证转发至其它协议。比如基于HTTP的NTLM认证通过HTTP Header中的”Authorization”发送,攻击者可以将其抽离出来发送至SMB服务进行认证。

Relay NTLM(in HTTP)to LDAP

综合以上介绍的Exchange SSRF漏洞、Exchange默认权限过高、NTLM转发攻击,攻击者可以诱使Exchange服务向其自身发起HTTP NTLM认证,并将其转发至域控的LDAP服务,以Exchange服务的身份认证成功后,利用其修改任意域对象DACL的权限,赋予攻击者控制的域帐户DCSync权限,从而dump出域内任意帐户的NTHash,获取域管理员的权限。

NTLM Tampering (Drop The MIC) & RBCD

上一个漏洞中介绍了利用Exchange服务发起基于HTTP的NTLM认证并转发至域控LDAP服务认证,进而修改域ACL权限(Exchange服务帐户具有WriteDacl权限),提升任意用户为域管理员权限。

而这个漏洞则可以实现将辅助域控服务器的基于SMB的NTLM认证转发至主域控的LDAPS服务,利用基于资源的约束委派特性(RBCD:Resource-Based Constrained Delegation),以任意用户身份(域管理员)生成辅助域控服务器CIFS服务的ST(Service Ticket),从而获取辅助域控服务器权限。

该攻击过程首先利用打印机服务(SpoolService)MS-RPRN(Print System Remote Protocol)RPC接口的一个BUG,利用该BUG可诱使目标服务器向任意主机发起SMB认证。

研究人员发现,在基于SMB的NTLM认证过程中,即使客户端在第一步协商(NTLM_NEGOTIATE)请求中指定需要对NTLM认证进行签名(SMB Signing),只要服务端未强制要求签名(域控LDAP(s)服务默认不强制要求签名),攻击者即可以通过中间人攻击,在转发基于SMB的NTLM认证的过程中,将NTLM安全级别降低为未签名的状态,从而实现将基于SMB的NTLM转发至域控的LDAPS服务进行认证。

域成员计算机运行的服务通常与其计算机帐户对应,而任意域用户都具有创建计算机帐户的权限(默认可创建10个,详情可参考:MachineAccountQuota),创建计算机帐户的同时为其注册SPN,使其成为一个合法的服务帐户(ServiceA)。

以辅助域控服务器的计算机帐户向主域控LDAPS服务认证成功后,由于域内任意计算机对象都具有基于资源的约束委派权限(Since Windows Server 2012),其可以自行决定允许另外一个服务(ServiceA)”假冒”任意用户访问其自身的CIFS服务(ServiceB,这里为辅助域控的文件共享服务),CIFS服务实际上是SMB协议的一种实现。

新创建的计算机帐户(for ServiceA)被辅助域控服务器(ServiceB)授予基于资源的约束委派权限后(AllowedToActOnBehalfOfOtherIdentity=ServiceA),其可以通过S4U协议(S4U2Self+S4U2Proxy)以域管理员身份登录辅助域控服务器的CIFS服务,从而获取域控服务器权限。

攻击流程简化

  1. 利用漏洞:攻击者利用打印服务(SpoolService)中的一个漏洞,通过MS-RPRN(Print System Remote Protocol)RPC接口,让目标服务器发起SMB认证,并通过中间人攻击将认证的安全级别降低为未签名(Drop the MIC),这样攻击者可以拦截和篡改认证过程。
  2. 转发认证请求:攻击者通过降级后的SMB认证请求,将目标服务器的认证请求转发到主域控的LDAPS服务,绕过正常的认证检查。
  3. 创建计算机帐户:攻击者创建一个计算机帐户,使其成为一个合法的服务帐户(ServiceA),并通过RBCD(基于资源的约束委派)将该计算机帐户的权限委派给辅助域控服务器。
  4. S4U协议提权:通过S4U(Service for User)协议,攻击者以域管理员身份登录到辅助域控服务器的CIFS服务,从而获得对辅助域控服务器的控制权限。

总结:攻击者通过中间人攻击降低认证安全性,将目标服务器的认证请求转发到主域控,再利用RBCD和S4U协议提升权限,最终获取域管理员权限。

Drop The MIC

NTLM认证包含三部分消息:NTLM_NEGOTIATE、NTLM_CHALLENGE、NTLM_AUTHENTICATE,分别对应认证的三步,为了确保消息在网络传输中不被恶意篡改,NTLM_AUTHENTICATE部分加入了MIC(Message Integrity Code)字段,采用HMAC_MD5对这三种消息统一做了签名校验,任何一步中的消息被篡改均会导致签名失效。

但是由于不是所有客户端都支持MIC,比如Windows XP/2003,所以也许为了保持向后兼容,该字段也并非必须的。在去掉NTLM_AUTHENTICATE消息中MIC字段的同时,还需要修改/去除一系列其它字段,以让服务端完全相信客户端不支持MIC,从而不对NTLM认证进行签名校验。也就是实现了将基于SMB的NTLM认证(默认客户端协商进行签名)降级为未签名的状态。未签名的NTLM可顺利转发至域控的LDAPS服务进行认证。

本质:篡改请求包让服务端向下兼容,认为攻击者是老版本客户端,没法使用签名的NTLM认证,由此绕过签名实现中间人攻击。

Relay NTLM(in SMB)to LDAPS

  1. 触发辅助域控服务器的打印机服务BUG,令其向攻击者控制的主机发起SMB认证。
  2. 利用ntlmrelayx.py将基于SMB的NTLM认证请求转发至主域控的LDAPS服务(这里不能转发至LDAP服务是因为只有LDAPS服务才具有创建计算机帐户的权限),–remove-mic去除签名相关信息,实现NTLM安全降级,–delegation-access创建新的计算机帐户并授予其对转发的计算机帐户(即辅助域控服务器)的基于资源的约束委派权限。
  3. 利用新创建的计算机帐户”假冒”域管理员身份向域控TGS服务申请辅助域控服务器HOST服务的服务票据,可进一步dump出辅助域控服务器上所有用户的NTHash。也就是说,控制了辅助域控服务器的计算机帐户,即可以通过基于资源的约束委派特性获取该服务器的系统权限。

Mitm6 & NTLM Relay & Kerberos Delegation

通过IPv6中间人攻击、NTLM转发、基于资源的约束委派特性的组合利用,攻击者可获取局域网同一广播域内任意域内主机系统权限。

Mitm6 Overview

即使在IPv4网络中,Windows系统默认也会通过DHCPv6协议申请IPv6地址,并且会优先使用IPv6的DNS服务器去解析IPv4及IPv6域名A记录。攻击者在局域网内监听DHCPv6广播请求,伪造响应,分配给目标主机恶意DNS服务器(IPv6),劫持目标主机首选DNS服务器。目标主机发起DNS请求时,攻击者可对其进行DNS欺骗。

核心:劫持DNS服务器,根据IPv6优先级直接进行DNS欺骗。

WPAD Overview

WPAD全称为Windows Proxy Auto Detection,在企业网络中用来自动检测访问互联网的网络代理,提供wpad.dat文件的服务器IP地址首先会通过DNS服务器进行解析,如果解析失败,客户端会通过广播的方式寻求解析,比如LLMNR(Link-Local Multicast Name Resolution),在同一广播域内的攻击者此时回应客户端,声称其自身为WPAD主机,客户端想要访问wpad.dat文件,就会向攻击者发起HTTP请求,攻击者此时要求客户端进行NTLM认证(HTTP 401),客户端自动向其发起认证,该过程无需用户交互即可完成。攻击者可进一步将基于HTTP的NTLM认证转发至其它服务。

微软在2016年发布了安全更新(MS16-077),做了以下两点修改缓解此类攻击:

  1. 客户端不再通过广播协议进行WPAD解析,仅能通过DNS服务解析。
  2. 即使WPAD主机要求认证(HTTP 401),客户端也不再自动发起NTLM认证。

具体来说,2016前利用了WPAD协议在DNS解析失败后回退到LLMNR/NBNS广播机制的弱点。攻击者通过回应客户端的广播请求,伪装成WPAD服务器,从而诱导客户端将代理配置请求发送给自己。一旦客户端连接到恶意WPAD服务器,攻击者就可以窃取NTLM凭据。

对应2016补丁的绕过方式

  • 第一条缓解措施:WPAD仅能通过DNS解析,利用mitm6劫持客户端的首选DNS服务器,即可轻易绕过。
  • 第二条缓解措施:客户端不再向WPAD主机发起NTLM认证,研究人员发现,如果此时向客户端提供”有效的”wpad.dat文件,并在其中指定攻击者为代理服务器,当客户端应用程序使用Windows API访问互联网时,会把攻击者当作是代理服务器,客户端向攻击者发起连接请求时,攻击者回应HTTP 407(Proxy Authentication),这不同于之前的HTTP 401认证,客户端会再次自动向其发起NTLM认证。

NTLM Relay & Kerberos Delegation

攻击链概述

1. WPAD劫持 (通过mitm6/DNS欺骗)

目标:让目标主机(计算机账户)误以为攻击者是WPAD代理服务器,并强制其通过攻击者进行网络连接。

实现方式

  • 开机阶段利用DHCPv6/SLAAC:攻击者利用mitm6等工具,在目标主机开机时,伪造DHCPv6服务器或利用IPv6的自动配置,将自己设置为目标主机的首选DNS服务器。
  • DNS欺骗:当目标主机尝试解析任何域名(包括wpad.internal.corp)时,攻击者作为伪造的DNS服务器,会将这些域名解析到攻击者自身的IP地址。
  • 提供恶意wpad.dat:当目标主机向被劫持的wpad.internal.corp发起请求时,攻击者会提供一个”合法”的wpad.dat文件,其中指定攻击者自身为代理服务器。
  • 触发HTTP 407:目标主机在后续的网络访问中,会尝试通过这个代理(攻击者)进行连接。此时,攻击者返回HTTP 407 (Proxy-Authenticate) 响应,要求目标主机进行NTLM认证。

2. NTLM Relay (基于HTTP到LDAPS)

目标:获取目标主机(计算机账户)的NTLM哈希,并将其转发到域控的LDAPS服务进行认证。

实现方式

  • 目标主机自动NTLM认证:收到HTTP 407后,目标主机(以其计算机账户身份)会自动向攻击者发起基于HTTP的NTLM认证(发送NTLM哈希)。
  • NTLM Relay到LDAPS:攻击者捕获到目标主机的NTLM认证请求后,将其实时中继到域控的LDAPS服务。
  • 无需协商签名:关键点在于,基于HTTP的NTLM认证默认不协商签名(或协商的签名级别较低),这使得攻击者可以顺利地中继认证请求,而不会被签名验证所阻碍。如果目标LDAPS服务强制要求签名(LDAP Channel Binding/Signing),则此步骤可能会失败,但通常情况下,默认配置下是可以成功的。

3. 利用基于资源的约束委派 (RBCD)

目标:在域控上修改目标主机的属性,使其允许攻击者以任意身份(包括域管理员)登录目标主机。

实现方式

  • LDAPS认证成功:由于攻击者成功地将目标主机的NTLM认证中继到了域控的LDAPS服务,域控会认为目标主机本身正在进行认证,并成功通过认证。
  • 修改msDS-AllowedToActOnBehalfOfOtherIdentity属性:攻击者利用成功认证的会话,通过LDAPS协议,修改目标主机计算机账户的msDS-AllowedToActOnBehalfOfOtherIdentity属性。这个属性允许指定的服务账户(或计算机账户)模拟其他用户(包括域管理员)在目标主机上进行认证。攻击者会将自己的控制的账户(或直接指定域管理员账户)添加到这个属性中。
  • 获取目标主机权限:一旦修改成功,攻击者就可以使用任意域用户(例如域管理员)的身份,通过Kerberos S4U2Proxy机制,向域控请求针对目标主机的服务票据。域控会签发这个票据,允许攻击者以域管理员的身份登录到目标主机,从而完全控制目标主机。

攻击链的威力

  • 无需用户交互:整个过程在目标主机开机或进行网络访问时自动发生,无需用户登录或任何交互。
  • 利用计算机账户权限:攻击利用的是目标主机自身的计算机账户权限,而不是某个特定用户的权限。计算机账户在域中通常具有一定的默认权限。
  • 绕过传统防御:结合了多种技术,绕过了MS16-077的缓解措施,并利用了Active Directory的委派特性。
  • 高权限获取:最终可以直接以域管理员身份登录目标主机,意味着对该主机拥有完全控制权,并可以进一步在网络中横向移动。

攻击流程总结

  1. WPAD劫持:攻击者伪装成DNS服务器,欺骗目标主机将代理请求发给自己,并提供一个恶意代理配置。
  2. NTLM中继:目标主机尝试通过攻击者代理上网时,攻击者要求NTLM认证。目标主机自动发送NTLM哈希,攻击者将这个哈希转发给域控的LDAPS服务,成功以目标主机的身份在域控上认证。
  3. RBCD利用:攻击者利用成功认证的会话,修改目标主机在域控上的属性,允许攻击者以域管理员等高权限身份登录到目标主机,从而完全控制它。

核心思想:通过劫持代理配置,诱导目标主机进行NTLM认证,然后将这个认证转发给域控,最后利用域控对目标主机的信任(RBCD)来获取目标主机的管理员权限。


本站由 Satoru 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。