這篇文章我們先聊聊chkrootkit: http://www.chkrootkit.org。從README中我們了解到最近一次更新是:04/30/2014,而前一次更新是09年…看看CHANGELOG,大概也能夠明白它都有哪些功能,代碼目錄的命名很好的反應出了這一點:
chkrootkit本身是一個shell腳本。運行 chkrootkit –l 可以看到所有的檢測集。注意chkrootkit腳本這幾個字的重點飄紅。一般來說,這種開源的腳本調用外部命令方式工作的安全檢查程序,按照經驗注定是悲劇的節奏(注意定語)。而且上機器后看都不看運行環境就執行這類檢測程序極易被反補一刀
打開chkrootkit我們一開始就看到這樣兩句SHELL
pth=`echo $PATH | sed -e “s/:/ /g”`
pth=”$pth /sbin /usr/sbin /lib /usr/lib /usr/libexec .”
嘖嘖,檢查范圍讓64位操作系統情何以堪啊
大體來說檢測流程是什么樣子吧:
歷史遺留rootkit/backdoor/蠕蟲的默認檢測;方式為根據位置、特殊的文件名、字符之類的來找文件,根據綁定的端口號來看是否有某個特定的后門(拜托…)。但這些查找特征赤裸裸的寫在chkrootkit這個腳本里面的,繞過這類的檢查的成本有多大,指望在實際對抗中,能查出什么樣的東西,大家預期不要太高。
后面進入checking階段,有幾個check點還比較有意思,但基本上都是靠外部的bin來實現的。但我們不要忘記了,這些bin運行的環境很有可能是惡意的哦。
這里不討論從ring0上怎么躲避檢查了,簡單的一些open文件的redirect就能夠bypass一堆,有興趣的可以去phrack 97年的文章中看看思路3??縭ing3的開源程序去查ring0級別的未知后門本身出發點就有問題,這里注意是開源啊,再用ring0去bypass純粹是欺負人?。海#ó斎粚τ趯崿F不好的,只能被稱作beta版的rootkit還是有可能,文件引用計數差異啊、沒有相互配合好的cd和readdir調用啊之類的。但誰讓你開源啊~嘖嘖。)
吐槽我還是限制后門在ring3下的實現吧。
Ldd看一下
enter image description here
這里以Linux為例,不傳參數的情況下的make,產出的是一堆使用動態連接的bin,一個ld.so.preload就可以直接KO了。判定打開文件的讀寫對象,塞一個正常的給他即可。再看看有沒其他更有意思的繞過方式。一個一個的來分析檢測原理:
1 chkproc程序
a) chkproc函數完成了ps命令隱藏以及readdir函數隱藏的檢測。
b) 檢測邏輯:比對ps和readdir的輸出以及通過遍歷到MAX_PROCESSES(99999)的進程嘗試chdir到每個目錄/proc的結果來找出差異并報告(只有99999啊,嘖嘖),完全可以把pid拉起來啊 J, 不過這樣檢查會導致報告一個OooPS錯誤
enter image description here
c) 實際使用經驗來看,高并發的機器上,ps輸出完畢后,再去讀取/proc目錄中的內容,時間窗口也會帶來很大的誤差
d) 對于利用ptrace等方法注入shellcode或者SO到其他進程的后門檢查無效
e) 不隱藏的進程無效
2 chkdirs程序:
a) 接受要檢查的目錄,遞歸檢查,通過比對父文件夾的link計數和子文件夾計數的差異來發現異常。正常情況下父目錄的link計數應該是所有子項的數目+2
b) 在調用chkdirs這個命令的時主程序傳遞的參數為“/tmp /usr/share /usr/bin /usr/sbin /lib”大家記得別把隱藏文件放這些目錄即可,這是在逗我么…
c) 不隱藏的文件無效
3 chklastlog、chkutmp chkwtmp
a) 本質上這幾個程序都是在對utmp wtmp之類的文件做交叉比對,有些工具會檢查某些特殊的字段,比如time是否為0。此類的檢查工具的檢查思路更多的是來自對外界廣泛流傳的日志擦除工具的了解。
b) 程序實現時有硬編碼的略過賬戶在里面,可以直接將產生的log主體改成它可以繞過檢查
c) 不要輕易的將日志的字段完全清0,甚至在某些程度上,你可以從其他的entry copy一個過來
4 ifpromisc程序
a) 枚舉系統上處于混雜模式的接口以及PF_PACKET鏈路層套接字的程序來查找嗅探器
b) 建議采用so hijack的方式進行隱藏
看到現在,應該大概對chkrootkit 的定位和功能有效性有所感覺了:
首先,基本的、初級的入侵行為,比如uid=0,權限異常,文件系統的文件替換和新增、刪除,這還得你自己查。甚至當前可列的進程端口,你還是要自己去看的。Chkrootkit充其量是輔助,或者輔助的輔助。
沒有自作(第一聲)的程序是查不出來的,你堂而皇之的拿crontab起一個回連后門,它根本吱都不會吱一聲。稍微復雜一些的它也查不出來,比如so注入等后門。Chkrootkit只能幫你做很有限的一些入侵特征檢查,而且這種檢查是經驗性的,是建立在對攻擊者尿性的揣摩基礎上。
由于是開源,檢測邏輯很好繞,而且存在很多方式方法。攻擊者換個姿勢,就瞎了,幾乎可以肯定定制化的 rootkit根本查不出來。
chkrootkit的后門/rootkit檢測對抗工作思路還很樸素。別指望能有啥重大發現了。
清楚了一個安全檢測工具的工作原理和局限性、公開了check 點,在一個“通用”的操作系統上對抗,攻擊者以有心算無意總能有收獲。通用系統的坑或者特性太多了,拿啟動位置來說,隨隨便便能列一堆之前聽都沒聽過的地方,惡意程序利用這些點,都能帶起來。
假使應急響應中需要使用這類通過研究攻擊者尿性開發的有針對性的工具,還是老老實實的private吧,這類東西屬于出奇制勝、見光死。
多關注關注CVE,呵呵,你的檢查運行程序,別成了人家本地提權的途徑了。說不定人家造成大的動靜就等著你來chkrootkit呢!
最后,以一個吐槽結束,應急響應最重要的目標在實際操作中太容易被忽視。弄清怎么進來的,進來后做了啥,造成了哪些損害。咱不是要和攻擊者玩躲貓貓,你來藏我來找。事情結了后,能重裝就重裝吧,別折騰清理什么后門了。保不齊就被就被你沒留意的一個小細節或者不知道的一個特性給坑了。Focus目標, 勿忘初心。
References:
(1]https://www.exploit-db.com/exploits/33899/
(2]https://github.com/ossec/ossec-hids/releases/tag/2.8.2
(3]http://www.phrack.org/issues/51/9.html#article