本文作者:hl0rey(信安之路作者团队成员 & 信安之路红蓝对抗小组组长) 招新文章:信安之路红蓝对抗小组招募志同道合的朋友
前几天看到了老外一篇讲 mimikatz 防御的文章,感觉行文思路还不错,但是内容稍有不足,国内也有一篇翻译,但是只是照着错误翻译的,所以就萌生了把那篇优秀文章,翻译复现,并加入其它一些内容,本文只是抛砖引玉,文中有错误的话,欢迎吐槽。
mimikatz 在内网渗透中是个很有用的工具。它可能让攻击者从内存中抓到明文密码。大家都知道这个工具很厉害,微软肯定也知道了,所以就搞了一些安全防护机制让 mimikatz 抓不到密码。但是在 win2008 之前的系统上还是能抓到密码的。一般情况下,只要有本地管理员权限就能从内存中抓出密码。通常抓到密码之后就可以进行横向移动和提权。
Debug Privilege
在 windows 里,调试权限可以用来调试进程,甚至是调试内核。对于 mimikatz 来说,通常套路来说,他想去读取内存就得获取调试权限,然后去打开进程。默认情况下,本地管理员组是由这个权限的。但是,除非管理员是个程序员,一般他应该用不到这种权限。
本地安全策略是默认给管理员组权限的。
然而,域的默认组策略在这一项是没有定义的。
按照 windows 策略的效力位阶,最终是管理员组拥有该权限。
补充下效力位阶:
代码语言:javascript复制默认情况下,多条策略不冲突的情况下,多条策略是合并的关系;如果冲突的话,优先级高的适用,优先级从低到高为local policy(本地)->site policy(站点)->domain policy(域)->ou policy(组织单元)
不同配置对 mimikatz 的影响
默认情况下,成功取得调试权限。
把拥有调试权限的组设置为空。注销再次登陆。
运行 mimikatz,获取调试权限失败。
WDigest
WDigest 协议早在 xp 时代就已经引入了。当时这个协议设计出来是把明文密码存在 lsass 里为了 http 认证的。默认在 win2008 之前是默认启用的。那么攻击者就能从中获取到明文。
但是在 win2008 之后的系统上,默认是关闭的。如果在 win2008 之前的系统上打了 KB2871997 补丁,那么就可以去启用或者禁用 WDigest,配置如下键值:
代码语言:javascript复制HKEY_LOCAL_MACHINESystemCurrentControlSetControlSecurityProvidersWDigest
UseLogonCredential 值设置为 0, WDigest 不把凭证缓存在内存;UseLogonCredential 值设置为 1, WDigest 就把凭证缓存在内存。
不同配置对 mimikatz 的影响
启用缓存,直接抓明文,很舒服。
关了缓存之后,重启再抓,什么东西也没抓到。
Credential Caching
Domain Cached Credentials 简称 DDC,也叫 mscache。有两个版本,XP/2003 年代的叫第一代,Vasta/2008 之后的是第二代。
计算机在加入域之后就得通过 kerberos 进行认证,通过 kerberos 认证就得有域控的参与,但是如果域成员暂时无法访问到域控的话,岂不是无法认证了?域凭证缓存就是为了解决这个问题的。如果暂时访问不到域控,windows 就尝试使用本机缓存的凭证进行认证,默认缓存十条。
缓存位置(默认本地管理员也没有权限访问):
代码语言:javascript复制HKEY_LOCAL_MACHINESECURITYCache
修改组策略缓存条数为0,即为不缓存。
不同配置对 mimikatz 的影响
默认配置缓存 10 条。登陆本地管理员,提权到 system 权限,然后运行 mimikatz,成功抓到 mscachev2。
设置缓存数为 0,停掉域控,然后再登陆域账号。域成员发现无法登陆了。
登陆本地管理员账号,提取到 system,然后什么也没抓到。
Protected Users Group
受保护的用户组,可以用来让像本地管理员这样的高权限用户只能通过 kerberos 来认 证(真是六的一比)。这是在 win2012 之后引入的一个新的安全组(win2008 之前的系统打了 KB2871997 补丁也会增加这个安全组)。来防止明文存储在内存中和 ntlm hash 泄露(因为是通过 kerberos 认证所以也就不会泄露 net ntlm hash 了)。这个配置起来比较简单。把想要保护的用户加入这个组就行了(由于本机硬件限制,没法复现了,跑一个 win2016,再跑一个 win10 就已经卡的不行了)。
Restricted Admin Mode
受限管理员模式,反正就是一种安全措施,让你的账户不暴露在目标系统里。在 win8.1/win2012r2(切记是 R2)引入。win7/win2008 想用这个功能就得打 KB2871997、KB2973351。这项功能的使用需要客户端和服务端相互配合。在服务端开启的方法是在注册表添加如下键值。
代码语言:javascript复制REG ADD "HKLMSystemCurrentControlSetControlLsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
右键->关于,查看下客户端的版本是不是 rdp8.1 版本。
潜在风险-RDP PTH
受限管理员模式可以直接用当前登录凭据进行登录,所以这“始终要求凭据”的勾肯定不能勾。
代码语言:javascript复制sekurlsa::pth /user:<username> /domain:<comptername or ip> /ntlm:<ntlm hash> "/run:mstsc.exe /restrictedadmin"
domain 位置用计算机名或者ip皆可。(需要管理员权限来获取 debug 权限)
一路确定下去就 OK 了。
成功把域控上的管理员顶了。
顺道抓包看一下貌似只有RDP的流量。
总结
1、禁止调试权限对获取 system 的攻击者来说没有任何作用。
2、WDigest 默认是禁用的,但是我们手动打开,挖个坑等人跳。
3、mscache 目前貌似只能用 hashcat 来破解,破出明文再利用。
4、Protected Users Group 需要再研究研究,等电脑配置好了再说 23333。
5、Restricted Admin Mode下pth 攻击只能适用于特定版本,限制还是比较多的,如果限制比较狠的内网(把135和445的流量都禁了),这个算是个突破手法吧。
参考资料
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