Linux下的惡意軟體多為sh指令碼,且由於使用的命令大同小異(均為下載檔案、執行程式、建立定時任務、寫ssh後門等操作),經常難以分辨惡意sh指令碼是屬於哪個病毒家族的。遇到這種情況,使用yara規則對惡意指令碼進行檢測分類是個不錯的選擇,本文將介紹如何藉助yargen實現對Linux惡意指令碼特徵的半自動化提取。
什麼是yarGen?
yargen是一個自動化提取yara規則的工具,可以提取strings和opcodes特徵,其原理是先解析出樣本集中的共同的字串,然後經過白名單庫的過濾,最後通過啟發式、機器學習等方式篩選出最優的yara規則,專案地址:https://github.com/Neo23x0/yarGen。
下面以8220黑客團伙(StartMiner)的惡意指令碼進行演示:
如何提取其yara規則?
首先需要收集該家族每次變種的樣本,如下,該家族從2018年8月到現在一直在更新,其特點是指令碼大部分都偽裝成.jpg字尾。
yargen的用法很簡單,-m引數,加上樣本集的目錄就行了,第一次執行yargen的話可能會比較久,因為它要下載更新白名單庫。
執行過程中,yargen會顯示提取的特徵數詳情,其中我們要關注的是SUPER rules,這些規則代表的是泛規則,可以匹配家族的多個樣本。
生成的檔案yargen_rules.yar在yargen.py的同目錄下,開啟滑到Super Rules的地方,即是泛規則,規則的名字代表著能匹配哪些樣本,如下第一個rule _logo8_jpg_hehe_0,代表匹配指令碼logo8.jpg及hehe.sh。
Super Rules裡也不是所有規則都要關注,主要聚焦看匹配數最多的規則,如下我會關注
rule _cr_logo8_jpg_2start_jpg_2start_jpg_3start_jpg_1規則,及rule _cr_cr_logo8_jpg_logo8_jpg_2start_jpg_2start_jpg_2start_jpg_2start_jpg_3start_jpg_3start_jpg_3規則。
yargen雖然能自動化提取字串特徵很方便,但工具難免會有誤報,必須得自己人工篩選一遍,如下,先看rule _cr_logo8_jpg_2start_jpg_2start_jpg_3start_jpg_1規則,我挑選了紅框中5個比較特別的字串,其他一些WGET、download、sleep等字串可能會存在誤報場景,我就不考慮了。
再看rule _cr_cr_logo8_jpg_logo8_jpg_2start_jpg_2start_jpg_2start_jpg_2start_jpg_3start_jpg_3start_jpg_3規則,由於其匹配的樣本數多,自然的特徵項就比較少,我選取了如下2個特徵。
篩選出如上特徵後,需要檢視字串在指令碼中對應的位置,以確認該特徵是否為黑客獨特的指令碼編寫習慣。如下圖以echo “*”為例,發現黑客在編寫echo語句時都喜歡在開頭加個大寫首字母,且延續了好幾個變種,這個可以作為特徵。
再看"case $sum in"規則,該語句用於判斷檔案MD5,也是黑客的一個指令碼編寫習慣,延續了幾個變種。
除此之外,還發現指令碼里都有f2=”*”的變數宣告,也可以作為特徵。
以及judge函式名。
其中提取指令碼中的域名/IP作為特徵,因為黑客在新的變種中有可能複用舊的C&C。
最後優化後的規則如下,主要為3類字串,語法特徵、變數特徵、ioc特徵,根據不同的比重編寫condition,其中ioc相當於硬性指標,只要出現任意1個就可以直接確認該指令碼為8220/StartMiner家族。
驗證:對該規則進行測試,測試樣本均能檢出。
Linux指令碼基本不會進行混淆,且均是字串,使用yargen進行自動化提取有其優勢,可以大大提高提取特徵的效率,大家可以嘗試使用該方法來提取其他家族的yara特徵。同時,每個安全研究員提取的yara都不一樣,風格不一,需要進行大量樣本的測試,來不斷優化yara規則的質量。
參考連結:
https://blog.csdn.net/m0_37552052/article/details/104570954
https://s.tencent.com/research/report/978.html