在近期所进行的安全审计活动中,我们的团队设计出了一种新的安全工具,并希望能跟整个社区一起分享。
当时在进行安全审计开始前,我们首先需要尝试获取到客户网络系统的初始访问权。这位特殊的客户之前曾投入过大量的人力和物力资源来提升企业网络系统的安全性。在客户域名系统中的大多数客户都需要进行智能卡认证,并且禁用了凭证缓存(Mimikatz的sekurlsa::logonPasswords无效),而且还设置了基于主机的日志记录系统(Powershell, Sysmon, HIPS)。
在进行了仔细分析之后,我们把注意力放在了一台更有“价值”的服务器上。这台服务器之所以“有价值”,是因为拥有高等级权限的网络管理员需要使用这台服务器来执行管理员任务。我们成功在这台服务器上发现了一个0 day漏洞,并且通过手动编码的形式设计出了漏洞利用代码,最终成功拿到了SYSTEM权限。
有了SYSTEM权限之后,我们就能够伪装成一些经常会登录目标系统的用户了,比如说通过注入用户进程或直接窃取他们的用户令牌。虽然这种技术可以有效实现提权和横向渗透,但是它要求我们能寻找到活动会话才能实现身份伪装。因此,这个过程可能需要我们等待用户登录才能实现提权,当他们注销账号之后,我们就无法使用他们的账号了。所以,这种技术只能用来寻找那些使用账号凭证登录的用户信息,而无法适用于采用智能卡认证的情况。
不过幸运的是,客户的活动目录在安装和配置时使用的是多个高等级权限的服务账号,而且涉及到域中的多台服务器。这些域服务账号使用了账号凭证来实现登录认证。Windows会在注册表HKLM:\Security\Policy\Secrets中为每一个服务的域服务账号服务账号存储一个加密后的凭证在lsadump::secrets module(Mimikatz)的帮助下,我们能够直接解密这些凭证。
接下来,我们的主要问题就变成了如何找出目标域服务账号下运行了那些服务组件:我们是对每一个系统手动运行mimikatz,还是在收集到系统信息和注册表键内容后在线下执行分析?虽然这并不是一个技术难点,但是我们很懒,能自动化完成的我们肯定不会手动进行。下面的截图显示的是mimikatz导出的每一个服务账号的凭证信息:
假设我们的工具运行在一台登录了管理员权限账号的目标主机上,我们将能够利用Win32 API来远程查询目标主机中运行的服务。我们可以通过解析服务启动名称来判断当前运行环境是否为系统级账号。如果确定了运行环境,我们就可以使用远程注册表API来存储系统信息和注册表信息了。接下来,在拿到相关注册表键之后,我们可以使用mimikatz来对其进行解析和解密,并获取到服务账号凭证。需要注意的是,我们之所以采用C++来开发这款工具,主要也是考虑到之后可以轻松将其以模块的形式整合进原生的C2框架之中。
不过我们得承认,这款工具只适用于这种特定情况,在其他特殊情况下该工具可能无法完成你所要求的任务。但不管怎样,它都能够帮助你远程扫描出整个目标域中域服务凭证的明文文本信息,这一点还是非常有用的。如果你对本项目感兴趣的话,欢迎到我们的GitHub上留言或提交代码。
serviceFu:【点击底部阅读原文获取】
*参考来源:securifera,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM