驱动中如何给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函数中设置的,如下
目前在驱动中提权我知道的有三种办法
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函数中设置的,如下
相关文章推荐
- 提权,以MySQL之名
- 利用for命令提权的方法分享
- 提权函数之RtlAdjustPrivilege()使用说明
- SQL 提权 常用命令
- linux提权用的一个技巧
- PHP令牌 Token改进版
- 防止aspxspy木马列服务 iis信息 执行命令提权等操作
- 简单提权
- Linux内核高危漏洞,一个命令可以***所有Linux系统
- linux本地自动溢出获取root权限工具
- 编译器(解释器)编写指南-编写编译器(解释器)的工具-LEX
- struts中的令牌token
- Unable to add window -- token null is not for an applica a042 tion 的解决办法
- C语言中#号的使用
- 密钥文件snk
- Dnt Restful API
- SOCKET编程
- memcache 使用
- 关于那个计算器编译器的问题
- 获取所有进程的映像路径以及命令行参数