提升进程权限的内核模式驱动程序
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/ZeroMemoryEx/Tokenizer
Tokenizer
相关技术点
- 进程的访问控制和安全标识符(SID)等信息由进程令牌(token)控制
_EPROCESS是代表进程对象的数据结构,其中的_EX_FAST_REF成员用于储存指向内核对象的指针或引用计数- Windows中不同版本的
_EX_FAST_REF在_EPROCESS中的偏移量不同 - 通过替换进程的令牌实现进程权限提升
项目用途
Tokenizer是一个内核模式驱动程序,可以将进程EPROCESS中的进程令牌替换为系统令牌,从而提升进程的权限。该驱动程序设计用于与用户模式应用程序一起使用,通过IOCTL向驱动程序发送进程ID来实现权限提升。
该技术的主要用途是在需要执行高权限操作的场景中实现权限提升,如在维护和修复系统时,需要对某些进程执行高权限操作,但是这些进程的权限较低,无法完成相关操作,此时可以使用Tokenizer提升其权限。
该项目主要包括以下步骤:
- 通过进程ID获取进程的
_EPROCESS结构体 - 在
_EPROCESS结构体中获取进程令牌的指针 - 将进程令牌替换为系统令牌,实现权限提升
该项目的使用方法包括两种:
- 生成具有高权限的进程
- 提升现有进程的权限
在使用过程中,需要注意不同版本的Windows中_EX_FAST_REF在_EPROCESS中的偏移量不同,如果驱动程序无法正确定位_EPROCESS结构体中的进程令牌,可能会导致系统或目标进程崩溃。
Tokenizer
- Tokenizer是一个内核模式驱动程序项目,允许使用系统令牌替换
EPROCESS中的进程令牌,从而有效提高进程的权限。该驱动程序旨在与通过IOCTL将进程ID发送到驱动程序的用户模式应用程序一起使用。
技术细节
-
当创建进程时,它继承了创建它的用户的令牌,系统使用该令牌确定进程可以执行的操作。令牌包含有关用户安全标识符(SID)、组成员身份和特权的信息。
-
令牌成员位于
_EPROCESS结构中的偏移量0x4b8处,该结构是表示进程对象的数据结构。令牌成员在_EX_FAST_REF结构中定义,它是一个联合类型,可以存储指向内核对象的指针或引用计数,具体取决于指针的大小。_EX_FAST_REF结构在_EPROCESS中的偏移取决于使用的Windows版本,但在最近的Windows版本中通常位于偏移量0x4b8处。

-
x64和x86架构的Windows构建号令牌偏移
x64偏移 x86偏移 0x0160(5.2晚期) 0x0150(3.10) 0x0168(6.0) 0x0108(3.50至4.0) 0x0208(6.1) 0x012C(5.0) 0x0348(6.2至6.3) 0xC8(5.1至5.2早期) 0x0358(10.0至1809) 0xD8(5.2晚期) 0x0360(1903) 0xE0(6.0) 0x04B8 0xF8(6.1) 0xEC(6.2至6.3) 0xF4(10.0至1607) 0xFC(1703至1903) 0x012C 
-
Windows中的
_EX_FAST_REF结构包含三个成员:Object,RefCount和Value

-
要在
_EX_FAST_REF中显示进程令牌,我们传递包含令牌的_EX_FAST_REF结构的地址,该结构通常位于_EPROCESS结构中的偏移量0x4b8处。

用法
-
您可以生成特权进程或提升已存在的进程ID。

-
为了说明这一点,我们将专注于第二个选项并以CMD为例。

-
继承的令牌

-
通过
IOCTL将进程ID发送到驱动程序

-
接收到来自用户模式应用程序的PID后,驱动程序使用它来获取指向目标进程的
_EPROCESS结构的指针。然后,驱动程序访问_EPROCESS结构的令牌成员以获取进程令牌的指针,然后用系统令牌替换它,从而将进程的安全上下文更改为系统的安全上下文。但是,如果驱动程序未正确定位_EPROCESS结构中的令牌成员,或者令牌的偏移量不是0x4b8,则驱动程序可能会崩溃系统或目标进程,这个问题将在后续更新中解决。

-
cmd令牌之后

-
进程特权、组、权限
