1.命令替換
實現方法
替換系統中常見的進程查看工具(比如ps、top、lsof)的二進制程序
對抗方法
使用stat命令查看文件狀態並且使用md5sum命令查看文件hash,從干凈的系統上拷貝這些工具的備份至當前系統,對比hash是否一致,不一致,則說明被替換了。
注:需要在bin目錄下執行。
2.Hook系統調用
以ps 工作原理為例說明這些進程信息查看工具的原理
我們知道/proc是一個虛擬文件系統,是VFS的一個實現形式,/proc中包含了內核信息,硬件信息,進程信息等,ps等工具就是通過分析/proc文件系統中進程相關目錄的信息獲取進程信息匯總。HooK系統調用型的進程隱藏方式都是通過攔截或者迷惑ps等工具從/proc獲取分析結果的過程,而不是針對/proc/文件系統生成本身。
ps 首先會調用openat 系統函數獲取/proc目錄的文件句柄,然后調用系統函數 getdents 遞歸獲取/proc目錄下所有文件信息(包括子目錄),然后開始open函數打開/proc/進程pid/stat,/proc/進程pid/status, /proc/進程pid/cmdline 文件開始獲取進程信息,然后打印結果。
原理:
(1)調用openat系統函數獲取/proc目錄的文件句柄
(2)調用系統函數getdents遞歸獲取/proc目錄下所有文件信息(包括子目錄)
(3)調用open函數打開/proc/進程pid/stat和/proc/進程pid/status,以及/proc/進程pid/cmdline文件開始獲取進程信息
(4)然后打印輸出
攻擊者可以劫持getdents和libc中的readdir函數(修改內核中的系統調用代碼或者修改lib中的函數代碼)實現過濾特定進程名,從而實現進程隱藏。
實現方法:
劫持getdents 等系統調用函數或libc中的readdir 函數等系統調用函數一般來說有3個途徑:
(1)修改內核調用,比如getdents 的源碼
(2)修改libc庫中readdir 函數的源碼
(3)利用環境變量LD_PRELOAD 或者配置ld.so.preload文件以使得惡意的動態庫先於系統標准庫加載,以達到架空系統標准庫中相關函數的目的,最終實現對特定進程的隱藏。
備注:getdents函數對應的系統調用是sys_getdents(),readdir函數對應的系統調用是proc_pid_readdir(),
對抗方法:
使用sysdig(有開源版,可以監控ps等的調用過程,觀察是否有惡意動態庫被加載。strace有類似功能)或者prochunter(google 上search)
sysdig proc.name=ps
上述命令可以查看進程的整個啟動過程,可以分析是否被劫持。
安裝方法
#導入draios源 rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo #裝包 yum -y install kernel-devel* dkms sysdig
安裝后如果報錯如下:
則需執行:
sudo sysdig-probe-loader
3.利用mount命令進行掛載
這個幾乎是最常用的實現方式,利用mount命令將磁盤掛在到proc文件夾下的特定位置即可隱藏進程。
我們知道ps、top等工具會讀取/proc目錄下獲取進程信息,如果將進程ID的目錄信息覆蓋,則原來的進程信息將從ps的輸出結果中隱匿。
實現方法
- 查看進程
我們先使用ps查看python進程,這時候發現有一個pid為5400的python3的進程。 - 掛載磁盤到指定位置
我們根據ps的原理可知,ps查詢的是proc文件夾下的內容,我么直接將磁盤掛在到proc文件夾下的5400即可實現對5400進程的隱藏。
首先使用df
命令查看磁盤:
此時我們在用ps命令查看,發現5400進程已經消失了,達到了隱藏的效果:
對抗方法
使用cat /proc/$$/mountinfo 或者cat /proc/mounts 查看是否有利用mount -bind 將其它目錄或文件掛載至/proc下的進程目錄的情況,如下圖所示,選中部分即為掛載情況:
使用umount /dev/vda2 /proc/5400即可恢復原狀取消掛載。