- 基于二进制文件中包含的文本或二进制字符串的描述创建的
- 各类yara
- 识别各种壳、hash算法等
yara规则自动生成工具:yargen
yara使用
rule silent_banker : banker是声明该规则用于检出banker类型的样本。
- meta :后面的是一些描述信息,比如规则说明、作者信息等。
- strings:$a $b $c 两个十六进制字符串(十六进制字符串用大括号括起来)和一个文本字符串(文本字符串直接用双引号括起来)
- condition :规定了匹配的条件
- 修饰符
- nocase:不匹配大小写
- wide: 匹配2字节的宽字符
- ascii: 匹配1字节的ascii字符
- xor: 匹配异或后的字符串
- fullword:匹配完整单词
- private: 定义私有字符串
- 正则
- all of ($a*) // 匹配标识符以$a开头的所有字符串
- any of ($a,$b,$c) // 匹配a, b,c中的任意一个字符串
a == 6 and #b > 10//a字符串出现6次,b字符串大于10次
- @a[i]//获取字符串$a在文件或内存中,第i次出现的偏移或虚拟地址
- !a[i] //获取字符串$a在文件或内存中,第i次出现时的字符串长度
- $a in (0..100) and $b in (100..filesize)//在文件或内存的某个地址范围内匹配字符串
- 2 of ($a,$b,$c) //3个字符串只需匹配任意2个
- for all of ($a*) : (@[2] < 0x9) //所有以$a开头的字符串,在文件或内存中第2次出现的位置必须小于9
- for all i in (1,2,3) : ( @a[i] + 10 == @b[i] ) //$b在文件或内存中出现的前3次偏移,必须与$a在文件或内存中出现的前3次偏移+10相同
- for all i in (1..#a) : ( @a[i] < 100 ) //$a每次在文件或内存中出现位置,都必须都小于100
- 从指定的文件或内存偏移处读取数据
- uint16(0):取文件前两个字节(无符号小端)
- int16(0):取文件前两个字节(有符号小端)
- int16be(0):取文件前两个字节(有符号大端)
- uint16be(0):取文件前两个字节(无符号大端)
- 私有规则:private
- 以避免规则匹配结果的混乱,即若使用私有规则进行匹配则YARA不会输出任何匹配信息。比如在规则文件Rule2引用规则文件Rule1时不希望Rule1的匹配信息输出
- 标签规则:TagRule
- 对规则匹配结果进行筛选,仅输出用户感兴趣的匹配结果
- 全局规则:global rule
- 导入模块:import
//.yara
//作用于C语言一样,可以包含其它规则到当前文件中
include "other.yar"
//相对路径
include "./includes/other.yar"
include "../includes/other.yar"
//全路径
include "/home/plusvic/yara/includes/other.yar"
//使用“import”导入模块
//你可以自己编写模块,也可以使用官方或其它第三方模块
//导入模块后,就可以开始使用模块导出的变量或函数
import "pe"
import "cuckoo"
pe.entry_point == 0x1000
cuckoo.http_request(/someregexp/)
//全局规则(global rule)可以在匹配其他规则前优先筛选,
//比如在匹配目标文件之前需要先筛选出小于2MB的文件,在匹配其他规则
global rule SizeLimit
{
condition:
filesize < 2MB
}
private rule Rule1
{
strings:
$a = "dummy1"
$b = "dummy2"
condition:
$a and $b
}
rule TagRule : dummy1 dummy2
{
strings:
$a = "dummy1"
$b = "dummy2"
condition:
$a and $b
}
rule silent_banker : banker
{
//规则描述
meta:
description = "This is just an example"
thread_level = 3
in_the_wild = true
//规则字符串
strings:
$a = {6A 40 68 00 30 00 00 6A 14 8D 91}
$b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
$c = "UVODFRYSIHLNWPEJXQZAKCBGMT" nocase
$name = {83 EC 0C C7}
$hex_string2 = { 00 11 [0-2] 44 55 }
$hex_string = { 00 11 ( 22 | 33 44 ) 55 }
//条件表达式
condition:
$a or $b or $c
filesize > 200KB
pe.entry_point == 0x8b0 (偏移)
$name at pe.entry_point
uint16(0) == 0x5A4D
$a and Rule1
}
yara参数
-t | 只打印标记为tag的规则 |
---|---|
-i | 只打印名为identifier的规则 |
-n | 只打印不满足的规则 |
-D | 打印模块数据 |
-g | 打印标签 |
-m | 打印元数据(详细信息) |
-s | 打印匹配字符串 |
-L | 打印匹配字符串长度 |
-e | 打印规则的命名空间 |
-p | 使用指定的线程扫描目录 |
-r | 递归递归搜索目录 |
CobaltStrike安装和使用
- 简介
Cobalt Strike 一款以Metasploit为基础的GUI框架式渗透测试工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,exe、powershell木马生成等。钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等。Cobalt Strike 主要用于团队作战,可谓是团队渗透神器,能让多个攻击者同时连接到团体服务器上,共享攻击资源与目标信息和sessions。
CobaltStrike样本查杀
PE马
- 通过uint16(0) 的方式取文件的前两个字节,判断是否等于0x5A4D 如果等于则说明是PE,这里用于过滤PE文件
- 判断程序的pe.entry_point是否等于0x8B0,这里是文件的file offset,这里也算是一个很好的过滤条件,可以直接过滤掉大部分的文件。
- 通过两个filesize的比较限制文件的大小
- 最后用一个关键的字符串来做最终的验证。
powershell马(ps1)
html_pe马
html_VBS马
Macro宏病毒
有效的yara特征
1、pdb路径
- pdb文件名和对应的exe文件名相同
- 类别
- 普通pdb名,可完全匹配pdb,以pdb信息作为查杀条件。
- 以pdb路径中的部分信息作为过滤条件,快速过滤掉不相干样本。
- 无字面意义pdb,如文件名称为随机字符串,此类pdb最好不好选做特征,否则将会变成单杀特征。
- 带人名/盘符/路径/日期/等信息的有价值pdb,此类pdb有可能是攻击者不小心留下来的,价值较高。
- 误导性pdb,有的pdb信息不仅无用,还会误导分析人员。
2、互斥体
- 恶意代码常见互斥体
- 获取当前的计算机基本信息计算出一个ID,以该ID作为互斥体名
- 硬编码在代码中的互斥体名,如程序名、C2地址、地名、小说人物名、随机乱码名
- 仿冒正常程序的互斥体名。(迷惑项)
- 以请求域名作为互斥体名称,保证同一个C2通信的程序不会重复运行
3、信号量
- 常见的通过信号量来防止多开的还是BITTER的样本。
4、路径名
- 运行时检查的路径
- 运行时释放文件的路径
5、网络地址
- downloader下载地址
- C2地址
- 协议地址