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