【工具】用命令行与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
【工具】用命令行与Python使用YARA规则的更多相关文章
- 四则运算生成命令行程序 (Python)
Github项目地址:Github Pages 结对项目成员:张鹏 3118004985 郑靓 3118004988 一.项目需求分析 二.功能实现 三.代码实现or功能说明 ★ GUI功能扩展说明 ...
- 在命令行输入python出现“Warning:This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.
[现象] 在命令行输入python出现“Warning:This Python interpreter is in a conda environment, but the environment h ...
- 在Linux命令行执行python命令
在Linux的命令行执行python的某些命令: [root@centos7 ~]# echo "import sys ;print(sys.path)"|python3.6 [' ...
- 设置PATH 环境变量、pyw格式、命令行运行python程序与多重剪贴板
pyw格式简介: 与py类似,我认为他们俩卫衣的不同就是前者运行时候不显示终端窗口,后者显示 命令行运行python程序: 在我学习python的过程中我通常使用IDLE来运行程序,这一步骤太过繁琐( ...
- 命令行运行Python脚本时传入参数的三种方式
原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...
- 命令行运行python模块时提示包找不到的问题
庄稼人不是专职python开发的道友.尽管与python相识已多年,可惜相识不相知,仅仅是偶尔借助pydev写一些简单的小工具. 多年来.一直困惑于这样一个问题:相同的project.相同的代码,使用 ...
- Android SQLite3工具常用命令行总结
Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具.开发者可以方便的使用其对sqlite数据库进行命令行的操作. 程序运行生成的*. ...
- android 7.0 多渠道打包 - 美团开源工具Walle 命令行打包
在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(美团Android自动化之旅-生成渠道包)已经行不通了,对此美 ...
- 命令行以及Python交互模式下python程序的编写
一.命令行模式 在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:\>: 二.Python交互模式 在命令行模式下敲命令python,就看到类似如下的一堆文本输出 ...
随机推荐
- 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换关键代码switch_to 1.不同类型进程有不同调度需求--两种分类 2.调度策略--规则 Linux中进程优先级是动态的,周期性调整. 3.时机 ...
- think in UmL(三)
在实践中思考! 在这一部分中,书中作者用实际的案例讲述了从一个个实际项目的可行性分析阶段倒是现阶段的整个过程,让我们奖赏部分学到的UML知识点在实践中的得到学习. 当我们拿到一个项目的时候首先要做的就 ...
- 作业六:小学生四则运算之NABCD模型与产品Backlog。
NABCD模型与产品Backlog NABCD模型 ) N (Need 需求) 方便了老师和学生,使他们可以想要的时候随时可以得到,省时省力,快速出题,马上得到答案. ) A (Approach 做法 ...
- Linux命令(九)比较文件差异 diff
diff 命令介绍 diff 命令的功能为逐行比较两个文本文件,列出其不同之处.对给出的文件进行系统的检查,并显示出两个文件中所有不同的行.如果 diff 命令后跟的是目录,则会对该目录中的同名文件进 ...
- array_column 函数, 以及在PHP5.5之下的替代方法
array_column 函数, 是能够根据多维数组中共有的一个键值来提取多维数组中属于这个键的值 例如下面的数组: $test = array( 0 => array( 'id' => ...
- shell 命令 if [ -d filename] 判断文件
作者:曹毅涵 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊 ...
- IntelliJ IDEA中文乱码问题
转自 https://blog.csdn.net/m0_37893932/article/details/78280663 1 file->settings->appearence里面有 ...
- jdk动态代理 要把目标对象 和自己都传进去;以便自己对目标对象的代理
- LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)
如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做. 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数.当然才不管怎 ...
- POJ 1182 食物链 (带权并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78551 Accepted: 23406 Description ...