这是[信安成长计划]的第 24 篇文章
0x00 目录
0x01 介绍
0x02 逆向分析 Win10_x64_20H2
0x03 总结
0x04 参考文章
最近因为一些事情,拖更了三个周,大家见谅啊,后面还会开始一些其他的系列内容,还等着大家来捧场了。
现在我们接着之前的进度,继续完成 Windows 原理的学习。
在刚开始的时候,我们介绍了强制完整性控制的机制,这次就来看一下在实际的权限检查当中是如何进行的。
0x01 介绍
这次也还是接着上一次的 ObpGrantAccess 函数往后分析了,根据名字也很容易能够判断出这里的作用
不清楚为什么从 ObpGrantAccess 分析的,可以去看一下上一篇文章的介绍部分
0x02 逆向分析 Win10_x64_20H2
在进入函数以后,就是一堆保存堆栈、赋值等等操作
紧接着会有一些权限的判断,这些也暂时不是现在的关键
接着判断 SACL 中是否有有效内容,获取前的最后的判断
然后就是我们非常熟悉的内容了是否是相对地址,忘记这块内容的可以参考之前关于访问控制列表的文章
获取到完整性等级相关的 ACE
接着就从 ACE 当中获取到需要的内容
紧接着就是我们非常熟悉的函数 SepCopyTokenIntegrity,这个在刚开始分析强制完整性控制的时候有分析过
它的主要操作就是根据 Token 中的 IntegrityLevelIndex,从 UserAndGroups 当中得到当前的完整性等级
然后就是最关键的比较了,对两个 Sid 进行比较
根据分析可以知道 r12 就是通过 SepCopyTokenIntegrity 从当前的 Token 中取出的完整性等级信息
另一个 rbp,就是从 SACL 当中取出来的完整性等级
r12 的来源就是当前上下文的 Token 信息
而 SACL 的来源并不在当前,一直往前追,可以看到它是从 SeAccessCheck 的 rcx 当中来的,根据描述也能明白这个是被访问对象的信息
这样也就基本完成了对完整性信息的检测,对于 RtlEqualSid 函数,之前也进行过分析,这里也就不再提及了
0x03 总结
在之前我也一直有一个疑问,我刚开始是通过 SepCopyTokenIntegrity 来得到进程的完整性等级的,但是为什么网上有很多的资料都说完整性等级是存储在 SACL 当中的。
从这里也就可以得知,两个取出来的都是完整性等级信息,不过它们所代表的情况是不一样的。
在进行权限验证的时候,会通过 SepCopyTokenIntegrity 取出当前的完整性等级,然后从目标对象的 SACL 当中获得目标的完整性等级,然后进行相应的判断和验证。
0x04 参考文章
1.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-token_mandatory_policy
2.https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-seaccesscheck
3.https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_security_descriptor
4.https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/security-descriptor-control
5.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-ace_header