安全應急響應 | 如何從核心中直接獲取隱藏的程序資訊
*本文作者:ForrestX386,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
一、引言
在安全應急響應中,檢視系統程序資訊是必不可少的一個環節,從程序資訊中可以發現異常程序,從而為定位問題系統幫助。但攻擊者也不是傻子,他也知道,不隱藏自身,肯定會很快被發現,於是就衍生了很多程序隱藏技巧,比如利用mout –bind 重新掛載/proc/(詳見: ofollow,noindex" target="_blank">http://www.freebuf.com/network/140535.html ),惡意動態庫劫持過濾指定程序資訊,Hook proc_pid_readdir函式以及proc_pid_lookup函式使得指定程序不會出現在proc檔案系統生成等。
為了能夠找到這些被隱藏的異常程序,本文介紹一個方法,直接從核心模組中獲取最原始的程序資訊,從而使得上述隱藏技巧失效,進而找到異常程序資訊,詳文如下。
二、先來了解一下核心中task_struct結構體資訊
每個程序在核心中都有一個程序控制塊(PCB)來維護程序相關的資訊,Linux核心的程序控制塊是task_struct結構體.
task_struct是Linux核心的一種資料結構,它會被裝載到RAM中並且包含著程序的資訊。每個程序都把它的資訊放在 task_struct 這個資料結構體,task_struct 包含了這些內容:
(1)標示符 : 描述本程序的唯一識別符號,用來區別其他程序。 (2)狀態 :任務狀態,退出程式碼,退出訊號等。 (3)優先順序 :相對於其他程序的優先順序。 (4)程式計數器:程式中即將被執行的下一條指令的地址。 (5)記憶體指標:包括程式程式碼和程序相關資料的指標,還有和其他程序共享的記憶體塊的指標。 (6)上下文資料:程序執行時處理器的暫存器中的資料。 (7) I/O狀態資訊:包括顯示的I/O請求,分配給程序的I/O裝置和被程序使用的檔案列表。 (8) 記賬資訊:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等 ……
因task_struct 內容很複雜,也很多,不是本文論述重點,更多詳情請參考: https://blog.csdn.net/qq_29503203/article/details/54618275
我們感興趣的有:
程序pid: task_struct->pid
父程序pid: task_struct->parent->pid
程序名稱: task_struct->comm
程序執行時間: task_struct->start_time->tv_sec
程序優先順序:task_struct->rt_priority
程序狀態:task_struct->state
通過核心函式for_each_process遍歷所有程序,可以獲取每個程序的task_struct中我們感興趣的成員變數,於是我們可以編寫一個簡單點的核心模組,獲取這些資訊,然後列印到/var/log/message中,詳見0×03
三、手動編寫一個簡單的核心模組獲取隱藏程序資訊
編寫一個簡單的核心模組,程式碼可簡單分為5部分
1)匯入必要的庫檔案,必須有 2)init_module 函式 ,insmod 載入核心模組時執行,在其中呼叫5),必須有 3)cleanup_module 函式, rmmod 解除安裝核心模組時執行,必須有 4)真正工作的函式,必須有 5)版權資訊,可選
注: 2)和3)中
可以通過
module_init( my_module_init ); module_exit( my_module_cleanup );
設定裝載LKM和解除安裝LKM時候的執行的函式(預設是init_module 和cleanup_module )
真正工作的函式程式碼如下:
Makefile程式碼如下:
編譯:
make
insmod get_hide_process.ko即可載入核心(重啟失效)
編譯測試環境:
四、實驗測試
1)隱藏程序
先在一個視窗內開啟ping程序,然後利用技術手段使其隱藏:
2)找出隱藏程序
載入0×03中的核心模組
insmod get_hide_process.ko
然後檢視/var/log/message
找到隱藏的ping程序,這種查詢程序資訊的方式不依賴於proc系統,直接從核心中獲取,比較準確!
五、總結
在安全應急響應中,在其他方法無法獲取幫助的情況下,可以嘗試本文介紹的這個核心模組小工具,不過本文實驗中的模組所獲取的資訊內容還不夠完善,大家有興趣的可以補充一下,比如獲取類似/proc/xx/cmdline 的內容,程序開啟的檔案資訊等(實現同lsof -p xxx的效果)。後續還可以將其包裝成一個使用者空間的工具,不用手動裝載、解除安裝核心模組,這樣使用起來更加方便。本次實驗中關鍵程式碼都已給出,一些無關緊要的程式碼,google search 便知,大家可以動手實驗一下。
*本文作者:ForrestX386,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。