一、用戶態隱藏
這是一類簡單的隱藏方法,同時也是相對容易破解的方法。
1、命令替換
替換ps、top、ls等命令的文件,破解方法很簡單,查看文件修改時間和HASH值,如果與默認時間,或正常命令文件的HASH值不符,則被替換。破解方法,傳回來一個正常的文件重新使用命令操作即可
#查看文件狀態 stat filename #計算文件hash值
2、Hook系統調用
Hook系統調用
舉例ps
#ps命令原理: (1)調用openat系統函數獲取/proc目錄的文件句柄 (2)調用系統函數getdents遞歸獲取/proc目錄下所有文件信息(包括子目錄) (3)調用open函數打開/proc/進程pid/stat和/proc/進程pid/status,以及/proc/進程pid/cmdline文件開始獲取進程信息 (4)然后打印輸出
攻擊者可以劫持getdents和libc中的readdir函數(修改內核中的系統調用代碼或者修改lib中的函數代碼)實現過濾特定進程名,從而實現進程隱藏。
備注:getdents函數對應的系統調用是sys_getdents(),readdir函數對應的系統調用是proc_pid_readdir(),跟蹤系統調用可以:
apt-get install sysdig sysdig proc.name=ps
3、劫持lib庫
劫持lib庫
原理解析:利用環境變量LD_PRELOAD或者配置ld.so.preload文件使的惡意的動態庫先於系統標准庫加載,以達到架空系統標准庫中相關函數的目的,最終實現對特定進程的隱藏。
例子參考聊一聊Linux下進程隱藏的常見手法及偵測手段
方法2和方法3的隱藏只要查看/proc下面找到進程相關信息即可。可以寫腳本遍歷/proc/pid下面的cmdline
4、掛載目錄到/proc下
#原理掛載一些空的路徑到/proc對應進程號下面,ps等命令在遍歷/proc時則沒有辦法找到該進程的信息。 # -*- coding:utf-8 -*- import os import time while True: pid = os.getpid() print "start!" os.system("mount /dev/sda1 /proc/%s"%str(pid))#當然也可以使用mount -o bind /empty/dir /porc/xxxx print "end" #time.sleep(1)
對抗方法:cat /proc/mount查看掛載情況
三、內核態隱藏:
1、劫持VFS接口層
proc文件系統也是VFS抽象類的一個具體子類,與其它文件系統不同的是,它是存在與內存中的虛擬文件系統,以文件系統的方式為訪問內核數據的操作提供接口。在執行ps或ls命令時,proc文件系統會調用readdir函數依次遍歷proc目錄下的數字目錄,而readdir又會調用filldir函數返回改數字目錄對應進程的相關信息,因此,只要在filldir函數中增加適當的過濾,就可以實現對進程的隱藏了。
2、劫持系統調用
#如getdents函數對應的系統調用是sys_getdents(),readdir函數對應的系統調用是proc_pid_readdir()
上面兩個方法要么修改內核,要么新增加內核模塊(LKM)。修改內核一般需要重啟,增加內核模塊不需要,所以增加內核模塊更隱蔽一些。
對抗方法:
- 查看內核編譯時間(uname -a)
- 查看內核模塊(lsmod)