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 是一样的情况,详细可以参考《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
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
12.https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags
Windows原理深入学习系列-信任等级检查的更多相关文章
- Windows原理深入学习系列-强制完整性检查
这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...
- Windows原理深入学习系列-强制完整性控制
欢迎关注微信公众号:[信安成长计划] 0x00 目录 0x01 介绍 0x02 完整性等级 0x03 文件读取测试 0x04 进程注入测试 0x05 原理分析 Win10_x64_20H2 0x06 ...
- Windows原理深入学习系列-Windows内核提权
这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...
- Windows原理深入学习系列-访问控制列表
这是[信安成长计划]的第 19 篇文章 0x00 目录 0x01 介绍 0x02 DACL 0x03 创建DACL 0x04 文件读取测试 0x05 进程注入测试 0x06 原理分析 Win10_x6 ...
- Windows原理深入学习系列-特权
这是[信安成长计划]的第 21 篇文章 0x00 目录 0x01 介绍 0x02 结构分析 0x03 进程注入测试 0x04 参考文章 0x01 介绍 在 Token 当中还存在一个特别重要的内容-- ...
- Windows原理深入学习系列-访问控制列表-关于安全描述符的补充
这是[信安成长计划]的第 20 篇文章 0x00 目录 0x01 安全描述符的结构 0x02 两个结构的不同点 0x03 真正的查询方案 0x04 参考文章 0x01 安全描述符的结构 在上一篇文章中 ...
- Git 之Windows环境下学习系列
Git .SVN .TFS 相同点 不同点 Git 版本控制 优点: 分布式版本控制.无需联网就能版本提交 开源 缺点 入门学习难度高 SVN 优点: 集中式版本控制. 个人开源 缺点 ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 转:深入Java集合学习系列:HashSet的实现原理
0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...
随机推荐
- 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件
一.数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度. · 用Java写一个冒泡排序算法 · 描述一下链式存储结构. · 如何遍历一棵二叉树? · 倒排一个LinkedList. · 用 ...
- opencv笔记-SimpleBlobDetector
通用的 Blob 检测方法包括:Laplacian of Gaussian(LoG), Difference of Gaussian(DoG), Derterminant of Hessian(DoH ...
- Elasticsearch 7.12 启用 x-pack 组件
文章目录 修改配置文件 设置密码 使用密码 首先,你要有一套es,关于es的部署,可以看我的另一篇博客 ELK-EFK-v7.12.0日志平台部署 $ ./bin/elasticsearch-plug ...
- 聊聊几个阿里 P8、P9 程序员的故事
大家好,我是对白. 阿里 P8 程序员年薪百万已经是公开的秘密了,有人关心他们年薪百万,而我更加关注阿里这些 P8.P9 程序员的成长故事,在聊这些大牛的故事之前,跟大家稍微简单聊下阿里技术人等级制度 ...
- 关于Windows安装两个不同版本的MySQL详细步骤
关于Windows安装两个不同版本的MySQL详细步骤 安装两个不同版本的数据库原因 由于大部分教程所使用的数据库为5.7版本,而我之前安装的是8.0版本. 在一些特殊情况下,低版本数据库不能动,高版 ...
- 阿里云K8S节点NotReady状态
开发部署pod的时候在wayne平台上部署不上去,删除也删除不了 先删除 kubectl delete pod pod-name --grace-period=0 --force 删除之后然后部署新的 ...
- Spring-servlet随笔1
一:工程思想 1.建立父工程 2:导入通用依赖 3:删除无用文件 4:创建不同模块. pom.xml 依赖文件: <dependencies> <dependency> ...
- BugKu-baby_flag.txt
下载zip压缩包解压得到图片(你们不要再打啦!hhh)使用winhex或者010查看,最下面看到一串数字 怀疑可能是十六进制转换字符串,然后使用在线网站进行转换,得到一串base64编码, 再进行ba ...
- golang监听rabbitmq消息队列任务断线自动重连接
需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...
- 【C#硬件角度理解代码】函数
函数的执行过程