为什么会有这个需求就不用我多说了吧:)
目前在驱动中提权我知道的有三种办法
1.
该方法来源于stoned bootkit,主要原理是把services.exe的EPROCESS中的Token值取出来,直接赋值给需要提权的应用程序,
这种方法需要硬编码,并且有较大的机率蓝屏。主要是因为Token值会被释放和DeReference
2.
在进程创建时,使用
ZwOpenProcess、ZwOpenProcessTokenEx、ZwDuplicateToken和ZwSetInformationProcess(ProcessAccessToken)来把具有管理员权限
的token赋值给需要提权的程序
遗憾的是,在vista以后,微软限制了这种方法,会返回0xc00000bb,即STATUS_NOT_SUPPORTED
具体原因还需进一步分析
3.
第三种方法是前面两种的结合,主要原理是先把token duplicate出来,然后再通过硬编码偏移,把token赋值给需要提权的程序
Token在EPROCESS中定义为
//
// Security.
//
EX_FAST_REF Token;
EX_FAST_REF的定义如下:
typedef struct _EX_FAST_REF {
union {
PVOID Object;
#if defined (_WIN64)
ULONG_PTR RefCnt : 4;
#else
ULONG_PTR RefCnt : 3;
#endif
ULONG_PTR Value;
};
} EX_FAST_REF, *PEX_FAST_REF;
从这个结构体当中取Object,可以参考如下的函数
NTKERNELAPI
PVOID
FORCEINLINE
ExFastRefGetObject (
__in EX_FAST_REF FastRef
)
/*++
Routine Description:
This routine allows the caller to obtain the object pointer from a fast
reference structure.
Arguments:
FastRef - Fast reference block to be used
Return Value:
PVOID - The contained object or NULL if there isn't one.
--*/
{
return (PVOID) (FastRef.Value & ~MAX_FAST_REFS);
}
MAX_FAST_REFS值为7
在win7 sp1下面,调用NtSetInformationProcess(ProcessAccessToken)会走到如下的代码
在PspAssignPrimaryToken函数中,在如下代码处跳走了,导致返回status_not_supported错误码
edi是EPROCESS, 这里是判断EPROCESS的PrimaryTokenFrozen字段值是否为真,如果为真,则出错
这个标志位是在PspUserThreadStartup函数中设置的,如下