在2015年的黑帽大会和DEFCON上,我曾谈过黑客会如何从域用户提权到域管理。
密码的难题
每台Windows主机有一个内置的Administrator账户以及相关联的密码。大多数组织机构为了安全,可能都会要求更改密码,虽然这种方法的效果并不尽如人意。标准的做法是利用组策略去批量设置工作站的本地Administrator密码。但是这样又会出现另一个问题,那就是所有的电脑都会有相同的本地Administrator密码。也就是说,如果获取了一个系统的Administrator认证凭据,黑客就可以获取他们所有机器的管理权限。
SYSVOL
解决办法之一是为认证数据采取SYSVOL,SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。
所有的域组策略存储在:
\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
SYSVOL里的认证
在windows电脑中,管理需要花心思去保证本地Administrator账户(RID 500)。传统的做法(除了购买安全产品),是使用一个自定义的脚本去更改本地Administrator的密码。这样就会出现一个问题,密码肯定会明文存储在SYSVOL的脚本里(比如vbs文件)。比如黑客需要搜寻用来更改本地Administrator密码的VBS脚本,该vbs脚本在Microsoft TechNet gallery上,密码为可见的。这个脚本存在SYSVOL里,每个域用户都有读的权限,且该密码是每台电脑组策略应用的本地Administrator密码。
请不要用这个脚本修改本地Administrator密码。
组策略偏好GPP
在2006年,微软收购了桌面标准的“PolicyMaker”,并重新借此与win2008发布了GPP(组策略偏好)。其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:
映射驱动(Drives.xml)
创建本地用户
数据源(DataSources.xml)
打印机配置(Printers.xml)
创建/更新服务(Services.xml)
计划任务(ScheduledTasks.xml)
更改本地Administrator密码
这对管理员非常有用,因为GPP提供了一个自动化机制,可以作为急需的解决方案(比如脚本)给他们。它提供了有效的方法,利用显式凭据结合组策略部署了计划任务,一次性批量更改了电脑的本地管理的密码,也许这就是最受欢迎的利用场景吧。
GPP中存储的凭据
然而现在有个问题,凭据数据应该怎样保护?
当管理创建了一个新的GPP时,SYSVOL里有一个XML文件提供了相关配置数据。如果里面提供了密码的话,那应该就是AES-256加密,看起来这加密似乎是够强力了。
然而除了在2012年前的某些点外,微软在MSDN上发布了AES的私钥,它可以用来解密这种密码。因为认证用户(所有域用户或者信任域里的用户)对SYSVOL拥有读权限。在域里的任何用户可以搜索SYSVOL共享中的带有cpassword字样的XML文件,里面包含了AES加密的密码。
攻击GPP
当黑客可以访问XML文件时,他能利用AES私钥解密GPP密码。PowerSploit函数Get-GPPPassword对GPP解密会很有帮助。下面的截图,则展示了一个简单的PowerShell函数解密GPP密码的命令(从上述的XML文件里找到的)。
据我所知,GPP凭据问题最早由Emilien Gauralt在他2012年1月的文章《Exploiting Windows 2008 Group Policy Preferences》提出。悲催的是,现在文章链接挂了,里面的内容也没了。在2012年5月,Chris Campbell又写了篇文章《GPP Password Retrieval with PowerShell》,并在里面提出了攻击该密码漏洞的第一段PowerShell代码。并且Chris后来还更新了这段代码,将Get-GPPPassword加入PowerSploit。在2012年6月,Rewt dance写了一篇文《a GPP exploitation expanded reference》,而现在链接已经挂了,这里提供一下Google缓存。此外我还找到篇Alexandre Herzog在2012年4月写的文章《Exploit credentials stored in Windows Group Policy Preferences》。
我已经在文章里讨论过关于GPP凭据的问题和GPP补丁(KB2962486)。
让我们继续在SYSVOL里的组策略XML文件翻找管理凭据(包括域管理凭证),特别是在管理账户环境下运行的计划任务。
GPP凭证补丁(KB2962486)
2014年5月13日,微软发布了MS14-025的补丁KB2962486,即那个GPP导致的权限提升漏洞。这个补丁需要安装在所有使用了RSAT的系统上,防止管理将密码数据放进GPP里。
注意,现在带密码的那些GPP文件还没有从SYSVOL里移除。
GPP利用检查
XML权限拒绝检查:
把新的xml文件放到SYSVOL里,设置拒绝Everyone。
审计访问拒绝错误
如果相关的GPO不存在,那就没有访问的合法原因。
GPP问题的缓解
在每台用于管理GPO的电脑上安装KB2962486补丁,这样会避免新的凭据放进GPP里。
删除现有的GPP里包含密码的xml文件。
微软本地Administrator密码解决方案(LAPS)
微软提供的最好的更改本地Administrator密码的方法,就是本地Administrator密码解决方案(LAPS)。
*参考来源:AD,FB小编dawner编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)