这是[信安成长计划]的第 22 篇文章
0x00 目录
0x01 介绍
0x02 替换 Token
0x03 编辑 ACL
0x04 修改 Privileges
0x05 参考文章
继续纠正网上文章中那些奇怪的情况和问题
0x01 介绍
虽然主题是 Windows 内核提权,但实际上还是对之前文章的一个总结,这篇文章中所用到的东西全都是前几篇文章所提到的知识点,所有的操作都是之前文章中所讲述过的,以下所有的实验都是在 Win10_x64_20H2 上进行的。
0x02 替换 Token
主要原理就是将 System 进程的 Token 替换到我们当前进程的 Token 中
先新起一个 cmd,可以看到当前是普通用户
根据之前的方法找到 Token 位置所存储的值
让 Windbg 自己来解析一下是这样子的
之后以同样的方法取到 System 进程的 Token 位置的内容
可以看到 User 是 S-1-5-18,代表了当前就是 System 账户
然后进行 Token 的替换
再回来执行一下 whoami 可以看到权限已经是 System 权限了
0x03 编辑 ACL
在之前分析 ACL 的时候,我们提到过,如果安全描述符中没有 DACL,即 DACL 为 NULL,Windows 会允许任何用户的完全访问权限。
如果我们对 winlogon 进程的 ACL 进行修改,这样我们就可以用任意进程对其进行注入了,然后派生出来一个 System 权限的进程
首先查看 winlogon 进程的安全描述符
注意这里使用的结构是 _SECURITY_DESCRIPTOR_RELATIVE,而不是 _SECURITY_DESCRIPTOR
然后对其进行修改
可以发现,已经没有了 ACL 的验证,任何人都拥有所有权
然后来尝试注入一下,但是发现并没有成功
这是因为进程的完整性等级检查所导致的,接下来我们对我们自己的 Token 进行修改
在 TOKEN 当中有一个值 MandatoryPolicy,在微软文档中可以看到解释
我们当前的值是 3,然后将其改为 0
然后再次来进行注入,成功了,权限是 System
再插句题外话,在网上找到的资料都是直接干掉了安全描述符,将整个安全描述符都置 NULL 了,说是在低版本的时候还可以,在高版本 Windows 增加了判断的验证,直接修改的话会蓝屏。
这里他们选择直接抹安全描述符的操作我没有理解,按照微软文档所描述的,这些操作是对 DACL 有效的,为什么要直接干安全描述符呢?
所以,一定要自己查资料自己实践,一定要自己查资料自己实践,一定要自己查资料自己实践。
为了能够实现提权操作,就有了第二种方案,直接对 ACE 进行修改,对于查找等各种细节,我们在前面也分析过了,这里直接来进行操作
接下来对其进行修改
这样 SID 就从原来的 S-1-5-18 变成了 S-1-5-11
可以看到已经发生了变化
然后对当前进程的 Token 进行修改
接着再来进行注入,可以发现已经是 System 权限了
0x04 修改 Privileges
其实这个操作在上一篇文章中也已经用到过了
先取出来 System 的 Privileges
再取出我们当前的 cmd 进程的 Privileges
然后将 System 的权限位都直接替换到我们的上面
在修改完成后可以看到权限都已经有了
可以看到有 SeDebugPrivilege 的权限,所以就跟上一篇文章中所提到的是一样的了,可以来注入 winlogon 进程来获得 System 权限
0x05 参考文章
1.https://mp.weixin.qq.com/s/s_3fQYe9rHLYaOuXUqJCgg
2.https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-token_mandatory_policy
3.https://docs.microsoft.com/en-us/windows/win32/secauthz/access-control-lists