一例IRC Bot针对Cuckoo沙箱的猥琐对抗分析

近来我们经由过程蜜罐捕获到一例Windows平台的恶意样本,该样本是经由过程IRC办事器和C2进行通讯的一种IRC Bot。这种C2通讯要领的恶意法度榜样已经家常便饭,但此次这个样本的分外之处在于它包孕了异常鄙陋的沙箱抗衡机制,当样本正常运行的时刻和通俗的IRC Bot并没有什么-两样,然则当将它放在沙箱里面的时刻会发明沙箱根本捕获不到任何恶意行径,从而逃过检测。

0×00 简单先容一下Cuckoo

Cuckoo是今朝应用得异常广泛的一种动态阐发系统,其主要功能便是把恶意法度榜样放到Cuckoo系统的虚拟机中,Cuckoo认真运行这些样本法度榜样,并记录它们在虚拟情况中的行径,然后根据捕获到的行径去匹配一个指纹集(Signature),这个指纹集内定义了很多恶意法度榜样的特性行径,比如在关键的位置写入注册表、或者在敏感目录有读写文件的行径等等,着末根据匹配到的指纹对该样本法度榜样进行打分,以评估其迫害等级。比拟于静态文件特性,行径特性某些环境下更能反映真实的迫害环境,而且在没有静态特性的环境下动态特性可能是独一可行的检测措施。

由于Cuckoo是开源产品,以是被利用得异常广泛,也难免会有恶意法度榜样专门针对Cuckoo设计抗衡机制。

0×01 平日环境下若何抗衡沙箱

1、针对虚拟机

由于反病毒沙箱大年夜多都是基于虚拟机的,以是假如能包管样本在虚拟机情况中不履行那么就能大年夜概率包管其在沙箱中不履行,针对沙箱的检测主要有如下几类:1)虚拟机的特殊进程/注册表信息,比如像VBoxTray.exe、VMwareTray.exe等;2)特殊的驱动法度榜样,比如Virtualbox或VMware在Guest机械里面安装的驱动;3)硬件信息,比如网卡的mac地址,特定品牌虚拟机的网卡mac地址默认环境下大年夜多都在一个特定范围内;4)指令履行情况,比如像LDT、GDT的地址范围等等。

2、针对检测光阴

沙箱每一轮阐发一个样本的光阴是有限的,平日就几分钟,以是假如能让样本在这几分钟内不进入任何核心逻辑那么就可以避免被检测到。平日采取的做法有:1)使用Sleep函数,或和Sleep一致功能的延时函数;2)检测系统光阴,经由过程系统的光阴来延时;3)运行一些异常耗时的操作,比如一些特殊的数学算法以达到耗损光阴的目的。

3、针对交互

这种做法是为了确保样本是在有人操作的谋略机中启动的,比如可以检测鼠标的移动、有意弹窗让用户点击等等。

0×02 若何逃脱检测

而本文涉及的这个样本的沙箱抗衡要领和以往已知的要领都不一样。这个在蜜罐中被发明的样本在Cuckoo中检测的分数只有3分,也便是在一个低迫害等级上,和很多的正常法度榜样的分值相称。

而且Cuckoo也没有检测到该样本存在收集行径或其他敏感行径。然则当我们手动在虚拟机内运行该样本时发明该样本是存在收集行径的,也便是说该样本在沙箱中没有履行它真正的营业逻辑。首先来梳理一下这个样本在履行营业逻辑之前的流程:

让我们对照感兴趣的是拷贝自身然后重起新进程的历程:

首先是调用GetModuleFileNameA获取当前可履行文件的完备路径。

然后又调用了GetSystemDirectoryA来获取系统目录(C:\Windowssystem32),然后比对是判断当前可履行文件是否在系统目录下,假如不在系统目录下则复制自身到系统目录,启动新文件,自身退出。当新进程启动,这个判断当前路径的逻辑就会走向另一个分支,开始真正的核心营业逻辑,比如发送上线包:

在虚拟机中运行时实际行径也是如斯,在第一次运行后复制自身创建新进程,开始履行营业逻辑,但在沙箱中捕获到行径就有点不一样了:

