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