最近我读到了一篇关于mimikatz防御的外文文章,文章的结构和思路让我印象深刻,但内容上有些许不足。国内也有一篇翻译,但似乎只是机械地照搬原文,存在一些错误。因此,我决定重新翻译并补充一些内容。本文旨在抛砖引玉,如果有任何错误,欢迎批评指正。
在内网渗透中,mimikatz是一个非常有用的工具。它可以从内存中提取明文密码。大家都知道这个工具的威力,微软也意识到了这一点,因此开发了一些安全防护措施来阻止mimikatz获取密码。然而,在Windows 2008之前的系统上,mimikatz仍然能够获取密码。通常情况下,只要拥有本地管理员权限,就可以从内存中提取密码。获取密码后,攻击者可以进行横向移动和提权。
在Windows系统中,调试权限(Debug Privilege)可以用来调试进程,甚至是内核。对于mimikatz来说,要读取内存,通常需要获取调试权限,然后打开进程。默认情况下,本地管理员组拥有这种权限。然而,除非管理员是程序员,否则他们通常不会使用这种权限。
本地安全策略默认情况下会赋予管理员组调试权限。
然而,域的默认组策略在这方面未作定义。
根据Windows策略的优先级,最终结果是管理员组拥有调试权限。
补充一下策略的优先级:
在没有冲突的情况下,多条策略是合并的关系;如果有冲突,优先级高的适用,优先级从低到高依次为:本地策略(Local Policy)->站点策略(Site Policy)->域策略(Domain Policy)->组织单元策略(OU Policy)
不同配置对mimikatz的影响:默认情况下,可以成功获取调试权限。
将拥有调试权限的组设置为空后,注销并重新登录。
运行mimikatz后,获取调试权限失败。
WDigest协议早在Windows XP时代就已引入。当时,该协议设计为将明文密码存储在lsass进程中,用于http认证。在Windows 2008之前的系统上,默认是启用的,因此攻击者可以从中获取明文密码。
但在Windows 2008及之后的系统上,默认是关闭的。如果在Windows 2008之前的系统上应用了KB2871997补丁,就可以启用或禁用WDigest,配置如下:
HKEY_LOCAL_MACHINESystemCurrentControlSetControlSecurityProvidersWDigest
将UseLogonCredential值设置为0,WDigest不会将凭证缓存到内存中;将UseLogonCredential值设置为1,WDigest会将凭证缓存到内存中。
不同配置对mimikatz的影响:启用缓存后,直接可以抓取明文密码,非常方便。
关闭缓存后,重启系统,再次尝试抓取,什么也没抓到。
Credential Caching域缓存凭证(Domain Cached Credentials,简称DDC),也称为mscache。有两个版本:XP/2003时代的第一代和Vista/2008之后的第二代。
计算机加入域后,需要通过Kerberos进行认证,而Kerberos认证需要域控制器的参与。但如果域成员暂时无法访问域控制器,认证将无法进行。域凭证缓存就是为了解决这一问题。如果暂时无法访问域控制器,Windows会尝试使用本地缓存的凭证进行认证,默认缓存10条。
缓存位置(默认情况下本地管理员也没有权限访问):
HKEY_LOCAL_MACHINESECURITYCache
将组策略中的缓存条数设置为0,即不缓存。
不同配置对mimikatz的影响:默认配置缓存10条。登录本地管理员账户,提权到系统权限,然后运行mimikatz,成功抓取到mscachev2。
将缓存数设置为0,停止域控制器,然后再次尝试登录域账户。域成员发现无法登录。
登录本地管理员账户,提取到系统权限,然后什么也没抓到。
受保护的用户组(protected Users Group)可以防止高权限用户(如本地管理员)使用除Kerberos之外的认证方式(这真是太好了)。这是Windows 2012之后引入的一个新安全组(Windows 2008之前的系统应用KB2871997补丁后也会增加这个安全组)。它可以防止明文存储在内存中和NTLM哈希泄露(因为使用Kerberos认证,所以不会泄露Net-NTLM哈希)。配置非常简单,只需将需要保护的用户添加到该组即可(由于本地硬件限制,无法复现,需要在Windows 2016和Windows 10上运行,但性能不足以支持)。
受限管理员模式(Restricted Admin Mode)是一种安全措施,可以防止账户凭证在目标系统中暴露。这是在Windows 8.1/Windows Server 2012 R2(请注意是R2版本)中引入的。Windows 7/Windows Server 2008要使用此功能,需要应用KB2871997和KB2973351补丁。此功能的使用需要客户端和服务器端的相互配合。在服务器端启用的方法是在注册表中添加如下键值:
REG ADD "HKLMSystemCurrentControlSetControlLsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
右键->关于,查看客户端版本是否为RDP 8.1。
潜在风险-RDP PTH:受限管理员模式可以使用当前登录凭据进行登录,因此“始终要求凭据”的选项绝对不能勾选。
sekurlsa::pth /user:<username> /domain:<computername or ip> /ntlm:<ntlm hash> "/run:mstsc.exe /restrictedadmin"
domain位置可以使用计算机名或IP地址。(需要管理员权限来获取调试权限)
一路确认后即可成功。
成功将域控制器上的管理员账户顶替。
顺便抓包查看,似乎只有RDP流量。
总结:
- 禁止调试权限对获取系统权限的攻击者没有任何作用。
- WDigest默认是禁用的,但我们可以手动启用,作为一个陷阱。
- mscache目前似乎只能通过hashcat破解,破解出明文后再利用。
- 受保护的用户组需要进一步研究,等待硬件配置提升后再进行。
- 受限管理员模式下的PTH攻击只能适用于特定版本,限制较多。如果内网环境限制严格(例如禁用了135和445端口的流量),这可能是一种突破手段。
参考资料