影响范围

Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2012
Windows Server 2012 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation)
Windows Server 2016
Windows Server 2016 (Server Core installation)
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)

可见覆盖范围之广。

原理

具体中文这个讲的比较好,但讲得比较简单CVE-2020-1472简要分析.

zerologon

Netlogon协议的认证方式并非传统的NTML或者kerberos协议,他自定义了自己的认证方式。

netlogon认证流程

CVE-2020-1472复现(域内提权)
这是是一个双向认证的过程以向对方证明我知道client账户的密码。由client发起认证双方交换各自的challenge,使用共享的账户hash(secret)和双方的混合的challenge经过KDF算法(**派生)生成sessionkey(注意这里的sessionkey是唯一的,因为后续的调用需要用到sessionkey)。使用sessionkey通过特定算法各自生成credential。client_credential生成后发送到server进行认证,server用client_challenge以及sessionkey重复该计算如果结果相等则通过认证.(server_crendential当然通过)client_credential使用了AES-CFB8来进行,流程如下

CVE-2020-1472复现(域内提权)

一般情况
这里橙色部分迭代使用,但必须有一个初始化IV向量,在加密时将其附加在challenge前,蓝色部分为challenge,这部分用户可以控制。微软存在的问题就是将初始化IV向量全部设置为0值,如果用户将client_challenge也全部设置为0,就会发生如下加密流程:

CVE-2020-1472复现(域内提权)

存在漏洞的情况

存在的利用方式就是在用户提供的challenge为8字节0的情况下,如果存在一个key使得第一轮加密后的密文的第一个字节为0,那么最后challenge生成的密文就是8字节0值,因为橙色部分AES的加密过程使用的key为secret(hash)和混合的challenge运算后的值,在整个加密流程中不会改变。(但发起不同的认证流程key是不同的,因为server_challenge是随机的。)最后能够生成0值密文的key不唯一,而且有很多,只要第一轮密文的第一byte为0即可,那么最终的概率就是1/256(8bit,2^8),平均只需要尝试256次即可bypass该认证。这是这个漏洞的精髓所在。后续的远程调用也基于此。

autenticator

还存在的问题就是我们bypass了认证但还不知道sessionkey。netlogon的认证流程中后续的远程调用可以看到需要加密并且附带authenticator。其实加密是可选项,客户端如果接收到未加密请求是不被允许的但服务端允许未加密请求,这可能是微软的一个容错机制。authenticator由sessionkey作为key,timestamp以及ClientStoredCredential最为参数进行计算。ClientStoredCredential在初始化时设为与client_credential(00000000)相同,而timestamp 协议并没有对其作严格限制,也可设置为0(1970.01.01).因为在认证过程中我们已经找到了一个sessionkey使得全0值加密也为0,(尽管我们不知道具体的值)那么这里的authenticator也必定为0.我们知道了authenticator,并且请求不加密server也是可以被接受的那么我们就可以调用任意方法了。

重置密码

漏洞作者找到一个可攻击的方法NetrServerPasswordSet2。他可以更新客户端的密码(此客户端应该非彼客户端。)在该远程调用的过程中会发送新密码的密文,长度为516比特,后四bit表示密码长度。值得注意的是该密文是由sessionkey加密的(非hash),那么我们如果设置为全0,根据上面的sessionkey加密特性真实的密码明文也是0并且长度为0,而这种密码竟然可以被设置,我们也就可以置空server密码。这时如果我们的目标为域控,可以使用impacket的secretdump,dump域内用户hash。包括administrator以及krbtgt完成域内提权。

利用

https://github.com/dirkjanm/CVE-2020-1472
https://github.com/SecureAuthCorp/impacket - DCsync导出hash

CVE-2020-1472复现(域内提权)

CVE-2020-1472复现(域内提权)
krbtgt以及administrator的hash已经有了,可以做到事情就比较多了。

复原机器账户hash

python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:7ecffff0c3548187607a14bad0f88bb1 srat.org/[email protected] // wmicexec 连接

reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
get system.save
get sam.save
get security.save
del /f system.save
del /f sam.save
del /f security.save

secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

CVE-2020-1472复现(域内提权)

windows下脚本死活没法用,我也是服了。。。

深入

https://www.secura.com/pathtoimg.php?id=2055

相关文章: