怎么进行CVE-2020-1472漏洞分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
NetLogon 远程协议是一种在 Windows 域控上使用的 RPC 接口,被用于各种与用户和机器认证相关的任务。最常用于让用户使用 NTLM 协议登录服务器,也用于 NTP 响应认证以及更新计算机域密码。
微软MSRC于8月11日 发布了Netlogon 特权提升漏洞安全通告。此漏洞CVE编号CVE-2020-1472, CVSS 评分:10.0。由 Secura 公司的 Tom Tervoort 发现提交并命名为 ZeroLogon。
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)
2020-09-11
当攻击者使用 Netlogon 远程协议 (MS-NRPC) 建立与域控制器连接的易受攻击的 Netlogon 安全通道时,存在特权提升漏洞。成功利用此漏洞的攻击者可以在网络中的设备上运行经特殊设计的应用程序。
要利用此漏洞,未通过身份验证的攻击者需要将 MS-NRPC 连接到域控制器,以获取域管理员访问权限。
Netlogon远程协议特别是可以更新域中的密码。RPC接口通过TCP动态端口分配域控制器的端口映射服务,或者通过SMB端口445。
Netlogon协议使用的是自定义的加密协议来让客户端(加入域的计算机)和服务器(域控制器)向对方证明加密,此共享加密是客户端计算机的HASH账户密码。Netlogon会话由客户端启动,因此客户端和服务器先交换随机的8个字节,客户端和服务器都先将密钥派生函数加密,然后客户端使用此会话密钥用于计算客户端凭据,服务器则重新计算相同的凭证,如果匹配,客户端必须知道计算机密码,因此客户端必须知道会话密钥。
在身份验证握手阶段时,双方可以协商是否加密和加密认证,如果加密被禁用,所有执行重要操作必须仍然包含认证值,也是用会话密钥计算的。
身份验证阶段
客户端和服务器都是用的加密原句在函数中实现生成凭据为ComputeLogOneCredential,称为协议规范,这个函数接受8字节的输入并通过加密会话对其进行转换产生相等长度输出的key,假设它不知道会话密钥将无法计算正确的输出及匹配的某个输入。这个函数有两个版本,基于2DES以及AES,取决于客户端在身份验证期间设置的标志,基本上使用的都是AES。AES分组密码需要输入16个字节并将其置换为大小相等的输出,操作模式必须加密较大或较小的输入,为了被选中,ComputeLogEncredential利用模糊的CFB8(8位密码)模式只需转换8个字节,这个模式大约是普通模式的16倍。
AES-CFB8对明文的每个字节进行加密,方法是预先加上前缀一个16字节的初始化向量,然后将AES应用于IV+明文的前16个字节,取AES输出的第一个字节,并使用下一个明文字节。
AES-CFB8操作模式的加密说明
为了能够加密会话,必须指定初始化向量(IV)引导加密过程,这个IV值必须是唯一的,并为每个单独的随机生成用同一密钥加密的密文。但是ComputeLogOnCreddential函数定义的IV是固定的,应该由16零字节组成,而AES-CFB8要求IV是随机的,对256个密钥中的1个将AES-CFB8加密应用全零字节明文将导致都是零密文。
1.欺骗客户端凭据
在于NetrServerReqChallenge交换质询调用后,客户端通过NetrServerAuthenticate3调用,并通过一个参数调用ClientCredential,再通过应用ComputeLogonIncredential的客户端质询上一个请求中发送。一共有256个密钥,那么怎么知道哪个会话使用了其中的密钥呢?因为无效登录后计算机账户并没有被锁定,可以尝试多次,直到获得准确的密钥和身份验证成功,仅需要尝试256次即可。
2.禁用加密和加密认证
虽然绕过身份验证,但是我们并不知道会话密钥的值是什么。由于Netlogon的传输加密而出现问题机制(“RPC加密和加密认证”),它使用一个完全不同的函数,ComputeLogEncredential函数,但是对于我们来说,认证和加密认证是可选的,而且只需不在NetrServerAuthenticate3调用即可。默认客户机将服务器未设置此标志时将拒绝连接,但是服务器不会拒绝请求不加密的客户端。
3.欺骗请求
即使禁用了请求加密,每个请求依旧包含一个验证器值,该值通过应用ComputeLogonIncredential(会话密钥)函数的值ClientStoredCredential+时间戳,ClientStoredCredential是一个递增的值,由客户端提供,在握手时初始化与ClientCredential相同的值。此客户端凭据仅由零组成,因此执行的第一个调用的ClientStoredCredential为零认证后,时间戳应该包含当前的时间和验证器,然而服务器却没有做什么限制,这样第一个调用我们只需要提供一个全零的验证器和全零的时间戳。
4.更改AD和密码
现在我们可以像任意客户端发送Netlogon请求,但是自从引入了Active Directory许多账户数据库被禁用,无法用来提取凭证,还有一个调用函数是NetrSreverPasswordGet允许获取计算机密码的NTML Hash,但是是用会话密钥加密的,我们可以利用NetrServerPasswordSet2调用,用来设置新的客户端计算机的密码,不是hash,但是是用会话密钥加密的,继续用全零。
Netlogon协议中的明文密码结构由516个字节组成,最后四个字节表示密码长度,结构中所有字节不是密码的一部分被可以填充任意值,如果我们在这里提供516个零,则将被解密到516个零,即零长度密码,这意味着可以成为任何域中的计算机。如果更改计算机密码,目标系统本身仍将在本地存储原始密码,且不能再对域进行身份验证,只能通过手动操作重新同步(拒绝服务漏洞)。
5.提权到管理员
我们可以更改计算机的密码时域控制器本身的,即使是我们连接的同一个域控制器,其中AD中存储的DC密码与密码不同存储在本地注册表中HKLM\SECURITY\Policy\
Secrets\$machine.ACC,但是可能导致DC不可预知的异常行为,但是依旧可以登录。只需要运行Impacket的secretsdump脚本就可以让DC的密码有效,这个脚本会通过域的从域中提取所有用户HASH复制DRS协议,包括域管理员HASH(包括krbtgt,可以用来制作金票),然后用来登录DC更新电脑密码注册表,就可以令攻击者成为域管理员。
1.进行 Windows 版本更新并且保持 Windows 自动更新开启,也可以通过下载下面链接中的软件包,手动进行升级。
2.开启的 DC 的强制模式。
看完上述内容,你们掌握怎么进行CVE-2020-1472漏洞分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。