Article Learn

从零开始搭建Cuckoo Sandbox(3)

Post by XywCloud at 2018-08-08 16:49:07

    上一篇文章结束后,我们算是把Cuckoo Sandbox搭建并调教好了。这一章我们主要来看看Cuckoo的行为签名。

    行为签名可以说是直接决定了Cuckoo究竟可以标记出多少恶意行为甚至是直接标记出样本所属的恶意软件家族,但是在这里我们并不会讨论具体某个恶意软件家族的规则应该怎么写,我们只会提到几个编写及使用行为签名时需要注意的地方。

    虽然根据Yara的文档:http://yara.readthedocs.io/en/latest/modules/cuckoo.html,Yara是有Cuckoo模块的,可以根据Cuckoo的行为记录创建检测规则,并且Cuckoo在处理的时候也可以匹配Yara规则,但是Cuckoo模块仅能利用上Cuckoo提供的一部分行为记录(文件/注册表/互斥体/网络),因此我个人更倾向于使用Cuckoo内置的行为签名。

    先给出官方提供的行为签名的相关文档:https://cuckoo.readthedocs.io/en/latest/customization/signatures/,看完以后我只有一个感想:“这么少的么?”。另外查看源码发现,Signature类下面并没有“list_signatures”这个成员函数,因而在文档的尾部的那段代码是有问题的。

    官方的文档都这样了,咱们也只能靠自己了。虽说是整个文章的最后一部分了,但是这个部分不会太长。

一个吐槽

    首先必须得感谢Cuckoo的那一批社区签名库,真的是节省了我不少的精力,不需要从头开始,而且里面不少的签名写的非常棒,也不乏一些逻辑较为复杂的规则。

    只不过,里面有不少的规则,有一些迷之问题,大家可以花一些时间好好看一看,应该会发现不少,比如正则/没写“regex=True”(rat_fynloski.py);另外还有一些并没有太大作用的规则,有一部分是在对咱们中国几大特产的检出上。

    但是在这里,我们只提一个规则:creates_null_reg_entry.py。这条规则的目的是用来检出一些首字节为0x00的注册表项(该手段常用于恶意软件隐藏注册表痕迹,详情可以去网上自行搜索)。如果你有留意处理行为记录所在的命令行窗口输出的各种信息,你会发现这个python脚本有时候会被python报错,而且是编码错误。

    不多说了,直接上图。下图是我这边的解决方案:

行为签名匹配顺序

    如果你编写的行为签名需要依赖其他的行为签名(比如a签名需要在b签名匹配的基础上才会进行匹配),那么你就需要考虑这个问题了。

    Cuckoo的行为签名的执行顺序是有先后的,每个行为签名脚本内的on_*函数的执行时机也不同:on_call(Cuckoo处理每条API记录时执行),on_signature(某条签名匹配时执行),on_complete(每条行为签名最后执行的一个函数,大多数的决定该条行为签名是否匹配的代码都写在这儿)

 

    如果你有留意Cuckoo在命令行输出的调试信息,可以很容易得知Cuckoo会按Windows下文件名的排序规则来按次序读取规则。

    只需要记住以下内容即可:行为签名的文件名是给你看的,行为签名的“name”属性也是给你看的,只有行为签名的类名是给Cuckoo Sandbox看的(Cuckoo会对类名按照之前提到的排序规则进行排序并逐个读取及匹配)。

    如果你写的a签名在类名上是排在b签名前面,并且a签名需要在b签名已匹配的基础上进行匹配(即on_signature里判断被匹配签名的名称是否为b的名称,并且作为整个签名匹配的必要条件),那么a签名你这辈子都别想触发匹配了。

可用的函数

    行为签名内可用的函数都可以在[Python安装目录]\Lib\site-packages\cuckoo\common\abstracts.py里找到,在Signature类里面。

    需要提及的一点是,我们经常会在行为签名里使用check_file这个函数用于判断程序是否对特定文件进行了操作。

    如上图,可以留意到在actions这个参数为None时,Cuckoo为我们覆盖了6种情况。只不过这并没有覆盖全,此外还有file_created(文件创建)/file_recreated(重新创建文件)这两种文件操作。如果你是希望仅仅判断特定文件是否在记录里露脸,那么仅仅将actions置为None可能会出现漏网之鱼。如果你希望判断是否创建特定文件,那么只需要将actions置为“file_created”即可。

    get_files函数也有同样的问题,使用的时候需要多注意一下。

Severity的值以及Score的计算

    正如官方文档所说,severity的值通常为1-3,社区签名库里绝大多数签名的severity的值都落在这个范围(antivirus_virustotal.py是个例外),实际上你可以跳出这个范围(只不过得是整数),也可以对现有签名的这个值进行针对性的调整。

    Cuckoo对每个被分析的样本,在最后的分析报告展示界面都会给出一个评分,那么这个评分是怎么算的呢?答案在[Python安装目录]\Lib\site-packages\cuckoo\core\plugins.py

    可以说是非常明显了。Cuckoo对每条被匹配签名的severity进行累加,最后除5.但是,如果解析出了恶意软件的配置信息,则会将评分锁定为10(Cuckoo似乎是实行了10分制【实际并没有进行封顶】,只不过我这边自己编写的签名加入后,不少的样本都超出了这个值,甚至部分样本到了20)

 

    整篇文章到此结束,最后祝大家身(fen)体(xi)健(yu)康(kuai),我们下次再见。

 

—   联系我们   —

新浪微博

公众号