创建的子进程也是干了和父进程一样的工作,然退却撤退出。并没有运行后面的核心营业逻辑,自然沙箱捕获不到后续的恶意行径。

0×03 细节道理

为啥相同的代码在不合的情况中会有完全不合的履行逻辑呢,看一下实际调试的环境就会发明运行到strstr函数时参数有一些猫腻:

这个函数用来判断系统目录是否是当前可履行文件路径的子串。当前可履行文件路径里面System32的S是大年夜写的,而经由过程GetSystemDirectoryA获取到的system32的s是小写的,这样纵然当前样本是存在于系统目录下,比对结果也是不在系统目录下,从而无法进入核心逻辑。由于Windows系统不区分文件路径的大年夜小写,以是System32和system32都是有效路径。然则Windows 的不合API对付路径大年夜小写的处置惩罚策略并不统一,最坑的是微软官方文档里面并没有对这些细节的描述。GetSystemDirectoryA 函数始终会返回小写的system32,然则GetModuleFileNameA返回值则取决于进程的敕令行参数,平日环境下经由过程资本治理器启动时是大年夜写的System32,但经由过程CreateProcess函数启动的话假如敕令行是小写则获取到的路径也是小写。

[1] [2]下一页

在这个样本的例子里面母体经由过程CreateProcess启动新进程的时刻传入的是小写的敕令行参数,在正常运行的环境下这个比对路径的strstr函数没有任何问题,然则在沙箱中这个strstr 的参数里面此中一个的system32的s变成了大年夜写,从而导致了运行逻辑的不合。

为啥在沙箱里面这个system32的s就变成大年夜写了呢?刨一下Cuckoo的代码就可以看到真正的缘故原由了。首先简单先容一下Cuckoo的事情道理,Cuckoo对样本行径的捕获寄托API Inline Hook,被测样本会被注入加载一个监控模块,当样本调用某个API函数时会被挟制到Cuckoo的模块内,这个模块除了老例的做log操作然后返回原函数外还会对某些API的高低文进行窜改,目的在于挟制某些API的履行逻辑。

本次案例的场景便是如斯,当恶意样本开释了别的一个文件并创建新进程时Cuckoo必要把监控模块放入新进程的内存空间中才能继承捕获新进程的行径。于是对付CreateProcess等相关API有需要在hook中加入额外逻辑,Cuckoo在CreateProcessInternalW的hook中加入了如下的一些逻辑:

监控模块会把新加入的代码会把新创建的进程的pid经由过程一个命名管道传给Cuckoo并且把新进程挂起,Cuckoo再向新创建的进程注入监控模块并解除挂起:

在对CreateProcessInternalW的hook中Cuckoo的监控模块会调用path_get_full_pathw函数,这个函数在Cuckoo Monitor的src/misc.c中有定义(https://github.com/cuckoosandbox/monitor/blob/master/src/misc.c#L503):

此中又调用了GetLongPathW这个API,而这个API的特点正好是永世会返回一个大年夜写的路径(也便是System32)。从而在沙箱中虽然经由过程CreateProcessA传入了小写的敕令行参数,但颠末Cuckoo这么一处置惩罚,参数中的路径就又变成大年夜写的了,这样一来对付这个样本而言那个对履行路径的判断便是一个永假的结果,自然在沙箱中就走不到后续的核心逻辑里面去:

如斯一来靠一个API在有hook和没有hook的环境下不合的行径体现来让样本在沙箱中有别的一套行径逻辑,从而回避检测。

0×04 结论

以往的很多样本用来抗衡沙箱采取的要领都是检测硬件信息,以此来判断是否是在虚拟机中运行,比如判断是否有Vmware、VirtualBox 的驱动模块,或者硬盘大年夜小,亦或者IDT、LDT、GDT 所在的地址范围等。而本例所使用的特性是某些API在沙箱中所体现出的不合于正常情况的行径,当经由过程CreateProcess创建进程时,敕令行中的路径的大年夜小写会被沙箱的 hook调换掉落。某种意义上来说这也算是一种新颖的检测要领,同时也裸露了反病毒沙箱可能存在的另一类轻易被人轻忽的弱点。

上一页[1] [2]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包