【工具】用命令行與Python使用YARA規則

一、前言

  YARA是一款旨在幫助惡意軟件研究人員識別和分類惡意軟件樣本的開源工具,使用YARA能夠基於文本或二進制模式建立惡意軟件家族描述與匹配信息。如今已經被多家公司所運用於自身的產品。html

二、YARA-規則撰寫

  YARA規則的字符串有三種類型:文本字符串、十六進制字符串、正則表達式。文本字符串用來定義文件或進程內存中可讀型內容,十六進制字符串用來定義字節內容,正則表達式可用在文本字符串和十六進制字符串中。python

rule HexExample  /* 規則名稱 */
{

    strings: /* 字符串,可以使用文本字符串、十六進制字符串、正則表達式 */
        $hex_string = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $char_string = "UVODFRYSIHLNWPEJXQZAKCBGMT"
    condition: /* 條件區域 */
        $hex_string or $char_string
}

三、YARA使用

  除了根據特徵用來搜索病毒樣本,還能夠經過某些殼的特徵判斷軟件用了啥殼。因爲上傳的可疑樣本都會被保存到VT數據庫中,因此經過VT還能夠搜索到指定字符串的祕密級別文檔。git

3.1 VT使用

一、使用VT帳戶登陸VT->hunting模塊

二、在Rulesets選項中Edit添加YARA規則並保存

三、在Rulesets選項中Settingss設置本身的聯繫郵箱並保存,用於獲取檢索結果。

四、設置完Rulesets中的YARA規則後即可在Notifications選項中獲得想要檢索的樣本

五、示例

1)技術細節github

  DDE協議是Microsoft用來容許兩個正在運行的應用程序共享相同數據的幾種方法之一。 該協議正在被數以千計的應用程序使用,包括MS Excel,MS Word和Visual Basic進行數據交互。因爲DDE是Microsoft的合法功能,所以大多數防病毒解決方案都不會標記任何警告或阻止使用DDE字段的文檔。正則表達式

  沒有任何限制或檢測的狀況下,點擊打開惡意文檔都有可能在計算機上運行惡意代碼。利用DDE的文檔會運行一個控制檯命令,使用PowerShell命令在受害者的機器上安裝惡意軟件。數據庫

利用方法:windows

新建一個Word文檔,經過Ctrl+F9添加一個域,而後修改域代碼爲:

{ DDEAUTO c:\\windows\\system32\\cmd.exe " /k notepad.exe" }
{ DDE c:\\windows\\system32\\cmd.exe " /k notepad.exe" }

2)安全事件安全

  這種DDE攻擊技術首次被高級持續威脅(APT)黑客組織APT28利用,FireEye公司發佈了最新的威脅情報報告《APT28: At The Center for The Storm(APT28:位於風暴中心)》。在此報告中FireEye認定著名的APT28組織就是俄羅斯政府支持的黑客組織。結合本次用YARA規則獲取的樣本,利用樣本里的C&C信息還關聯到DDE當前還被大量的Locky類勒索病毒所使用。函數

3)YARA規則工具

  經過Github搜索現有DDE YARA規則進行匹配。

rule Office_DDEAUTO_field {
  strings:
    $a = /<w:fldChar\s+?w:fldCharType="begin"\/>.+?\b[Dd][Dd][Ee][Aa][Uu][Tt][Oo]\b.+?<w:fldChar\s+?w:fldCharType="end"\/>/
  condition:
    $a
}
  
rule Office_DDE_field {
  strings:
    $a = /<w:fldChar\s+?w:fldCharType="begin"\/>.+?\b[Dd][Dd][Ee]\b.+?<w:fldChar\s+?w:fldCharType="end"\/>/
  condition:
    $a
}
 
rule Office_OLE_DDEAUTO {
  strings:
    $a = /\x13\s*DDEAUTO\b[^\x14]+/ nocase
  condition:
    uint32be(0) == 0xD0CF11E0 and $a
}
 
rule Office_OLE_DDE {
  strings:
    $a = /\x13\s*DDE\b[^\x14]+/ nocase
  condition:
    uint32be(0) == 0xD0CF11E0 and $a
}

4)獲取到的樣本信息

  經過VT就能夠輕鬆匹配到互聯網上使用這個office漏洞的樣本。提取出利用這個漏洞的C&C信息後,接下來就能夠根據C&C信息再關聯到具體的事件,域名提取示例以下:

樣本1-7bef74262c3624ca37a62c84b1ff3b82

經過關聯C&C信息對應的樣本跟locky勒索者病毒有關。

樣本2- 14ba65111e967d79de13cee417c89c2c

樣本3- 14ba65111e967d79de13cee417c89c2c

3.2 Windows命令行運用YARA

  調用YARA須要輸入兩條內容。一是包含想要使用的規則的文件(不管是源代碼仍是編譯後的形式)、二是被掃描的目標( 目標能夠是文件,文件夾或進程)

