针对Avzhan DDoS Bot的详细介绍及样本分析

 

详细介绍

近期,我们披露了一个路过式攻击(Drive-By Attack)行为( https://blog.malwarebytes.com/threat-analysis/2018/02/chinese-criminal-experiments-with-exploits-in-drive-by-download-campaign/ )。在该攻击中,我们发现了Avzhan DDoS Bot( https://blog.malwarebytes.com/threat-analysis/2018/02/avzhan-ddos-bot-dropped-by-chinese-drive-by-attack/ )的变种。除此之外,此次攻击中还使用了多个以前的组件。在这一系列漏洞攻击中,最近的一次是从2016年开始。并且,恶意软件Avzhan也已经发布了一段时间,通过脱壳后查看其有效载荷( https://www.virustotal.com/en/file/acb086f25c082ee1e2cdc76dc40db97e1629a72b593abd16ab876b542d7c4f5c/analysis/ )的编译时间戳,我们发现其所显示的时间是2015年8月。然而,还有另一件更加不同寻常的事情引起了我们的注意,我们发现Avzhan的外层与Virut的签名相匹配,而后者自2013年以来就再也没出现过。
起初,大家都很难相信这一检测结果。原因在于,Virut作为一个较老的恶意软件,已经停止了后续开发工作,其详细信息早已由波兰互联网应急响应中心披露,并且其C&C服务器也早已被披露。那么,会有谁愿意继续使用这样的恶意软件呢?我们猜想,有可能作者想要用这样的加壳方式,将DDoS Bot与Virut进行混淆。
经过进一步研究,我们发现该检测结果没有问题。Avzhan Bot确实携带了一个合法的Virut。但并不是发布者故意为之的,而是该攻击服务器恰巧感染了Virut病毒,该病毒附着于DDoS恶意软件,并且随着路过式攻击的过程,进入到感染者的计算机中。更有意思的是,在2016年,Virut的代码在中国生产的摄像机中被发现( https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=https%3A%2F%2Fzaufanatrzeciastrona.pl%2Fpost%2Fecho-slynnego-polskiego-botnetu-powraca-w-chinskiej-kamerze%2F&edit-text=&act=url )。其原因在于,产品开发人员的计算机感染了Virut,并通过这种方式进一步传播了代码。
由于这些意外,Virut已经重新出现在我们的面前,因此本文将对其工作原理进行分析。

 

分析样本

我们本次主要分析的样本MD5为05749f08ebd9762511c6da92481e87d8。

 

行为分析

Virut的行为就像是经典的感染型病毒。我们观察到,由Virut感染的样本总会在64位系统上发生崩溃。


然而,在32位环境中部署时,Virut就拥有了野火燎原般的传播能力,试图将自己的代码附加到所有的可执行文件上,以此来尽可能多地感染文件。Virut的代码是多态的,并且其设计非常谨慎,所以我们并不容易掌握其感染模式。如果有足够的空间,Virut通常会用随机的名字添加一个新的空白段,例如:


如果在输入文件中,没有一个用于新建头部的空间,那么这一步骤将会省略。所以,假如文件没有新增的段,并不能证明这个文件没有被感染。另外一个可疑的地方是,如果发现文件被设置为RWX权限(Read-Write-Execute),那么很可能该文件已经被感染。
Virut会更改段的大小,同时也会更改应用程序的入口点,以便重定向到自己的代码。在恶意代码执行完成后,还会继续执行原始入口点,因此从用户的角度来看,受感染的应用程序还和以前一样能够正常工作。
除了感染磁盘上的文件之外,Virut还会攻击正在运行的进程。因此,即使第一个被感染的进程被杀死了,恶意代码仍然会在内存中运行。
该恶意软件使用了一些硬编码的C&C地址,同时还使用了DGA域名生成算法。通过查看网络流量,我们可以看到对域名的查询操作遵循在“.com”前使用六个字母的模式:6 {a-z} .com。


由于Virut的结构及原理已经完全被掌握并封堵,因此其C&C服务器没有任何活动。

 

内部分析

感染模式

正如之前所述,Virut的代码可能会发生改变,在不同计算机上的感染可能会不尽相同。一些模式的选取取决于输入的特征。
在PE文件中,每个段必须与PE头部中文件对齐字段所指示的最小单位对齐。这就是为什么有时在一个PE段与另一个PE段之间,会有一个空的部分,里面只有填充的内容。这一空的部分被称为洞(Cave)。以前,一些病毒经常会使用这一空间来植入他们的代码,Virut也不例外。
在下面的例子中,.text段之后的洞已经被恶意代码填充:


根据输入,段之间可能没有大小足够的洞。Virut会在最后一个段的末尾添加代码:


然而,上述不是影响感染特征的唯一因素。由于Virut生成的代码是多态的,所以同一个文件不会以相同的方式被感染两次。下面是我们对同一个应用程序代码进行的比较,在Virut两次不同的运行过程中对其进行了感染:

Virut的Shellcode

附加到受感染文件的代码会创建一个初始存根(Stub),并在Virut的Shellcode内存中进行脱壳。这是恶意软件的核心。下面是脱壳后的Shellcode:


相同代码也会被注入到其他进程中。它会被植入到内存的一个新页中,例如:


Shellcode包含一个用户空间Rootkit的功能,它在每一个被感染的进程中都挂钩了NTDLL,以便每次调用特定函数时,执行都会首先被重定向到Virut的植入代码部分。其中,有7个函数被挂钩,它们分别是:

NtCreateFile
NtCreateProcess
NtCreateProcessEx
NtCreateUserProcess
NtDeviceIoControlFile
NtOpenFile
NtQueryInformationProcess

接下来,我们以NtCreateFile为例。如大家所见,第一条指令是对恶意内存页的调用:


被调用代码如下:


我们还找到了反病毒产品的清单,Virut会检测自身是否受限制的环境中运行:


除了Rootkit之外,它还包含负责与C&C通信的代码。例如,在嵌入的字符串中,我们发现IRC命令,这就意味着Virut借助于IRC进行一部分的通信:


命令模式列表如下:

PING
NICK nrmbhoz
PRIV
JOIN #.%d
DSTAMP %s%02d%02d

下面是C&C服务器的硬编码地址。其中两个服务器是静态的,并且总是出现在Virut样本之中(这两个服务器已被波兰CERT通过Sinkhole方式封堵):

ilo.brenz.pl
ant.trenz.pl

接下来,我们查看Virut的DGA生成的域名:


当感染文件的代码发生变化时,注入的Shellcode仍保持较为一致的结构。如果我们对两个不同进程的转储进行比较,会发现大部分代码都是相同的。

 

结论

随着技术的不断发展,如今一些老式病毒已经被大家遗忘,但这并不意味着这些病毒不会再带来任何风险。但幸运的是,目前大多数反病毒产品都可以通过签名的方式来检测到Virut等病毒。然而,对于不使用反病毒产品的用户,他们仍有被感染的风险。
即使是命令与控制服务器已经挂掉,但这些老式病毒依然可以不断感染传播。在全世界,仍有不少的服务器被老式病毒所感染,例如Virut和MyDoom。在我们的蜜罐上,仍然经常能收到来自这些废弃Bot主机的垃圾邮件。
但是,在较为流行的路过式攻击过程中,能发现一类老式病毒,这是不寻常的。我们并不知道旧的威胁是如何与新威胁相结合的,但我们却知道这样的结合无疑会带来更大的风险。这一次我们非常幸运,攻击的过程比较简单,且受影响用户也比较小。
Malwarebytes将该DDoS Bot的二进制文件检测为Torjan.Bayrob。

(完)