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

0x00 目录

0x01 介绍

0x02 逆向分析 Win10_x64_20H2

0x03 WinDBG

0x04 参考文章

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

0x01 介绍

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

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

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

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

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

0x02 逆向分析 Win10_x64_20H2

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

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

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

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

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

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

然后就是判断 Control 了,至于是相对位置还是绝对位置与前面文章中的 DACL 是一样的情况,详细可以参考《Windows原理深入学习系列-访问控制列表-关于安全描述符的补充

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

接着调用 RtlFindAceByType 通过类型来寻找我们想要的 ACE,这里所要找的就是 SYSTEM_PROCESS_TRUST_LABEL_ACE_TYPE 了,具体的操作这里就不看了,之前已经分析过了如何取 ACE,如何判断 ACE Type 等等,详细可以参考《Windows原理深入学习系列-访问控制列表

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在一些函数调用中,ClientToken 也被描述为模拟的客户端的 Token,这里也就假设是这样的用处了,如果不是,请大佬们帮忙指出

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

在进行对比的时候就有另外的一个函数来进行了,它会将两个 SID 都传入,然后进行对比,而对比的结果是通过 r8 来接收的

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

在这个函数中,对比逻辑主要就是有 TrustLabel 的大于没有 TrustLabel,PP 保护的大于 PPL,Signer 也是高值大于低值

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

然后再来看判断完以后的情况,先看返回值,确定函数执行成功了,然后再看返回值,因为是从 r8 回来的,所以这里看的就是 var38

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

如果不为零,就说明当前的 Trust 的等级是高于目标的,然后将 arg30 置 -1

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

否则的话,将目标 ACE 的 AccessMask 的第 24 位置 1,通过微软文档可以得知,不管成功与否,当前的访问都是会被审计的

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

0x03 WinDBG

可以通过 WinDBG 来观察到已经被保护的 System Token,先得到安全描述符

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

然后交给 WinDBG 来进行解析

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

0x04 参考文章

1.https://jsecurity101.medium.com/exploring-token-members-part-2-2a09d13cbb3

2.https://www.microsoftpressstore.com/articles/article.aspx?p=2228450&seqNum=3

3.https://elastic.github.io/security-research/whitepapers/2022/02/02.sandboxing-antimalware-products-for-fun-and-profit/article/

4.https://www.elastic.co/cn/blog/protecting-windows-protected-processes

5.https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-seaccesscheck

6.https://docs.microsoft.com/en-us/windows/win32/secauthz/access-tokens

7.https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-privilegecheck

8.https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_security_subject_context

9.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level

10.https://docs.microsoft.com/en-us/windows/win32/secauthz/access-mask

11.https://docs.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa

12.https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags

03-19 11:08