这是[信安成长计划]的第 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 的描述就是有这两种