Rootkit隱藏程序和埠檢測

2022-09-23 18:33:09 字數 4474 閱讀 3627

一、引言

rootkit是一種特殊的惡意軟體,它的功能是在安裝目標上隱藏自身及指定的檔案、程序和網路鏈結等資訊,比較多見到的是rootkit一般都和木馬、後門等其他惡意程式結合使用。

例如:inetd或者login,為攻擊者提供後門;隱藏攻擊者的目錄和程序的程式,ps、netstat等常見命令。

rootkit檢測也成為主機安全一項重要功能,針對rootkit中最常見隱藏程序、埠檢測,主要分為兩種檢測思路,一種基於核心記憶體分析,一種基於應用層分析。

基於記憶體分析rootkit檢測可參考rootkit檢測,該方案缺點是需要增加核心模組,風險高,檢測效果最好。

本文介紹第二種方案,unhide在應用層發現隱藏程序、埠,該方案風險小,可整合到主機安全agent中。

二、應用層隱藏程序檢測

2.1 程序隱藏和檢測方式

程序隱藏兩種方式:

1) 替換ps命令,在讀取/proc/pid目錄時,過濾掉需隱藏程序資訊

2)載入核心模組,通過攔截proc檔案系統的**函式,過濾掉需隱藏程序資訊

檢測核心思想:

通過libc系統函式盲測程序pid的存活狀態,再根據ps結果對比差異,判斷該pid是隱藏程序。

unhide提供如下19種檢測方式,大致可分為四類:一類通過procfs下的程序目錄資訊,第二類通過系統呼叫函式, 第三類通過前兩類組合方式,第四類通過爆力破解(不推薦)。

tab_test[tst_proc].func = checkproc;

tab_test[tst_chdir].func = checkchdir;

tab_test[tst_opendir].func = checkopendir;

tab_test[tst_readdir].func = checkreaddir;

tab_test[tst_getprio].func = checkgetpriority;

tab_test[tst_getpgid].func = checkgetpgid;

tab_test[tst_getsid].func = checkgetsid;

tab_test[tst_getaff].func = checksched_getaffinity;

tab_test[tst_getparm].func = checksched_getparam;

tab_test[tst_getsched].func = checksched_getscheduler;

tab_test[tst_rr_int].func = checksched_rr_get_interval;

tab_test[tst_kill].func = checkkill;

tab_test[tst_noprocps].func = checkallnoprocps;

tab_test[tst_brute].func = brute;

tab_test[tst_reverse].func = checkallreverse;

tab_test[tst_quickonly].func = checkallquick;

tab_test[tst_sys_info].func = checksysinfo;

tab_test[tst_sys_info2].func = checksysinfo2;

tab_test[tst_sys_info3].func = checksysinfo3;

從名字上可以看出,unhide使用chdir,opendir,readdir,getpriority,getpgid,getsid,sched_getaffinity,kill,sysinfo等libc函式。

下面分別從三類中各選擇一種檢測方式分析。

2.2 procfs檢測

抽取checkreaddir檢測分析:

1)遍歷/proc目錄, 子檔名如果是數字,代表是乙個程序pid

2)讀取程序狀態task目錄(/proc/pid/task), 獲取各子執行緒號

3) 通過ps命令查詢是否存在該執行緒

4)對比差異,不存在判斷為隱藏程序

1)procdir = opendir("/proc");

2)dirproc = readdir(procdir));

3)taskdir = opendir(task);

4) dir = readdir(taskdir)

5) checkps(procpids,ps_thread)

該類方法能檢測出第一種隱藏程序方式,對第二種無效。

2.3 syscall檢測

抽取checkgetsid檢測分析:

max_pid通過讀取 /proc/sys/kernel/pid_max獲取:

1)從1到max_pid遍歷程序, 通過getsid返回值和錯誤碼探測程序存活狀態

2)通過ps命令查詢是否存在該程序

3)再次通過getsid確認程序存活狀態,防止在執行ps這時間內,程序退出了

4)對比差異,不存在判斷為隱藏程序

1)ret = getsid(syspids)

2)checkps(syspids,ps_proc | ps_thread);

3)ret = getsid(syspids)

