0x01 定位特权用户的用意在域 网络攻击的场景中,如果攻击者攻击获取了域内一个支点,为了获取域管理员权限,实现对域网络的整体控制,攻击者下一步的 目标往往是搜集域内信息,追踪域内特权用户、域管理组用户的历史登录位置、当前登录位置等,为精确攻击获取域管理权限做准备。
例如,如果攻击者从当前支点上获取了一个本地管理员账号的口令散列值,而该账号很有可能是预装系统时保留的账号。此时攻击者可以使用PTH(Pass The Hash)方式,登录域内同类型的系统,逐台搜索,以找到特权用户的登录痕迹,从而获取特权用户的口令散列值,精准定位特权用户的作用显而易见。微软在2014年发布了KB2871997和KB2928120两个补丁,用来阻止域内主机本地用户的网络登录,本地用户的PTH方式已经死掉。
0x02 筛选本地管理员组中的域用户本地用户的PTH方式已死,但域用户的PTH方式仍然有效。在许多情况下,为了方便用户使用,许多企业网络通过组策略,将一些普通域用户添加为登录主机的本地管理员组。如果那些主机中存在特权用户或者管理员组用户的登录痕迹,则有较大的概率获取这些用户的口令散列值,向获取最终的域管权限推进一大步。 在这种场景下,从当前支点出发,到获取特权用户口令散列值的路径包括3步: 1、哪些域用户被设置成为域内主机的本地管理员组成员。获取普通域用户的口令或散列值的概率远高于高权限用户,例如采用社工等方式; 2、哪些域内主机被设置为添加域内用户到本地管理员组; 3、获取第2步结果中主机的用户登录历史记录及会话信息有哪些,是否包含特权用户或管理组成员; 4、利用第1步中的用户登录第3步中筛选出有高权限登录记录或会话的主机,获取高权用户的口令散列值。 第1、2步骤主要依靠读取、分析域策略实现。域内所有组策略对所有域用户开放读权限。因此我们只要枚举这些域策略、筛选规则,找到这些组策略应用的域对象,将组策略与域对象的组信息、组内成员信息进行关联,即可得出结论。 组策略存放在$GPOPath\MACHINE\Microsoft\windows NT\SecEdit\GptTmpl.inf文件和$GPOPath\MACHINE\Preferences\Groups\Groups.xml文件中。在实验环境中,我们添加了一个名叫LocalAdmin的组策略,将reduser用户添加到登录主机的本地管理员组。 上图是Groups.xml的内容截图。下图则是组策略的设置选项中更友好地展示组策略的截图,2张图表示同一个组策略。 系统自带的GroupPolicy模块提供了Get-GPOReport命令,可将GUID参数的组策略转换为友好界面的XML或者HTML报告,截图如下。因此我们可以方便地对XML报告进行离线批量处理,快速获取我们想要的结果。GroupPolicy模块在域服务器中默认有,如果想在Windows 7等客户端系统中调用该模块,需要安装GPMC。 在实际的网络攻击中,在网络支点中安装GPMC还是有一定的困难。PowerView提供了类似的更为强大的功能,Get-DomainGPOLocalGroup命令,枚举分析所有的组策略,可方便得出结果。 Get-DomainGPOLocalGroup的原理是仅分析GptTmpl.inf文件中是否存在特权组的变动,这种方式会存在一定的缺陷。 在本文测试的组策略例子中,有2种方式可以让当前登录用户成为登录主机的本地管理员组。组策略编辑位置分别是“主机配置\首选项\控制面板设置\本地用户和组”、“用户配置\首选项\控制面板设置\本地用户和组”。使用第2种方式设置时GptTmpl.inf文件不存在,所以运行Get-DomainGPOLocalGroup没有结果。而使用第1种方式设置时,GptTmpl.inf存在,所以有运行结果,如下图。后续我将在此基础上,进行改进。 Get-DomainGPOComputerLocalGroup则是通过枚举分析所有的组策略,找出哪些主机被设置添加指定域用户到本地管理员组,这里不再演示。
0x03 获取指定主机的登录记录、会话、分组信息上一节的第3步是针对域内指定主机或服务器,在普通权限下远程获取登录用户记录、当前会话、组及成员等信息,目前已经有许多方法和工具可供大家参考,这些工具分别基于C、Python、Ruby等语言,使用方便,小巧简单。PowerView提供了多个PowerShell命令,可方便地获取域内主机中的登录用户记录和会话信息、组信息等。下图是演示Get-NetLocalGroup命令,远程获取组成员的结果截图。图中可以看到在net use为空的情况下,通过Get-NetLocalGroup命令可直接获取域内远程主机win7x86cn(本机为Win7Sp1x8602)的本地管理组成员。在一般的企业网络中,往往主机非常多,逐个查询的效率比较低,可以使用脚本循环调用Get-NetLocalGroup命令来查询。Invoke-EnumerateLocalAdmin命令实现了类似的功能,可以从文件中读取主机列表,以指定的线程数目并行扫描探测,效率较高,这里不再演示。
0x04 小结本文介绍了的远程主机登录记录、会话、分组等信息的方法,以及通过域策略的查找可加入主机本地管理员组的域用户的方法,在很多攻击场景都非常实用。而且在分析域网络的防护策略等方面也有很大的帮助。
0x05 参考文献[1] http://www.harmj0y.net/blog/redteaming/pass-the-hash-is-dead-long-live-localaccounttokenfilterpolicy/ [2] https://msdn.microsoft.com/en-us/library/windows/desktop/ff182374(v=vs.85).aspx [3] https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1 [4] https://github.com/Veil-Framework/Veil-Pillage/blob/master/modules/enumeration/host/user_hunter.py [5] https://docs.microsoft.com/zh-cn/sysinternals/downloads/psloggedon [6] https://github.com/pentestgeek/smbexec/blob/master/lib/modules/enumeration/checkda.rb [7] http://www.harmj0y.net/blog/redteaming/local-group-enumeration/
|