為什麼會有這個需求就不用我多說了吧:)
目前在驅動中提權我知道的有三種辦法
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函式中設定的,如下