該類方法都能檢測上述兩種隱藏程序方式。

2.4 compund檢測

抽取checkallquick檢測分析:

1)從1到max_pid遍歷程序

2) 通過kill返回值和錯誤碼探測程序存活狀態

3) 通過getpriority返回值和錯誤碼探測程序存活狀態

4) 通過getpgid返回值和錯誤碼探測程序存活狀態

5) 通過getsid返回值和錯誤碼探測程序存活狀態

6) 通過sched_getaffinity返回值和錯誤碼探測程序存活狀態

7) 通過sched_getparam返回值和錯誤碼探測程序存活狀態

8) 通過sched_getscheduler返回值和錯誤碼探測程序存活狀態

9) 通過sched_rr_get_interval返回值和錯誤碼探測程序存活狀態

10) 通過chdir,opendir讀取程序目錄(/proc/pid)

11) 通過ps命令查詢是否存在該程序

12)再次通過kill確認程序存活狀態,防止在執行ps這時間內,程序退出

13)對比差異,只有程序不存在(found=0)或者程序經過11項檢測(found == 11)認為是正常的,其餘都判斷為隱藏程序

ret = kill(syspids, 0);

ret = getpriority(prio_process, syspids);

ret = getpgid(syspids);

ret = getsid(syspids);

ret = sched_getaffinity(syspids, sizeof(cpu_set_t), &mask);

ret = sched_getparam(syspids, ¶m);

ret = sched_getscheduler(syspids);

statusproc = stat(directory, &buffer);

statusdir = chdir(directory);

dir_fd = opendir(directory) ;

checkps(syspids,ps_proc | ps_thread)

ret = kill(syspids, 0);

if (found_killbefore == found_killafter)

三、應用層隱藏埠檢測

核心思想:通過libc系統函式bind,listen盲測埠

3.1 tcp隱藏埠檢測

1)從1到65535遍歷埠

2) 建立乙個基於tcp協議sock_stream的socket

3) 通過bind返回值和錯誤碼探測埠狀態

4) 如果被占用,通過listen 錯誤碼是eaddrinuse確定埠占用

5) 通過ss或netstat命令過濾tcp協議,檢視埠情況

6)對比差異,確認該埠為隱藏埠

socket_desc=socket(af_inet,sock_stream,0);

bind(socket_desc,(struct sockaddr *)&address,sizeof(address));

listen(socket_desc,1);

if(eaddrinuse == errno)

3.2 udp隱藏埠檢測

相比tcp, udp使用sock_dgram的socket, 缺少listen這步,其餘檢測步驟類似

socket_desc=socket(af_inet,sock_dgram,0);

bind(socket_desc,(struct sockaddr *)&address,sizeof(address));

if(eaddrinuse == errno)

四、結論

本文提供的通過應用層方式檢測rootkit中最常見的隱藏程序和埠,風險性小,可無縫整合到主機安全agent中。

Linux幾種檢測rootkit隱藏程序的方法

rootkit通常會隱藏程序,隱藏檔案和網路連線。這裡主要記錄幾種對隱藏程序的檢測方法 一.隱藏程序的方法 1.1 使用者級rootkit 通過ld preload來hook libc庫,從而過濾 proc pid目錄 1.2 核心級rootkit 通過hook系統呼叫getdents getden...

Linux程序隱藏問題 顯示隱藏程序

阿里云云監控到有兩台redis伺服器cpu被某程序消耗400 cpu資源 系統檢視top 情況並未找到高消耗程序x7但cpu100 ni netstat 查詢到了一些異常請求,初步判斷出元件被提權入侵了 嘗試查詢異常程序x7關聯的檔案,排查還在 etc hosts發現增加了如下異常對映,檢視相關異常...

WinNT下 真正隱藏程序

面對眾多的計算機高手,考慮許久,終於還是決定出來獻醜一下,文章內盡量使用最簡潔易懂的詞彙及例子來介紹,希望能夠對一些初學與高階者有所幫助。關於程序的隱藏,98下的例子數不勝數。winnt win2k下的隱藏方法,西祠的高手shotgun在去年的6月就已經在網上發布出例項 揭開木馬的神秘面紗 四 我也...