【工具】用命令行与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,就看到类似如下的一堆文本输出 ...
随机推荐
- 《Linux内核设计与实现》读书笔记——第一、 二章
<Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...
- centos 64位 下hadoop-2.7.2 下编译
centos 64位 下hadoop-2.7.2 下编译 由于机器安装的是centos 6.7 64位 系统 从hadoop中下载是32位 hadoop 依赖的的库是libhadoop.so 是3 ...
- Day Four
站立式会议 站立式会议内容总结 442 今天:整合主页两个部分的逻辑代码,主页及其跳转基本完成 遇到的问题:无 明天:阅读图书界面逻辑部分完成 331 今天:学习java反射添加类数据到数据库 遇到问 ...
- ubuntu 12.04下 eclipse的安装
1首先下载有关的JDK sudo apt-get install openjdk-7-jre 由于是源内的东西,所以只许执行上面这一步,就自动帮你下载 安装 以及配置,无需繁琐的操作. 这里ubunt ...
- C#(近期目标)
最近很多同学为了实习都在学Java,但是我个人更偏好C#,首先因为自己基础不是太好,而C#又更容易入门,拥有比较完善的开发环境,是微软开发出来的语言.它吸收了C++和Java两门语言的所有有点,因为它 ...
- 2017-08-20 block,inline和inline-block概念和区别
display:inline.block.inline-block的区别 display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都 ...
- NodeList & null
NodeList & null querySelectorAll & querySelector let arr = document.querySelectorAll(`[data- ...
- 2019 front-end web trending
2019 front-end web trending https://github.com/kamranahmedse/developer-roadmap https://raw.githubuse ...
- [代码]--其他信息: ORA-01400: 无法将 NULL 插入
这个错误其实就是oracle数据库的某列约束为 not null,但在插入值的时候插入了控制,无论是null和"",它都识别为空 有两种方法: 1.修改数据库字段约束为允许为空 2 ...
- 分布式为什么使用Redis
一 为什么使用 Redis 在项目中使用 Redis,主要考虑两个角度:性能和并发.如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis. 性能: 如 ...