示例:

yara32.exe -m -w -f -r AllSigs.yarc C:\Users\AT\Desktop\YARA學習\Yara

-m 打印元數據
  元數據(MetaData)的目的在於對規則描述進行額外的描述存儲

-w 禁用警告信息

-f 快速匹配模式

-r 遞歸搜索目錄

輸出效果:

  規則文件能夠直接源代碼的形式使用,也能夠先用yarac工具編譯後使用。 若是打算以相同的規則屢次調用YARA,以編譯形式使用YARA規則能夠節省更多時間。由於對於YARA來講,加載編譯規則要比一遍又一遍編譯相同的規則更快。

  編譯YARA規則的批處理代碼以下,代碼中默認存放規則目錄在C:\Yara,編譯後的庫路徑和名字爲C:\Yara\AllSigs.yarc,這個路徑能夠本身定義:

@echo off

::將自身路徑設置爲變量
Set CurPath=%CD%

::刪除原規則文件
del C:\Yara\AllSigs.yara

::把當前路徑下的文件名字所有讀取
::type命令解析*.yara內容追加到AllSigs.yara
for /r %%i in (*.yara) do (
    type %%i >> AllSigs.yara
)

::yarac 爲編譯yara工具,將AllSigs.yara編譯成AllSigs.yarc
call C:\Yara\yarac32.exe C:\Yara\AllSigs.yara C:\Yara\AllSigs.yarc

::若是編譯成功跳轉,不成功則打印出錯誤碼,刪除規則文件後跳轉到結束位置
if %ERRORLEVEL% == 0 goto :next
echo Errors encountered during yara compliation.  Exited with status: %errorlevel%
del C:\Yara\AllSigs.yara
goto :endofscript

::打印出編譯成功
:next
echo Yara compilation successful!

:endofscript

編譯完畢後,可使用如下批處理代碼對編譯後的YARA數據庫進行調用。

@echo off
C:\Yara\yara32.exe -m -w -f -r C:\Yara\AllSigs.yarc %1

3.3 使用python運用YARA

按照編譯和安裝YARA庫,就可使用Python運用YARA功能了。步驟以下:

一、導入yara模塊

import yara

二、編譯YARA規則,而後將它們應用到數據中,規則能夠從文件路徑編譯:

rules = yara.compile(filepath='/foo/bar/myrules')

三、Rules實例有一個match方法,它容許將規則應用於文件或是進程,這裏給出應用文件的示例代碼以下:

matches = rules.match(‘/foo/bar/my_file’)

可是也能夠將規則應用於Python字符串:

with的方法:

with open('/foo/bar/my_file', 'rb') as f:
  matches = rules.match(data=f.read())

打開文件流的方法:

fp = open(mapath, 'rb')
matches = rule.match(data=fp.read())

  核心代碼學習完畢以後,就把重心點從所學應用到批量編譯規則,批量掃描上來吧。不建議把目錄存放在中文目錄下。

yara_database_test.py

#/usr/bin/python
#coding=utf-8

import yara
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')

# 獲取目錄內的yara規則文件
# 將yara規則編譯
def getRules(path):
    filepath = {}
    for index,file in enumerate(os.listdir(path)):
        rupath = os.path.join(path, file)
        key = "rule"+str(index)
        filepath[key] = rupath
    yararule = yara.compile(filepaths=filepath)
    return yararule

# 掃描函數
def scan(rule, path):
    for file in os.listdir(path.decode("utf-8")):
        mapath = os.path.join(path, file)
        fp = open(mapath, 'rb')
        matches = rule.match(data=fp.read())
        if len(matches)>0:
            print file,matches
 
if __name__ == '__main__':
    rulepath = sys.argv[1]
    malpath = sys.argv[2]
    # rulepath = "D:\\rule_test"   # yara規則目錄
    # malpath ="D:\\test_vir" # 木馬存在目錄
    #yara規則編譯函數調用
    yararule = getRules(rulepath)
    # 掃描函數調用
    scan(yararule, malpath)

rule_test目錄內容

test_vir目錄內容

運行以下:

四、參考

yara手冊
http://yara.readthedocs.io/en/v3.7.0/

yara介紹
http://virustotal.github.io/yara/

惡意軟件模式匹配利器 – YARA
http://www.freebuf.com/articles/system/26373.html

VirusTotal Hunting示例
https://www.virustotal.com/#/hunting-overview

VirusTotal Hunting使用幫助
https://www.virustotal.com/intelligence/help/malware-hunting/

教你構建本身的yara數據庫
http://www.freebuf.com/sectool/92399.html

Yara官方預置規則
https://github.com/Yara-Rules/rules

yarapython http://yara.readthedocs.io/en/v3.4.0/yarapython.html

相關文章
相關標籤/搜索