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

0x00 目录

0x01 介绍

0x02 替换 Token

0x03 编辑 ACL

0x04 修改 Privileges

0x05 参考文章

继续纠正网上文章中那些奇怪的情况和问题

0x01 介绍

虽然主题是 Windows 内核提权,但实际上还是对之前文章的一个总结,这篇文章中所用到的东西全都是前几篇文章所提到的知识点,所有的操作都是之前文章中所讲述过的,以下所有的实验都是在 Win10_x64_20H2 上进行的。

0x02 替换 Token

主要原理就是将 System 进程的 Token 替换到我们当前进程的 Token 中

先新起一个 cmd,可以看到当前是普通用户

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

根据之前的方法找到 Token 位置所存储的值

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

让 Windbg 自己来解析一下是这样子的

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

之后以同样的方法取到 System 进程的 Token 位置的内容

可以看到 User 是 S-1-5-18,代表了当前就是 System 账户

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

然后进行 Token 的替换

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

再回来执行一下 whoami 可以看到权限已经是 System 权限了

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

0x03 编辑 ACL

在之前分析 ACL 的时候,我们提到过,如果安全描述符中没有 DACL,即 DACL 为 NULL,Windows 会允许任何用户的完全访问权限。

如果我们对 winlogon 进程的 ACL 进行修改,这样我们就可以用任意进程对其进行注入了,然后派生出来一个 System 权限的进程

首先查看 winlogon 进程的安全描述符

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

注意这里使用的结构是 _SECURITY_DESCRIPTOR_RELATIVE,而不是 _SECURITY_DESCRIPTOR

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

然后对其进行修改

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

可以发现,已经没有了 ACL 的验证,任何人都拥有所有权

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

然后来尝试注入一下,但是发现并没有成功

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

这是因为进程的完整性等级检查所导致的,接下来我们对我们自己的 Token 进行修改

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

在 TOKEN 当中有一个值 MandatoryPolicy,在微软文档中可以看到解释

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

我们当前的值是 3,然后将其改为 0

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

然后再次来进行注入,成功了,权限是 System

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

再插句题外话,在网上找到的资料都是直接干掉了安全描述符,将整个安全描述符都置 NULL 了,说是在低版本的时候还可以,在高版本 Windows 增加了判断的验证,直接修改的话会蓝屏。

这里他们选择直接抹安全描述符的操作我没有理解,按照微软文档所描述的,这些操作是对 DACL 有效的,为什么要直接干安全描述符呢?

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

所以,一定要自己查资料自己实践,一定要自己查资料自己实践,一定要自己查资料自己实践。

为了能够实现提权操作,就有了第二种方案,直接对 ACE 进行修改,对于查找等各种细节,我们在前面也分析过了,这里直接来进行操作

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

接下来对其进行修改

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

这样 SID 就从原来的 S-1-5-18 变成了 S-1-5-11

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

可以看到已经发生了变化

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

然后对当前进程的 Token 进行修改

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

接着再来进行注入,可以发现已经是 System 权限了

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

0x04 修改 Privileges

其实这个操作在上一篇文章中也已经用到过了

先取出来 System 的 Privileges

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

再取出我们当前的 cmd 进程的 Privileges

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

然后将 System 的权限位都直接替换到我们的上面

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

在修改完成后可以看到权限都已经有了

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

可以看到有 SeDebugPrivilege 的权限,所以就跟上一篇文章中所提到的是一样的了,可以来注入 winlogon 进程来获得 System 权限

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

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

03-15 13:27