这是[信安成长计划]的第 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 是一样的情况,详细可以参考《Windows原理深入学习系列-访问控制列表-关于安全描述符的补充

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0x03 WinDBG

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

然后交给 WinDBG 来进行解析

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

Windows原理深入学习系列-信任等级检查的更多相关文章

  1. Windows原理深入学习系列-强制完整性检查

    这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...

  2. Windows原理深入学习系列-强制完整性控制

    欢迎关注微信公众号:[信安成长计划] 0x00 目录 0x01 介绍 0x02 完整性等级 0x03 文件读取测试 0x04 进程注入测试 0x05 原理分析 Win10_x64_20H2 0x06 ...

  3. Windows原理深入学习系列-Windows内核提权

    这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...

  4. Windows原理深入学习系列-访问控制列表

    这是[信安成长计划]的第 19 篇文章 0x00 目录 0x01 介绍 0x02 DACL 0x03 创建DACL 0x04 文件读取测试 0x05 进程注入测试 0x06 原理分析 Win10_x6 ...

  5. Windows原理深入学习系列-特权

    这是[信安成长计划]的第 21 篇文章 0x00 目录 0x01 介绍 0x02 结构分析 0x03 进程注入测试 0x04 参考文章 0x01 介绍 在 Token 当中还存在一个特别重要的内容-- ...

  6. Windows原理深入学习系列-访问控制列表-关于安全描述符的补充

    这是[信安成长计划]的第 20 篇文章 0x00 目录 0x01 安全描述符的结构 0x02 两个结构的不同点 0x03 真正的查询方案 0x04 参考文章 0x01 安全描述符的结构 在上一篇文章中 ...

  7. Git 之Windows环境下学习系列

    Git .SVN .TFS   相同点 不同点 Git     版本控制 优点: 分布式版本控制.无需联网就能版本提交 开源 缺点 入门学习难度高 SVN   优点: 集中式版本控制. 个人开源 缺点 ...

  8. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  9. 转:深入Java集合学习系列:HashSet的实现原理

    0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...

随机推荐

  1. linux内核中的eventfd

    转载请注明来源:https://www.cnblogs.com/hookjc/ eventfd 在内核版本,2.6.22以后有效.查看内核版本可以用命令 uname -r . [cpp] view p ...

  2. 关于Java的=赋值操作和方法传递对象时的引用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11405920.html 下面通过一段代码和debug结果来展示Java中=操作的赋值改变过程. ...

  3. JS特殊监听方法

    //监听元素变化classList //监听元素变化className //方法一 var tab2Interval = setInterval(function(){ if(!!($('#tab-2 ...

  4. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  5. Java中Arrays数组工具类的使用全解

    本文几乎涵盖了所有的Arrays工具类(基于Java 11)的方法以及使用用例,一站式带你了解Arrays类的用法,希望对大家有帮助. 码字不易,三连支持一下吧 Arrays数组工具类 方法一览表 快 ...

  6. 01 前端基础之HTML

    目录 前端基础之HTML HTML简介 如何创建及展示 head内常见标签 body内基本标签 特殊符号 常见标签 标签的两大重要属性 列表标签 表格标签 form表单(很重要) 初次体验前后端交互 ...

  7. head 插件 Content-Type header [application/x-www-form-urlencoded] is not supported

    { "error": "Content-Type header [application/x-www-form-urlencoded] is not supported& ...

  8. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  9. Large Sacle Distributed Deep Networks

    本文是谷歌发表在NeurIPS 2012上的一篇论文,主要讨论了在几万个CPU节点上训练大规模深度网络的问题,并提出了一个名为DistBelief的软件框架.在该框架下实现了两种大规模分布式训练算法: ...

  10. 攻防世界Web_easytornado

    题目: 解题思路: 题目就三个txt文本文件 , 由python_template_injection这篇随笔中了解到tornado也是python web应用程序模板的一种,应该也是考查模板注入. ...