Windows原理深入学习系列-信任等级检查

这是[信安成长计划]的第 23 篇文章

0x00 目录

0x01 介绍

0x02 逆向分析 Win10_x64_20H2

0x03 WinDBG

0x04 参考文章

在之前的时候,一直以为 SACL 只是单纯用来审计的,但是在分析的时候发现并不完全是这样,他还有一些其他的作用

0x01 介绍

根据资料可以发现,对于权限的检查是在 ObpGrantAccess 函数当中完成的

图片

在之前的文章中,我们知道了在进行权限检查的时候,会先进行完整性等级的检查,然后再检查 ACL,但是在跟入函数以后,发现了在之前还有其他的检测行为,会先进行信任等级的检查

图片

而在其中进行取值的时候是从 SACL 当中取值的,这也就打破了我们之前对于 SACL 仅作为审计用的印象

0x02 逆向分析 Win10_x64_20H2

在进入函数后,首先会获取 TrustLabel 的 ACE

图片

通过往上追,可以发现传入的参数是 SecurityDescriptor 类型的

图片

根据微软文档可以知道,这是被访问者的安全描述符

图片

然后就是判断 Control 了,至于是相对位置还是绝对位置与前面文章中的 DACL 是一样的情况,详细可以参考《》

图片

接着调用 RtlFindAceByType 通过类型来寻找我们想要的 ACE,这里所要找的就是 SYSTEM_PROCESS_TRUST_LABEL_ACE_TYPE 了,具体的操作这里就不看了,之前已经分析过了如何取 ACE,如何判断 ACE Type 等等,详细可以参考《》

图片

在找到以后,还会再进行依次判断,如果有效就直接返回,也就是找到了

图片

如果是没有找到的情况的话,从刚开始也就不跳转了,直接返回的是零了

图片

接下来就回到主函数了,如果没有找到也就直接退出了,这里假设它已经找到了

这里面还会涉及到一些其他的操作,暂时先不考虑这些内容,所以后面的一些跳转也就省略不看了,这些操作也都是成对的,刚开始有申请,退出时有释放

图片

接下来会取当前的安全主体的上下文,用来跟目标的安全等级进行对比了,这里取出了 Token,但是有 PrimaryToken 和 ClientToken 之分

图片

根据后面逻辑的分析,如果没有 ClientToken,就会直接用 PrimaryToken 来进行比较,如果有的话,会先进行 ClientToken 比较,当 PrimaryToken 的 TrustLevelSid 大于 ClientToken 后,才会再进行 PrimaryToken 与 目标等级的对比,否则就会使用 ClientToken 与目标等级进行对比

但是 ClientToken 又是什么东西呢,猜测可能与 Impersonation 有关系

图片

因为对于 Token 的描述就是有这两种

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdzff.html