一、域委派
首先了解一下什么是委派,委派即委托安排,我把这件事委托给你做了。域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动
委派主要分为非约束委派(Unconstrained delegation)和约束委派(Constrained delegation)两个方式,还有一种是基于资源的约束委派(Resource Based Constrained Delegation),这样主要讲解非约束委派攻击。
域委派的由来
在Windows 2000 Server首次发布Active Directory时,Microsoft必须提供一种简单的机制来支持用户通过kerberos向web server进行身份验证并需要代表该用户更新后端数据库服务器上的记录的方案。这通常称为"kerberos双跳问题",并且要求进行委派,以便web server在修改数据库记录时模拟用户。
这里说的"以便web server在修改数据库记录时模拟用户" 需要如何理解?
我自己理解的是就比如数据库中的相关数据需要修改,如果此时如果是让当前的web server的服务账户去进行修改的话,那么也就无法记录到到底是谁去修改了这个数据,此时如果出了问题就不知道该去问谁了,这种业务情况下就可能就是需要委派这种功能来进行解决,那么委派之后的情况就是,让当前的web server的服务账户去操作,但是web server同样带有客户的信息,在修改相关数据的时候,用的是对应客户操作者的记录。
为什么要域委派
为什么需要域委派呢,比如现在有web服务器和文件服务器,当用户A访问web服务器去请求某个资源时,web服务器上本身并没有该资源,所以web服务器就会从文件服务器上调用这个资源,其中发生的过程若以域委派的形式进行,那么就是:
用户A访问web服务器,服务器再以用户A的身份去访问文件服务器。
域委派流程
一个域内普通用户jack通过Kerberos协议认证到前台WEB服务后,前台运行 WEB服务的服务账号websvc模拟(Impersonate)用户 jack,以Kerberos 协议继续认证到后台服务器,从而在后台服务器中获取jack用户的访问权限,即域中单跳或者多跳的Kerberos认证。——> Kerberos 认证学习
流程
- 域内用户 jack 以 Kerberos 方式认证后访问 Web 服务器;
- Web服务以websvc服务账号运行,websvc向KDC发起jack用户的票据申请;
- KDC检查websvc用户的委派属性,如果被设置,则返回jack用户的可转发票据 TGT;
- websvc收到jack用户TGT后,使用该票据向KDC申请访问文件服务器的服务票据ST;
- KDC检查websvc的委派属性,如果被设置,且申请的文件服务在允许的列表清单中,则返回一个jack用户访问文件服务的授权票据 ST;
- websvc收到的jack用户的授权票据ST后,可访问文件服务,完成多跳认证。
域委派的用户
在域内的可以委派的账户有两种一种是主机账户(Net Computer),活动目录中的computers组内的计算机,也被称为机器账号。,如下图
另一种是用 setspn手动添加的服务账户(Net User)。简单来说,服务账号(Service Account),域内用户的一种类型,服务器运行服务时所用的账号,将服务运行起来并加入域。例如MS SQL Server在安装时,会在域内自动注册服务账号SqlServiceAccount,这类账号不能用于交互式登录,也就是说无法通过SqlServiceAccount来通过3389进行rdp登录
委派类型
前文已经提到,域内委派主要有3种应用方式:
一是非约束性委派(Unconstrained Delegation),服务账号可以获取某用户的TGT,从而服务账号可使用该TGT,模拟用户访问任意服务
二是约束性委派(Constrained Delegation),即Kerberos的扩展协议 S4U2Proxy
,服务账号只能获取某用户的ST,从而只能模拟用户访问特定的服务
委派原理学习
非约束性委派的原理是:用户想访问服务A,于是向KDC提交认证,KDC发现A是非约束性委派,会把TGT放在ST中一并给用户。然后用户用这个ST去访问服务A,服务A就相当于获得了用户的TGT,把TGT放入lsass进程,然后就可以拿着用户的TGT以用户的身份去访问该用户权限能够访问的服务了
- 当服务账号或者主机被设置为
非约束性委派
时,其userAccountControl属性会包含TRUSTED_FOR_DELEGATION
- 当服务账号或者主机被设置为约束性委派时,其userAccountControl属性包含
TRUSTED_TO_AUTH_FOR_DELEGATION
,且msDS-AllowedToDelegateTo属性会包含被约束的服务
二、非约束委派攻击
当user访问service1时,如果service1的服务账号或者主机开启了(非约束委派),则当user访问service1时会将user的TGT发送给service1并保存在内存中以备下次重用,然后service1就可以利用这张TGT以user的身份去访问域内的任何服务(任何服务是指user能访问的服务),如果这里的user是域管理员用户,那么我们便能够得到该用户的TGT
非约束委派的攻击方法中有两种:
- 设置主机账户为非约束委派,通过域管理账户对该主机账户进行访问,留下票据在该主机账户下,然后拿该票据去写入内存,从而可以利用域管理的TGT去访问域控。
- 设置服务账号为非约束委派,通过域管理账户对该服务进行访问,留下票据在该主机账户下,然后拿该票据去写入内存,从而可以利用域管理的TGT去访问域控。
以下委派攻击实验基于将主机账户设置为非约束委派
环境要求
- 域:test.lab
- 域控:10.10.0.2 win2016,账号 administrator,主机名DC
- 域内主机:10.10.0.4 win7 ,账号 yuwin7,主机名admin-PC
1. 开启yuwin7主机账号的委派属性
对yuwin7主机账号开启了委派属性,若我们拿下yuwin7这台机器并且有域账户,域控访问了该机器则可以进行攻击。
但是在实战中,只是单纯的非约束委派话需要管理员主动连接比较鸡肋。因此可以利用非约束委派 + Spooler打印机服务可以强制指定的主机进行连接。
利用原理:利用Windows打印系统远程协议 (MS-RPRN)
中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)
方法强制任何运行了 Spooler 服务的计算机以通过Kerberos或NTLM对攻击者选择的目标进行身份验证
注:splooer服务是默认运行的
攻击过程
攻假设击者控制一个开启了非约束委派的主机账户,当域控开启Print Spooler服务时,攻击者可以主动要求域控访问该主机服务器,进而获取DC的TGT
- 拿下一个具有Kerberos非约束委派的主机(主机账户)
- 找到一台运行Print Spooler服务(默认为自启而且为System权限)的DC
- 管理员身份使用Rubeus的监听模式
以下委派攻击实验基于将主机账户设置为非约束委派
使用adfind查找非约束委派的主机
Adfind 下载地址:https://www.softpedia.com/get/Programming/Other-Programming-Files/AdFind.shtml
查询非约束委派的主机:
AdFind.exe -b "DC=test,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询非约束委派的用户:
AdFind.exe -b "DC=test,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
1. 查询非约束委派的主机
可以看到 admin-PC 这个主机就是域内⾮约束委派主机!而admin-PC就是本机的主机名。查找⾮约束委派⽤户的⼯具还有很多!例如 Adfind、ldapdomaindump、PowerView … 等等。
Rubeus监听
win7上以本地管理员运行Rubeus
Rubeus.exe monitor /interval:1 /filteruser:DC$
# 我们可以用Rubeus来监听Event ID为4624事件,这样可以第一时间截取到域控的TGT
# /interval:1 设置监听间隔1秒
# /filteruser 监听对象为我们的域控,注意后面有个$,如果不设置监听对象就监听所有的TGT
利用打印服务强制让域控机向本机验证身份
下载spoolsample.exe,此程序运行需要.net4。win7以当前域用户身份运行。注意win7需要关闭防火墙,不然接收不了ticket
spoolsample.exe DC admin-PC
# 表示利用打印服务强制让域控机向admin-PC主机验证身份,这样我们的Rubeus就可以监听到TGS了
此时Rubeus已经接收到了TGT
提取TGT
我们先复制Rubeus监听到的TGT的base64,这里每行都加了换行,我们用这个python脚本去掉每行的换行符
然后直接用powershell
转到为正常的TGT
即可
注入TGT票据到当前会话并导出域控中所有用户的hash
mimikatz以域用户身份运行
这儿请注意,我们这儿获得的TGT票据,不能算黄金票据,因为我们获得的权限只是域控的本地管理权限,所以不能连接域控,但是我们确可以因此获取所以用户的hash,所以能制作真正的黄金票据~
制作黄金票据
既然存在krbtgt用户,并且有该用户的hash或者NTML值,可以用它生成黄金票据
1. 获取本账号的sid
现在本机执行 whoami /user,注意不需要后面表示账号权限的几位数
2. 制作票据
3. 注入票据
mimikatz "kerberos::purge" "kerberos::ptt ntlm.kirbi"
此时已经可以连接域控了
我们还可以直接用psexec
反弹shell
,因为注入了黄金票据,所以不需要用户名和密码