静态扫描之Yara第三话--编写yara规则(2)

编写简单高效的yara规则(2)


翻译自:https://www.bsk-consulting.de/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/

几个月前,我写了一篇”How to write simple but sound Yara rules“的博客。那篇博客所提到的技术和工具现在以及得到了改进,现在我就来详细地介绍下更新的地方。


万能的Location

Yara最被低估的特征之一是可以定义一个字符串的范围来匹配。 我使用这种技术来创建一个规则,发现它能可靠地检测meterpreter的payload,即使它被编码/隐藏。

当你发现一段恶意代码处在一个可执行文件的末尾时,你应该会有如下疑问:

  1. 这些字符串位于文件中的这个位置是正常的吗?
  2. 这些字符串在该文件中多次出现是否正常?
  3. 两个字符串之间的距离是不是固定的?

Malware Strings

这时我提供一种写规则的思路,对于那些非specific字符串,尝试定义一个制定filesize(例如文件大小> 800KB)的规则以及非spcific字符串位置的规则(如$s1 in (filesize-500..filesize))

下面是一个webshell的例子,如果我们使用$code = "7T2JX...." 来作为特征,那么此webshell的作者只需在后续的版本中替换掉$code7T2JX...... 便可绕过我们的规则。
Webshell Code PHP
所以我们决定将eval(gzinflate(base64_decode(" 作为特征:

rule Webshell_b374k_related_1 {
    meta:
        description = "Detects b374k related webshell"
        author = "Florian Roth"
        reference = "https://goo.gl/ZuzV2S"
        score = 65
        hash = "d5696b32d32177cf70eaaa5a28d1c5823526d87e20d3c62b747517c6d41656f7"
        date = "2015-10-17"
    strings:
        $m1 = "<?php"
        $s1 = "@eval(gzinflate(base64_decode(" ascii
    condition:
        $m1 at 0 and $s1 in (filesize-50..filesize) and filesize < 20KB
}

这样的规则看起来适应性就更强


yarGen

更新之后,yarGen具有opcode功能。 它在默认情况下处于启动状态,但仅在没有足够的字符串可以提取的情况下才有有效果。

python yarGen.py --noop -z 0 -a "Florian Roth" -r "http://link-to-sample" /mal/malware

opcode功能的弊端是在创建规则时需要占用多于2.5 GB的内存。 我将在下一个版本中将其更改为可选参数。


yarAnalyzer

yarAnalyzer是我推出的又一个强大的工具,专注于分析规则的通用性。 在创建了一个大的规则集或一个通用型的规则后,你想检查这些规则的通用性如何,便可以使用这款工具,yarAnalyzer则会输出以下结果:

  1. 检测到一个以上样本的规则
  2. 被多条规则检测到的样本
  3. 没有检测到样本的规则
  4. 没有被检测到的样本

yarAnalayzer Screenshot
yarAnalyzer Github Repository


字符串提取和可视化

使用如下shell可以更清晰地查看特征字符串:

#!/bin/bash
(strings -a -td "$@" | sed 's/^\(\s*[0-9][0-9]*\) \(.*\)$/\1 A \2/' ; strings -a -td -el "$@" | sed 's/^\(\s*[0-9][0-9]*\) \(.*\)$/\1 W \2/') | sort -n

将返回字符串的偏移以及描述(ASCII/UNICODE)

顺便也安利下我新推出的字符串检索工具:prisma

Prisma STDOUT colorization

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值