驅動中如何給ring3層應用程式提權

cnbragon發表於2013-09-24

為什麼會有這個需求就不用我多說了吧:)

目前在驅動中提權我知道的有三種辦法

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函式中設定的,如下

 

 

相關文章