Author:小离-xiaoli
• 前几天看群友们讨论的时候,讨论到了某攻击队打了zerologon,没恢复DC的密码导致脱域
• 脱域的原因一般是DC密码滞空后,AD里面存储的机器密码和lsass存储的密码不一致(摘抄自安全客),导致后面kerbero解密票据不可用,到信任中断
• 恢复脱域的机器,需要还原机器密码回去,目前没看到一键利用的工具,从实现zerologon到自动恢复DC机器账户密码,想着没啥事,也就写写脚本吧,因此有了本文
• 1、zerologon攻击目标DC,此时DC机器账户密码为空
• 2、使用滞空后的DC机器账户验证登陆上ldap服务,获取域管
• 3、使用NTDSDump 导出域管凭据(DRSUAPI - DCSync)
• 4、使用获取到的域管凭据,登录上DC进行LSADump(bootkey + security),导出机器账户原先的密码
• 5、使用获取到的域管,走DCERPC(NetrServerPasswordSet2)恢复DC密码
• 1、第一步:从项目https://github.com/dirkjanm/CVE-2020-1472 开始改造,只需要zerologon和恢复密码的脚本,然后稍做修改,封装一下成为我需要的模块
• 2、第二步,我们需要使用滞空后的DC机器账户验证上ldap服务,这里写了个例子,如下所示
ldap 过滤语句如下所示,我们这里取DA + EA组内,已经启用的用户,但是这里有个弊端,后续会讲searchFilter = f"(&(|(memberof=CN=Domain Admins,CN=Users,{baseDN})(memberof=CN=Enterprise Admins,CN=Users,{baseDN}))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
• 3、第三步,我们到这里就需要开始用DC空密码机器账户做DCSync,这一步也没什么讲的,我们从secretsdump.py里面学习,取我们需要的模块即可,主要就是这个NTDSDump模块
• 我们可以简化第二步,其实在上一年的更新中,impacket的secretsdump.py就已经支持ldap语法过滤用户了
• 因此在使用NTDSDump模块的时候,我们可以初始化ldapconnection,编写好ldap过滤,并且传入到NTDSDump里面,此时效果如下
• 4、第四步,这时候我们要用上面获取到的域管凭据去做LSADump,导出security里面存储的机器账户密码(plain_password_hex),我们只需要用到impacket的LSASecrets模块
• 在此之前,我们需要验证域管凭据可不可用,再返回可用的用户,过滤掉一些例如密码过期之类的用户
• 效果如下,这里我们只需要取一个可用的域管账户凭据即可
• 5、第五步:最后调用dirkjanm的还原密码脚本,使用上面排查过可用域管凭据+上面获取到的hex strings即可恢复DC机器账户的密码
• 6、完整效果如下
• 项目地址:https://github.com/XiaoliChan/zerologon-Shot
• 也许有Bug,但是我实战还没测试过,也请勿用于实战 : ),目标挂了与本人无关
• 相关资料:
• https://github.com/fortra/impacket
• https://github.com/dirkjanm/CVE-2020-1472
• [ZeroLogon的利用以及分析-安全客 - 安全资讯平台 (anquanke.com)] - https://www.anquanke.com/post/id/219374