Linux下进程隐藏的常见手法及侦测手段
痕跡清理
1.? 退出前 history -c
2.? 多使用sftp吧 0.0
3.? web日志刪除一些
4.? 用戶目錄下很多 history,一言不合就是刪 :)
4.? btmp wtmp 這些應該刪,但是我用不著刪 :)
?
0x00.前言
進程隱藏是惡意軟件隱藏自身痕跡逃避系統管理人員發現的常用伎倆之一,當然,安全防護人員有時候也會使用到,比如隱藏蜜罐中的監控進程而不被入侵者覺察等。筆者也曾在多次安全應急響應經歷中遇到過多各式各樣的進程隱藏伎倆,了解進程隱藏的常見手法及發現手段是每一位安全運維工程師所應掌握的知識點。本文拋磚引玉,淺談我所了解的Linux下進程隱藏手段及發現技巧,也希望讀者能夠積極分享自己相關經驗與技巧。
?
0x01.我所了解的 Linux下進程隱藏手段及偵測方法
Linux 下進程隱藏手法大體上分為兩種,一種是基于用戶態隱藏;一種是直接操控內核進行隱藏。
一、基于用戶空間進程隱藏手法
1、偷梁換柱型
1)隱藏原理
? 道理很簡單,通過替換系統中常見的進程查看工具(比如ps、top、lsof)的二進制程序,導致原先查看進程相關信息的工具(ps、top、lsof等)都被調包了,當然看不到
2)防護手段
? I、從干凈的系統上拷貝這些工具的備份至當前系統,對比前后的輸出是否一致,不一致,則說明被替換了
? II、檢測這些工具的hash值是否與系統初始化的時候值不一致,是,則說明被替換了
? III、專業一點話,使用一些系統完整性檢查工具,比如tripwrie、aide等
? IV、部署主機入侵檢查工具(比如ossec),監控系統文件是否被替換,如有替換,則會報警記錄
2、HooK系統調用型
1)隱藏原理
先說下ps、top等工具的工作原理
以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 文件開始獲取進程信息,然后打印給你看
攻擊者通過劫持getdents 等系統調用函數或libc中的readdir 函數,實現對特定進程名進程的隱藏,以達到進程隱藏目的
劫持getdents 等系統調用函數或libc中的readdir 函數等系統調用函數一般來說有3個途徑
I、修改內核調用,比如getdents 的源碼
II、修改libc庫中readdir 函數的源碼
III、利用環境變量LD_PRELOAD 或者配置ld.so.preload文件 以使的惡意的動態庫先于系統標準庫加載,以達到架空系統標準庫中相關函數的目的,最終實現對特定進程的隱藏
這3個原理類似,III相對于I、II比較簡單,在此以III為例進行演示(劫持libc 中的readdir函數)
演示(利用LD_PRELOAD這個環境變量進行進程信息隱藏),比如隱藏ping這個進程:
先在一個窗口執行ping
在另外一個窗口加載惡意動態庫,動態庫源碼中對指定進程信息進程了過濾
上文也提到這種HooK系統調用函數的進程隱藏方式只是hook了ps等工具從/proc 獲取信息的過程,而沒有修改/proc/文件系統本身,其實相關進程信息的內核映射還在/proc中
自己寫個python小工具,直接讀取/proc中的內容,也能發現異常
其實ls 也是調用libc中的readdir函數,如果對上述惡意動態庫進行修該也可以實現對ls命令的劫持。
不過對于直接使用cat讀取文件(linux下什么東東都是文件)內容獲取進程信息的方式,劫持libc的readdir函數是沒用的,因為cat調用的是一系列lookup函數(需要對這一系列函數進行劫持,原理類似)
2)防護手段
I、檢查LD_PRELOAD環境變量是否有異常
II、檢查ld.so.preload 等配置文件是否有異常
III、自己寫個python小工具,直接讀取/proc中的內容,對于ps等工具的結果,對不上,則存在被劫持可能
IV、使用sysdig(有開源版,可以監控ps等的調用過程,觀察是否有惡意動態庫被加載。strace有類似功能)或者prochunter(google 上search)
? sysdig proc.name=ps
3、偽造進程名型
1) 隱藏原理
在惡意代碼中通過設置具有迷惑性的進程名字,以達到躲避管理員檢查的目的
比如?Tiny Shell文章?中介紹的Tiny shell 這款工具通過在源碼中設置PROCESS_NAME為bash,以使得其運行后的進程名顯示為bash
另:也可利用bash的特性來更換進程的名字
exec -a 更換后的進程名 原來的執行命令
比如exec -a sysdig proc.name=ps &執行之后,進程名顯示為bash proc.name=ps
如果原來的執行命令沒有參數,則非常具有迷惑性
2)防護手段
找到可疑進程所在的/proc目錄,查看exe的指向
可疑發現真正的進程是sysdig 觸發的
4、掛載覆蓋型
1)隱藏原理
利用mount —bind 將另外一個目錄掛載覆蓋至/proc/目錄下指定進程ID的目錄,我們知道ps、top等工具會讀取/proc目錄下獲取進程信息,如果將進程ID的目錄信息覆蓋,則原來的進程信息將從ps的輸出結果中隱匿。
比如進程id為42的進程信息:mount -o bind /empty/dir /proc/42
案例:http://www.freebuf.com/articles/network/140535.html
2)防護手段
cat /proc/$$/mountinfo 或者cat /proc/mounts 查看是否有利用mount —bind 將其他目錄或文件掛載至/proc下的進程目錄的
二、基于對內核空間修改進行進程信息隱藏的手法
這一類的手法就比較高深了,基本上都算作rootkit了
1、劫持VFS文件系統系列函數實現對/proc動態生成結果的干擾,從而實現對某些進程的隱藏。
我們知道/proc這個內存文件系統是VFS的一個實現,如果在VFS接口層就進行進程過濾的話,我們在/proc目錄下根本找不到相關進程的目錄信息,更別談ps 之類工具可以獲取了。VFS層中涉及到proc動態生成結果的有inode_operation 和 file_operations等系列函數集,通過劫持這些函數集,可以使得進程信息無法通過文件系統接口輸出給proc
2、劫持進程創建模塊代碼,根據條件設置選擇是否隱藏進程
案例:http://www.cnblogs.com/wacc/p/3674074.html
大致的意思就是在Linux進程管理之task_struct結構體增加進程隱藏與否標記
進程創建代碼模塊中根據設置的進程隱藏比較選擇是否隱藏進程,如果為隱藏標記,則刪除/proc文件系統中該進程的相關目錄項,直接在內核中就把指定進程給過濾了,用戶態根本查不到
對于1)和2)這兩種場景比較棘手,防護手段如下
I、查下內核是否被重新編譯替換
II、lsmod是否有新內核模塊加入
III、查看機入侵檢查系統的相關告警
0x02. 總結
Linux下進程隱藏的手法不會僅限于本文提到的這些,本文提到也只是冰山一角,淺談而已。筆者希望此文能引起更多人的關注與討論,希望各位大牛多多分享自己的經驗與奇淫技巧。筆者水平有限,文中定有不足之處,還望各位斧正。
?
?
?
?
?
?
本文由安全客原創發布?
轉載,請參考轉載聲明,注明出處:?https://www.anquanke.com/post/id/160843?
安全客 - 有思想的安全新媒體
?
?
?
總結
以上是生活随笔為你收集整理的Linux下进程隐藏的常见手法及侦测手段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++:Windows编程—调用DL
- 下一篇: ROS报错:/usr/include/e