【工具】用命令行与Python使用YARA规则
1、前言
YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具,使用YARA可以基于文本或二进制模式创建恶意软件家族描述与匹配信息。现在已经被多家公司所运用于自身的产品。
2、YARA-规则撰写
YARA规则的字符串有三种类型:文本字符串、十六进制字符串、正则表达式。文本字符串用来定义文件或进程内存中可读型内容,十六进制字符串用来定义字节内容,正则表达式可用在文本字符串和十六进制字符串中。
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
}
3、YARA使用
除了根据特征用来搜索病毒样本,还可以通过某些壳的特征判断软件用了啥壳。由于上传的可疑样本都会被保存到VT数据库中,所以通过VT还可以搜索到指定字符串的秘密级别文档。
3.1 VT使用
1、使用VT账户登录VT->hunting模块
2、在Rulesets选项中Edit添加YARA规则并保存
3、在Rulesets选项中Settingss设置自己的联系邮箱并保存,用于获取检索结果。
4、设置完Rulesets中的YARA规则后便可在Notifications选项中得到想要检索的样本
5、示例
1)技术细节
DDE协议是Microsoft用来允许两个正在运行的应用程序共享相同数据的几种方法之一。 该协议正在被数以千计的应用程序使用,包括MS Excel,MS Word和Visual Basic进行数据交互。由于DDE是Microsoft的合法功能,因此大多数防病毒解决方案都不会标记任何警告或阻止使用DDE字段的文档。
没有任何限制或检测的情况下,点击打开恶意文档都有可能在计算机上运行恶意代码。利用DDE的文档会运行一个控制台命令,使用PowerShell命令在受害者的机器上安装恶意软件。
利用方法:
新建一个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功能了。步骤如下:
1、导入yara模块
import yara
2、编译YARA规则,然后将它们应用到数据中,规则可以从文件路径编译:
rules = yara.compile(filepath='/foo/bar/myrules')
3、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目录内容
运行如下:
4、参考
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