🥝 内网 | mimikatz 攻与防

  • Naykcin
  • 7 Minutes
  • February 2, 2020

🥝 内网 | mimikatz 攻与防

📍

内网渗透时通常利用 mimikatz 从内存中抓取到明文密码之后,就可以进行横向移动和提权操作了,进行更一步的渗透。最近跟一些甲方公司的面试官交流之后,想着从攻与防的角度记录一下 mimikatz 的利用与防御。

Debug Privilege 调试权限

一般情况下,只要拿到本地管理员的权限就可以从内存中抓取密码,这是因为在 Windows 本地安全策略中,有一项策略名为「调试权限」,该权限可以用来调试进程,而本地管理员组默认是有这个权限的。如果目标本地管理员平常用不到该权限,且安全意识较高,删去了该权限的话,mimikatz 就抓不到密码了。

Screenshot 2020-03-01 下午6.59.07

本地管理员组默认是具有此权限的

但是,域的默认组策略在这一项是没有定义的。按照 Windows 策略的效力位阶,最终是管理员组拥有该权限。

多条策略不冲突的默认情况下,多条策略是合并的关系;如果冲突的话,优先级高的适用,优先级从低到高为 local policy(本地)👉🏻 site policy (站点)👉🏻 domain policy(域)👉🏻 ou policy(组织单元)

Screenshot 2020-03-01 下午7.16.58

默认情况下可成功取得调试权限

Screenshot 2020-03-01 下午7.18.36

删去该权限后,获取调试权限失败

Credential Caching

_Domain Cached Credentials_,简称 DDC,也叫 _mscache_,域缓存凭据。

它是缓存在机器本地注册表中的域凭据 + 域授权信息。计算机加域之后就会开始进行 kerberos 认证,其中必须要有 KDC 的参与。例如在一家公司中,某员工使用的办公笔记本加了公司的域,那么它一直是用域账号登录此机器,尝试登录时将由 KDC 来进行验证,验证通过后就可登录该笔记本。但是有时候如果遇到了断网的情况,却依然可以登录该笔记本,也就是说此时验证身份时不与 KDC 交互,那么是谁负责验证输入的域账号密码是否正确呢?这就是 _mscache_,Windows 尝试使用本机缓存的凭证进行认证,默认缓存十条。超过十个之后,新凭据会覆盖旧凭据。

mscache 有两个版本,XP/2003 是第一代,Vista/2008 之后是第二代。

缓存位置(默认本地管理员也没有权限访问)
HKEY_LOCAL_MACHINE\SECURITY\Cache

mscache 中的内容

我们比较关心的内容有:

Screenshot 2020-03-01 下午7.48.51

// mimikatz 执行
lsadump::cache

导出 mscache 需要 system 权限,抓到的值是 _mscacheV2_,不可直接利用,需要用 hashcat 或 john 破解。

当缓存数设置为 0 时(即不缓存),可以在一定程度上防御 mimikatz 的攻击。

Protected User Group

受保护的用户组,这是在 Windows Server 2012 之后引入的一个新的安全组,用来让本地管理员这种高权限用户只能通过 Kerberos 来认证(Windows Server 2008 之前的系统打了 KB2871997 补丁也会增加这个安全组)。来防止明文存储在内存中和 Net-NTLM Hash 泄露:由于通过 Kerberos 认证,所以不会泄漏 Net-NTLM Hash。

Protected User Group 的权限限制
* 不能通过 NTLM 协议进行认证
* 不能在 Kerberos 域认证中使用 DES 或 RC4 这种弱加密算法
* 不能被 Kerberos 委派或者非约束委派
* Kerberos TGT 默认为 4 小时,4 小时后就要重新认证

将需要保护的用户直接拉入该组即可,一定程度上可以防御 mimikatz 攻击。

WDigest

WDigest 协议在 Windows XP 就已经引入了,该协议被设计出来是把明文密码存在 lsass.exe 里,用来进行 http 认证。默认在 Windows Server 2008 之前是默认启用的,在此之后默认是关闭的。

如果在 server 08 之前的系统打上了 KB2871997 补丁,那么就可以去启用或禁用 WDigest。

配置如下键值:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest

当把 UseLogonCredential 的值设置为 0,WDigest 不会将凭证缓存在内存;如果设置为 1,则会进行缓存,通过 mimikatz 可直接抓取明文密码。

// mimikatz

privilege::debug
sekurlsa::wdigest

Restricted Admin Mode

在 NTLM 协议中,是存在中间人攻击的。通过 RDP 中间人攻击可获取到登录用户的密码,说明在认证过程中客户端输入的密码在登录过程中是会传输至服务器的。

受限制管理员模式,使账户不暴露在目标系统里,也就是不会传送可被解密的明文密码。在 Windows 8.1/Windows Server 2012 R2(⚠️ 注意是 R2)中被引入。Windows 7/Windows Server 2008 需打补丁 KB2871997、KB1973351。此策略需要客户端和服务端相互配合。

在服务端输入以下命令在注册表添加键值:

REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

后记

记录几点 Tricks:

参考

https://labs.portcullis.co.uk/tools/freerdp-pth/
https://blogs.technet.microsoft.com/kfalde/2013/08/14/restricted-admin-mode-for-rdp-in-windows-8-1-2012-r2/
http://wwwtt0401.blog.163.com/blog/static/361493062012010114020272/
https://medium.com/blue-team/preventing-mimikatz-attacks-ed283e7ebdd5
https://mp.weixin.qq.com/s/O1PUlffIbAh3trnB-YDZaw