您的位置:首页 > 其它

驱动中如何给ring3层应用程序提权

2013-09-24 23:21 351 查看
为什么会有这个需求就不用我多说了吧:)
目前在驱动中提权我知道的有三种办法
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函数中设置的,如下
 


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  提权 Token bootkit