内网渗透攻击技术的利用
DCSync 是什么
在域环境中,不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
DCSync 是域渗透中经常会用到的技术,其被整合在了 Mimikatz 中。在 DCSync 功能出现之前,要想获得域用户的哈希,需要登录域控制器,在域控制器上执行代码才能获得域用户的哈希。
2015 年 8 月,Benjamin Delpy(神器 Mimikatz 的作者)和 Vincent Le Toux 发布了新版本的 Mimikatz,新增加了 DCSync 功能。该功能可以模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希。该功能最大的特点就是不用登陆域控制器,即可远程通过域数据同步复制的方式获得域控制器上的的数据。
注意:DCSync 攻击的对象如果是只读域控制器 (RODC),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的。
在默认情况下,只有 Administrators、Domain Controllers 和 Enterprise Domain Admins 组内的用户有权限使用 DCSync,但我们可以对域内普通用户添加 ACL (Access Control List) 实现普通用户也能调用 DCSync 功能。
2021最新整理网络安全\渗透测试/安全学习(全套视频、大厂面经、精品手册、必备工具包)一>点我<一
利用 DCSync 导出域内哈希
当我们获取相应的权限后,可以利用 DCSync 功能导出域内用户的哈希值。其原理就是利用 DRS (Directory Replication Service)协议通过 IDL_DRSGetNCChanges 从域控制器复制用户哈希凭据。获得了域内用户的哈希后可以进一步利用。
通过 Mimikatz
在获取权限的域成员主机上执行如下:
如上图所示,成功获取 Administrator 用户的 NTLM 哈希。
通过 Secretsdump.py
Secretsdump.py 是 Impacket 框架中的一个脚本,该脚本也可以通过 DCSync 技术导出域控制器上用户的哈希。该工具的原理是首先使用提供的用户登录凭据通过 smbexec 或者 wmiexec 远程连接至域控制器并获得高权限,进而从注册表中导出本地帐户的哈希,同时通过 Dcsync 或从 NTDS.dit 文件中导出所有域用户的哈希。其最大的优点是支持从域外的计算机连接至域控制器。
使用方法如下:
通过 PowerShell
该脚本可以通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 DCSync 功能
在获取权限的域成员主机上执行如下命令即可:
利用 DCSync 制作黄金票据
在域渗透中,我们可以通过 DCSync 导出域控制器中 krbtgt 账户的哈希,并利用 krbtgt 账户的哈希制作黄金票据。
测试环境如下:
假设攻击者已经拿下了内网主机 Windows 10,下面演示如何在内网中利用 DCSync 制作黄金票据来访问 DC 上的资源。
拿下 Windows 10 主机之后,我们加载 kiwi 模块:
load kiwi
然后通过kiwi_cmd
执行 Mimikatz 命令,使用 Mimikatz 的 DCSync 功能导出域控制器中 krbtgt 账户的哈希:
然后我们便可以通过 krbtgt 账户的哈希生成黄金票据了:
执行后生成的票据会咱是存放在你的 Kali 上,然后执行以下命令,清空目标主机上的票据:
kerberos_ticket_purge
最后使用kerberos_ticket_use
注入刚才生成的票据即可:
kerberos_ticket_use gold.tck
如上图所示,票据成功注入。此时,攻击者就可以利用 Windows 7 任意访问域控上的资源了:
dir \\DC\c$
有了黄金票据之后的操作就简单了,懂得都懂!
利用 DCSync 进行域内权限维持
我们前面说了,要想利用 DCSync 功能,得要拥有 Administrators、Domain Controllers 或 Enterprise Domain Admins 组内的用户权限。但是我们就不能让普通域用户拥有 DCSync 的操作权限吗?当然可以!
当我们获得了域内管理员权限后,我们可以修改域内普通用户的权限,使其具有 DCSync 操作权限,那么普通域用户也能导出域内用户的信息了,这样可以可以做一个隐蔽的后门进行权限维持。具体做法就是为普通域用户添加三条 ACE 访问控制项:
DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes(GUID:89e95b76-444d-4c62-991a-0facbeda640c)
我们可以通过 Empire 框架中的 PowerView.ps1 脚本实现:
此时域用户 whoami 便具有了 DCSync 权限。之后便可以用这个 whoami 用户的权限进行 DCSync 攻击了。
我们可以利用 whoami 用户的身份,通过 Secretsdump.py 的 DCSync 功能导出 DC 上的用户哈希。
还可以先使用runas
实现登录 whoami 用户,然后再使用 DCSync。
首先执行以下命令弹出一个 whoami 用户登录权限的 CMD:
runas /noprofile /user:whoamianony\whoami cmd
然后在弹出的 CMD 中执行 Mimikatz 进行 DCSync 即可:
同样,也可以先使用 PowerShell 实现登录 whoami 用户,然后再使用 DCSync。
首先执行以下命令弹出一个 whoami 用户登录权限的 CMD:
然后再弹出的 CMD 中执行 Mimikatz 进行 DCSync 即可:
查询域内具有 DCSync 权限的用户
我们可以使用 Adfind 来查询域内具有 DCSync 权限的用户:
使用机器账户(MachineAccount)实现 DCSync
MachineAccount 即机器账号、计算机账号,是每台计算机在安装系统后默认生成的帐户。所有加入域的也主机都会有一个机器用户,用户名为机器名加$
,如:WIN7$
、WINXP$
。
计算机帐户的密码存储在注册表中的位置为:
如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的 NTDS.dit 活动目录数据库文件中。计算机帐户的密码默认每 30 天自动更新,密码长度为 120 个字符,所以即使我们获得了计算机帐户密码的哈希值,也几乎无法还原出计算机帐户的明文口令。
要使用机器账户实现 DCSync,首先要做的就是获取机器账户身份的权限,然后再利用机器账户的身份进行 DCSync 操作。下面进行具体的演示。
首先获取 MachineAccount 的密码哈希
可以直接在域控上使用 Mimikatz 通过注册表文件导出当前计算机帐户的密码哈希。
也可以在域成员主机上利用 DCSync 导出所有计算机帐户的密码哈希。
然后使用 MachineAccount 进行 DCSync
有了机器账号的密码哈希后,我们需要想办法登录到这个机器账号,由于无法破解哈希,我们可以使用白银票据的方法。
利用方式如下:
也可以通过 secretsdump,使用机器账户的哈希从域外的计算机连接至域控制器导出哈希:
注意:如果使用域内普通计算机帐户的密码哈希连接对应的计算机,那么会失败。
DCSync 的防御
DCSync 攻击的原理是模拟域控制器与域控制器之间的数据同步复制。最好的防御方法是给控制器设置白名单,将可信任的资产设置在允许同步的白名单内。
除此之外,我们还应尝试枚举 Active Directory 中所有用户的 ACL 查询出所有特权帐户,检测域内被添加 DCSync 权限的用户。Github 上有一个项目 ACLight便提供了这样的功能,只需执行项目中的 Execute-ACLight2.bat,便会生成以下三个文件:
Privileged Accounts - Layers Analysis.txt
Privileged Accounts Permissions - Final Report.csv
Privileged Accounts Permissions - Irregular Accounts.csv
文件中会显示出所有特权帐户。
评论