全部課程
發(fā)布時(shí)間: 2017-06-16 13:52:09
之前眾多技術(shù)宅們與騰科小編分享的自建蜜罐深深的引起了我濃厚的興趣,于是小編決定山寨一個(gè)類似的蜜罐玩玩。但是擺在面前的頭等大事就是一些監(jiān)控進(jìn)程需要運(yùn)行在蜜罐中,一但被黑客察覺(jué)到這些奇奇怪怪的進(jìn)程就囧了。在這里對(duì)Linux略知一二的小編決定嘗試一下如何將這些監(jiān)控進(jìn)程隱藏起來(lái)。
準(zhǔn)備工作
眾所周知,Linux 操作系統(tǒng)天生自帶一個(gè)虛擬分區(qū) /proc,該分區(qū)下保存硬件信息、內(nèi)核運(yùn)行參數(shù)、系統(tǒng)狀態(tài)信息等等,進(jìn)程運(yùn)行時(shí)的一些信息自然也就存在這個(gè)分區(qū)下。
虛擬分區(qū)/PROC
系統(tǒng)里運(yùn)行的每一個(gè)進(jìn)程都會(huì)在 /proc 分區(qū)下新建一個(gè)以自己 pid 命名的目錄,并將本進(jìn)程的參數(shù)存到該目錄下。在該目錄下可以通過(guò)修改 cgroup 文件,殘暴的將進(jìn)程綁定在某個(gè)CPU上,也可以通過(guò)修改cpuset文件來(lái)優(yōu)化進(jìn)程在NUMA架構(gòu)系統(tǒng)上的運(yùn)行效率,還可以通過(guò)修改oom_adj文件與系統(tǒng)OOM機(jī)制say Goodbye。而ps、top這類查看進(jìn)程的命令恰恰也就是在/proc分區(qū)下收集信息。通俗點(diǎn)講就是如果讓ps、top命令“失明”,就能達(dá)到我們隱藏進(jìn)程的目的了。
初次嘗試
網(wǎng)上關(guān)于 Linux 隱藏進(jìn)程的方式有很多,比如:
1)強(qiáng)行將進(jìn)程 pid 變?yōu)?0,這種方法存在破綻因此不予考慮。
2)系統(tǒng)啟動(dòng)時(shí)會(huì)依據(jù)/etc/fstab文件內(nèi)容來(lái)掛載分區(qū),在 proc 分區(qū)掛載參數(shù)中加入 hidepid=2 參數(shù)后,登陸系統(tǒng)的用戶只能查看到當(dāng)前用戶啟動(dòng)的進(jìn)程的信息。也就是說(shuō)tomcat用戶只能看到屬于自己的進(jìn)程信息。這種方法也存在弊端,罐中的黑客只能看到有限的進(jìn)程信息,可能就會(huì)產(chǎn)生會(huì)懷疑。如果再存在tomcat提權(quán)漏洞,那罐子的身份就會(huì)瞬間露餡。所以這種方式也不合適,那么如何才能將我們的問(wèn)題解決在系統(tǒng)最底層呢?
“肝”起來(lái)
對(duì)于Linux系統(tǒng)來(lái)說(shuō)有著得天獨(dú)厚的優(yōu)勢(shì),我們可以從內(nèi)核解決一切問(wèn)題??墒切【幍腃語(yǔ)言實(shí)在讓人捉急,還好我生活在偉大的中國(guó),高手藏于民間?。。?!瞬間得到了廣大吃瓜群眾的響應(yīng),一位妹紙的思路很新穎,在內(nèi)核中新增兩個(gè)信號(hào),當(dāng)進(jìn)程向內(nèi)核發(fā)出hide信號(hào)時(shí),內(nèi)核將不會(huì)為該進(jìn)程在/proc目錄下生成對(duì)應(yīng)的目錄,從而也就從底層鏟除了進(jìn)程的信息,即使黑客獲得了root權(quán)限也無(wú)法通過(guò)常規(guī)手段察覺(jué)到蛛絲馬跡。除此之外,新增的unhide信號(hào)作用恰好與hide信號(hào)相反。通過(guò)查閱官方文檔發(fā)現(xiàn),Demo中使用的內(nèi)核版本為2.6.15。在include/asm-i386/unistd.h 文件中定義新信號(hào)294和295。
系統(tǒng)在接收到我們新定義的294和295兩個(gè)信號(hào)之后需要調(diào)用對(duì)應(yīng)的函數(shù)來(lái)做出相應(yīng)的動(dòng)作。在kernel/sys.c中我們實(shí)現(xiàn)294和295信號(hào)調(diào)用的函數(shù)。如下圖說(shuō)明,sys_hide 和 sys_unhide 兩個(gè)函數(shù)主要功能是修改進(jìn)程 hide 變量的值。
proc相關(guān)內(nèi)核代碼位于 fs/proc/base.c 中,在進(jìn)程相關(guān)結(jié)構(gòu)體中新聲明變量hide,通過(guò)發(fā)送信號(hào)來(lái)修改hide的值,最后在base.c文件proc_pid_readdir函數(shù)中將hide變量的值作為進(jìn)程是否在proc文件系統(tǒng)中體現(xiàn)的依據(jù)。
踩雷
新內(nèi)核編譯完成后小編本以為可以愉快的玩耍了,結(jié)果新內(nèi)核根本無(wú)法啟動(dòng)。通過(guò)各種修改啟動(dòng)參數(shù)發(fā)現(xiàn),內(nèi)核報(bào)錯(cuò)“kernel too old”,尷尬了。再次求助妹紙,原來(lái) gcc 調(diào)用的 libc 不是完全向下兼容的,我們可以通過(guò)
- file /lib/libc-*.*.so
來(lái)查看當(dāng)前l(fā)ibc能夠編譯的最低版本的內(nèi)核,如下圖所示 libc-2.5.so 可以編譯最低到2.6.9版本的內(nèi)核,如果編譯內(nèi)核版本低于 2.6.9 的話就會(huì)報(bào)錯(cuò)導(dǎo)致內(nèi)核無(wú)法啟動(dòng)。
So,我們的 libc版本不能太高,又因?yàn)镈emo中修改的是 i386 架構(gòu)的內(nèi)核源碼,所以小編選擇的實(shí)驗(yàn)環(huán)境為 CentOS 5.11 (32bit) 。至此,我們就可以成功安裝并啟動(dòng) 2.6.15 版本內(nèi)核了,然而事情并沒(méi)有結(jié)束。系統(tǒng)供外部進(jìn)程使用的信號(hào)僅有64 個(gè)。
所以一般情況下我們的進(jìn)程只能發(fā)出這 64 種信號(hào),我們想要發(fā)出 294 和 295 號(hào)信號(hào)就必須借助于與系統(tǒng)關(guān)系更密切的C語(yǔ)言來(lái)完成。
然后通過(guò)執(zhí)行命令
- gcc hide.c -fPIC -shared -o hide.so
將hide.c編譯為hide.so的動(dòng)態(tài)鏈接庫(kù)。以后各位如果有進(jìn)程需要隱藏的話,只需要在代碼里調(diào)用hide.so中的hide函數(shù)即可,同樣unhide函數(shù)是它的逆過(guò)程。如下圖所示,在Python中 import ctypes ,使用它調(diào)用hide.so庫(kù)即可實(shí)現(xiàn)當(dāng)前Python2.7進(jìn)程的隱藏與恢復(fù)。
至此,已經(jīng)實(shí)現(xiàn)了內(nèi)核級(jí)別的進(jìn)程隱藏,可以愉快地做一些偷偷摸摸的事情了…不要想歪哦~