简介
在为Windows安全对象添加ACL信息时,通常ACL中可选择和显示的都是Windows账户名称,但Windows系统实际是根据SID来识别不同账户的,因此也可以通过账户的SID为索引添加或修改文件ACL。令人意外的是,实际上在添加或修改ACL时可以使用任意的SID值,即使该SID不存在。
01 初期障碍
正常情况下通过GUI添加ACL时,用户无法添加当前主机搜索不到的账户,搜索的范围包含了所有当前主机和所在域的安全账户和账户组,因此无法添加不存在的用户。同时作者能够找到Windows自带的ACL修改工具也都是通过选择的方式添加账户的,所以在编辑ACL时要想使用任意SID,要解决的第一个问题是如何直接写入SID。
C#的库System.Security.AccessControl可以提供对ACL操作的支持,而且可以通过指定SID修改ACL信息,借助该库可以实现ACL注入任意SID。这里需要指出的是,任意SID可以是当前存在或未来会存在的SID,也可以是完全不存在的SID。图中文件夹的安全属性中的包含一条未知账户(S-1-5-21-1337-1337-1337-500)的ACL信息,该SID是一个随意编造的SID。
02 利用方法
1.SID预测
注入任意SID的第一种利用方法是通过预测未来的SID实现权限维持,使用下述powershell命令查看当前域SID的序列。
(([adsisearcher]"(objectSid=*)").FindAll()).Properties.objectsid | ForEach-Object {(New-Object System.Security.Principal.SecurityIdentifier($_,0)).Value}
由于SID为自动编号的值,根据现有的账户SID值加1即为下一个新账户的SID为S-1-5-21-617395494-2047742401-2013338591-1168,在1.txt中为1168写入一条ACL并授予其完全访问控制权限,由于目前该SID的账户还不存在,因此系统无法识别该账户只显示SID。
下面创建一个新的账户占用下一个SID。
在主机上查询一次该SID后,文件的安全属性会发生变化,之前的SID变成刚刚创建的新账户名称。
2.利用已删除账户SID
影子账户是一种比较古老的SID相关攻击,简述一下就是通过将账户A的注册表信息复制到账户B后,操作系统会将账户B当作账户A,账户B就像账户A的影子一样,故称影子账户。
如果把账户A的注册表信息保存下来,然后删除账户B。那么账户A相关的ACL信息都无效,但是只需将账户A的注册表信息复制到账户B,那么原有的账户B会继承账户A的权限。以往这个攻击方法的缺陷是新建的安全对象无法添加已删除账户A的ACL,但是结合任意SID注入ACL可以弥补这个缺点。图中账户bob是已经删除的账户,账户xx3是bob的影子账户,插入账户xx3的信息后显示的是bob的ACL信息。
影子账户结合任意SID注入ACL的利用流程如下
SID History相当于用户的第二个SID,是域环境中的一个传统的权限维持手段。有趣的是,SID History字段也可以写入任意SID。将已删除的SID写入安全对象的ACL中,因为账户被删除ACL无效。然后通过将已删除账户A的SID写入账户B的SID History,则账户B会继承该已删除账户A的权限,使得被删除的ACL成为账户B的ACL。将SID History与任意SID注入可以实现进一步的隐匿,与影子账户的效果类似。图中是成功将一个捏造的SID:S-1-5-21-617395写入账户roast SID History字段。
下面是SID History与任意SID写入ACL结合的示例。在账户test的SID History中写入为账户Bob的SID值S-1-5-21-617395494-2047742401-2013338591-1150。
使用Bob的SID写入文件2.txt的ACL,为Bob添加文件的完全控制权限。
首次查看文件的ACL信息发现同时存在Bob与Test,但是删除账户Bob后由于Bob的SID被写入了Test的SID History,Test继承了原来Bob拥有的ACL。
SID History攻击结合任意SID注入ACL的利用流程如下
03 攻击利用面
1.权限维持
在AD域中结合对活动目录注入任意SID的ACL可以实现权限维持,具体的活动目录对象和权限可以根据自身的需求选择,以下是几个示例:
1.高权限组如Domain Admins组的账户CreateChild权限,可将任意账户添加为域管理员
2.域的DS-Replication-Get-Changes、DS-Replication-Get-Changes-All和DS-Replication-Get-Changes-In-Filtered-Set权限,可以进行DCSync攻击
3.任意域管理员账户的User-Force-Change-Password权限,可直接重置域管理员的密码
这里以添加DCSync权限为例,首先为未来账户RID1170的账户添加该权限,添加成功后查看发现ACL中显示未知账户
下一步进行测试,新建一个账户1170以启用该SID,再次查看ACL信息发现账户为现有账户
使用刚创建的账户1170进行DCSync,成功获得administrator账户的密码
2.不死马
除了权限维持之外,利用该攻击还能够实现不死马,操作方法和效果如下:
1.在木马文件中插入未知SID的ACL信息
2.删除文件的继承权限
3.删除其他SID的ACL信息
4.修改文件的所有者
完成上述操作后,该文件无法被任何人查看修改或删除。只有当插入的SID生效时才能显示所有者,通过控制插入SID的账户可以操作该文件。
但是该文件并非真正的不死马,因为在Windows系统中本地管理员可以强制修改文件的所有者,一旦成为了文件的所有者就可以查看和编辑ACL信息。
04 总结
本文主要介绍了ACL中的SID任意注入攻击的利用方法和攻击利用面。但是SID的利用方法可能不止目前提到的两种,其攻击利用面也不只局限于活动目录和文件。希望本文能起到抛砖引玉的作用,帮助其他安全研究员发现新的有效攻击方法。
绿盟科技天元实验室专注于新型实战化攻防对抗技术研究。
研究目标包括:漏洞利用技术、防御绕过技术、攻击隐匿技术、攻击持久化技术等蓝军技术,以及攻击技战术、攻击框架的研究。涵盖Web安全、终端安全、AD安全、云安全等多个技术领域的攻击技术研究,以及工业互联网、车联网等业务场景的攻击技术研究。通过研究攻击对抗技术,从攻击视角提供识别风险的方法和手段,为威胁对抗提供决策支撑。
M01N Team公众号
聚焦高级攻防对抗热点技术
绿盟科技蓝军技术研究战队
官方攻防交流群
网络安全一手资讯
攻防技术答疑解惑
扫码加好友即可拉群