前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >针对“DorkBot”的样本分析

针对“DorkBot”的样本分析

作者头像
FB客服
发布于 2018-02-23 03:30:01
发布于 2018-02-23 03:30:01
1.4K0
举报
文章被收录于专栏:FreeBufFreeBuf

概述

DorkBot是一种已知的恶意软件,最早可以追溯到2012年。它被认为通过社会媒体链接、即时消息应用程序或受感染的可移动设备等多种方式进行传播。尽管它是众所周知的恶意软件家族中的一员,但我们相信已经有更多的网络感染了Dorkbot,而且超过了我们之前的预计,其中受影响最大的国家是斯里兰卡、印度和俄罗斯。

Dorkbot感染的地理分布

恶意软件本质上是一个通用的下载器和一些二进制组件的启动器,主要模块是用于执行DDoS攻击或窃取密码。此次的分析是基于在过去一个月中多次捕获到的一个在野样本。

DorkBot恶意软件被打包在一个dropper中,其中payload被嵌入到一个RC4加密的blob(二进制大对象)中。这个blob可以在二进制编码的资源部分中找到,并且使用Base64编码。

图1: Base64 编码& RC4加密资源

RC4密文的前缀是32字节的元数据,其中包含了以字节为单位解密的RC4密钥。

图 2: 解码资源的结构

dropper先对Base64编码的payload进行解码,然后对其进行后续解密,最后的结果由一段用于PE加载的shellcode和恶意软件原始二进制文件组成。在解密之后,控制权被移交给位于原始二进制文件中的shellcode,然后将其进行装载并执行入口处代码。

图3: 解密和执行嵌入在资源中的payload

该恶意软件的dropper可以通过一个特殊的循环来识别,该循环中会出现一个消息框调用一个未定义的句柄,其值为0xFFFFA481,显示文本为“Will exec”。

Payload

Payload主要包含下列行为:

检验参数:如果是一个文件名作为参数传递,它将在当前目录中查找并使用ShellExecuteW执行。但是,如果参数以“\”结尾,那么它将被假定为一个目录名。在后一种情况下,通过使用ShellExecuteW生成“exe”,将目录路径附加到当前目录作为参数,并在新窗口中打开。该特性是为了在恶意软件下运行其他进程,并利用它来替换所有的快捷方式来运行恶意软件,然后使用它来生成实际的快捷路径,从而在系统中实现长时间驻留。

拷贝自身:恶意软件会在%appdata%中创建自己的副本。

虚拟机使用SetupDiGetDeviceRegistryPropertyA获取硬盘的设备名称,并检查它是否包含一个下面的子字符串:“vbox”、“qemu”,“vmware”,“virtual hd”。如果包含,恶意软件将判断为在虚拟机中运行,进而会终止进程。

终止自启动进程:枚举以下注册表项,关闭所有非恶意软件相关的自启动进程:

图4: 通过注册表run key键值,枚举和终止自启动进程

计算ComputerID:每台被感染的机器都有一个“#”格式的ID,其中第二个参数是系统信息缓冲区的MD5哈希,其结构如下:

在运行时可以看到这种结构的一个例子:

图 5: 用于计算Machine ID的hash值的缓冲区结构

计算GUID:恶意软件中的大多数对象(事件、互斥、文件名等)都是基于生成的GUID来命名的,此次的GUID按照如下方式构建(基于前面提到的系统信息结构,当前进程所有者的SID和一个key作为参数传递给GUID生成函数):

APC注入:创建一个挂起的进程,将恶意软件的内存映射注入进去,将其主线程的控制函数(接下来要叙述的)作为一个APC队列,并恢复其主线程。因此,上述函数开始运行在svchost.exe进程中。

工作线程控制函数:该函数包含恶意软件的主要功能,以线程的形式调用各种功能。预计这个函数将会在前面提到的APC注入后的宿主exe中运行,如果失败,将在当前进程的上下文中运行。然而由于代码中出现的一个bug,后者将不会在现实中发生。在进程句柄关闭后,正在启动的svchost.exe主线程句柄也会关闭。这会导致进程崩溃,从而避免进一步的恶意活动。

函数本身的行为如下:

Ø PE加载操作,即进行重定位操作以及解析导入的恶意软件映射的执行。 Ø 创建一个隐藏的计划任务(使用ITask COM类),该任务设置为在当前用户的登录时启动。 Ø 创建注册表runkey,在HKCM\Software\Microsoft\Windows\CurrentVersion\Run。键的名称是预先生成的GUID,路径为复制到%appdata%下的恶意文件。 Ø 在一个单独的线程中删除原始的恶意软件文件(除非当恶意软件从一个非移动介质运行,并成功地注入到exe)。

如果恶意软件是由可移动的媒体执行的,它将在HCKU\Software\Classes\CLSID下注册一个指定的类,类名是GUID,键值为0xDEADBEEF。

图6:恶意软件注册一个类

文件修改监控:一个线程会不断地计算%appdata%下复制的恶意二进制文件的CRC32,并将其与原始文件的CRC32进行比较。一旦发生变化,复制文件会被删除,并将其重写为原始文件的内容。

图7: 文件更改监视器代码

替换快捷方式:遍历所有安装的驱动器(通过GetLogicalDriveStringsW获取)并枚举所有文件,以找到具有“.lnk”扩展名的文件。如果找到这样的文件,则通过以下参数去执行exe去修改目标路径(使用IPersistFile COM类):

Ø 由恶意软件生成的包含恶意软件副本的路径。 Ø 枚举文件的路径,它将通过执行恶意软件本身来调用。

注入进程监控代码:该恶意软件将枚举所有正在运行的进程,并排除64位进程、当前进程和运行名为“teamviewer.exe、tv_w32.exe”的进程。

图8:将TeamViewer排除在注入的目标进程之外。

所有其他进程(以及恶意软件创建的notepad.exe进程)将被注入以下代码:

图9:注入进程监视代码

指针0x11111111、0x22222222、0x33333333和0x44444444将在注入函数之前被替换,如下所示:

图10: 在进程监视payload中把无效指针替换成真实的函数指针

注入的代码本身将无限期地等待一个事件,当原始的恶意软件进程被终止时,信号量将会被释放。当出现这种情况,注入的进程监控代码将会再次启动恶意软件。

l通信:所有C2域名都存放在一个以AES256-CBC加密的blob二进制文件中,排列成一个指针列表,在.data区段偏移16的位置中可以找到。

图11:被加密的CnC域名表

解密的密钥为“GD!brWJJBeTgTGSgEFB/quRcfCkBHWgl”。

图12:CnC域名的解密函数

在恶意软件中可以观察到以下类型的通信:

Ø HTTP GET 请求一个文件从样本的C2服务中。C2将通过“v%d”格式的子域进行联系,其中的%d数值是从运行时的全局变量中获取。如果从服务器成功返回一个文件,那么它将一10字符的随机数命名存在在%appdata%下,并使用CreateProcessW启动。 注意:其他变种的恶意软件可能使用不同的子域名,例如“up%d”。 Ø 基于TCP的原始协议,用于获取可从中下载文件的新CnC地址。协议请求消息是一个包含170个字节的缓冲区,具有以下结构:

图13:请求CnC的原始协议结构

响应包由517字节组成,具有以下结构:

图14:来自CnC的响应包

IOCs

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
数据结构常见的八大排序算法
前言 八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 常见的八大排序算法,他们之间关系如下: 他们的性能比较: 下面,利用Python分别将他们进行实现。 直接插入排序 算法思想: 直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。 因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成: 第一层循环:遍历待比较的所有数组元素 第二层循环
小莹莹
2018/04/23
1.2K0
数据结构常见的八大排序算法
八大排序算法总结与java实现
概述 因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结。首先罗列一下常见的十大排序算法: 请点击此处输入图片描述 我们讨论的这八大排序算法的实现可以参考我的Github:SortAlgorithms,其中也包括了排序测试模块[Test.java]和排序算法对比模块[Bench.java],大家可以试运行。 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 请点击此处输入图片描述 一、直接插入排序(In
企鹅号小编
2018/01/18
1.1K0
八大排序算法总结与java实现
算法 | 数据结构常见的八大排序算法
01 前言 八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较:
用户1332428
2018/03/08
1K0
算法 | 数据结构常见的八大排序算法
八大排序算法详解_面试+提升
八大排序算法详解_面试+提升 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大
Java帮帮
2018/03/15
1.4K0
八大排序算法详解_面试+提升
八大排序算法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hguisu/article/details/7776068
用户2965768
2019/06/20
7590
八大排序算法
【数据结构】七大排序算法
排序的相关概念 排序的分类 根据在排序过程中带排序的记录是否全部被放置在内存中,排序分为: 内排序 外排序 1.内排序 内排序是在排序整个过程中,带排序的所有记录全部放置在内存中。 影响内排序的主要因素: 时间性能。(主要受比较和移动两种操作的影响) 辅助空间。 算法的复杂性。 内排序的分类 根据排序过程中借助的主要操作,内排序分为: 插入排序 交换排序 选择排序 归并排序 2.外排序 外排序是由于排序的记录个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行。 按照算法的复杂
我就是马云飞
2018/02/05
1.2K0
【数据结构】七大排序算法
八大排序算法
(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
哲洛不闹
2018/09/19
3970
八大排序算法
八大排序算法
​ 八大排序算法是面试经常考到的,尤其是快排,希尔排序和归并也是经常会让写代码的题目,其实只要用一句话说明了他们的原理我们写起代码就没那么困难。 冒泡排序 思想:有 n 个数我们就进行 n-1 趟排序,每一趟我们都选取最大的一个数放到已经排序的位置即可。 伪代码:两个 For 循环,外层表示要进行的趟数,内层则是找出最大的数,找最大的数的方法就是比较、交换。 时间复杂度:O(n2) 空间复杂度:O(n) 代码: package Sorting; import org.junit.jupiter.ap
lwen
2018/04/17
9370
八大排序算法
面试中的 10 大排序算法总结
查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。通常查找和排序算法的考察是面试的开始,如果这些问题回答不好,估计面试官都没有继续面试下去的兴趣都没了。所以想开个好头就要把常见的排序算法思想及其特点要熟练掌握,有必要时要熟练写出代码。
哲洛不闹
2018/09/18
1.2K0
面试中的 10 大排序算法总结
超全 | 七大排序算法图文详解
原文:https://www.jianshu.com/p/876931436177
攻城狮的那点事
2020/01/14
6540
超全 | 七大排序算法图文详解
排序算法 归纳总结
一、直接插入排序、冒泡排序和简单选择排序是最基本的排序方法,它们主要用于元素个数n(n<10000)不是很大的情形。
week
2018/08/24
6190
八种排序算法
来源:juejin.im/post/5cb6b8f551882532c334bcf2
Java团长
2019/08/31
1.1K0
Python数据结构与算法 实现八大经典排序算法
在面试题中可能会遇到排序算法,毕竟作为程序员内功心法,熟练掌握排序算法是很重要的,本文总结了八大经典排序算法的 Python 实现。排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
叶庭云
2021/12/01
3590
Python数据结构与算法  实现八大经典排序算法
我的软考之路(六)——数据结构与算法(4)之八大排序
排序是编程的基础,在程序中会经常使用,好的排序方法可以帮助你提高程序运行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来。无论你的技术多么强,如果没有基础也强不到哪去。
程序猿小亮
2021/01/28
6870
八大排序算法的 Python 实现!
今天CoCo酱给大家介绍一下关于八大排序算法的Python实现,对八大排序算法进行详细描述和代码实现,下面我们一起来看一下吧。 1、插入排序 描述: 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,
企鹅号小编
2018/02/01
8970
八大排序算法的 Python 实现!
【Java系列】八大排序算法
时隔4年,我终于把八大排序算法梳理了一遍,比起大学时零零散散的学习,现在就是一个大规范,当然代码是从优秀小伙伴那里Ctrl+C过来的,就是当我复习了一遍好多年没考过的题吧,哈哈哈。
用户9913368
2022/08/13
2180
【Java系列】八大排序算法
【愚公系列】软考中级-软件设计师 022-数据结构(排序算法)
直接插入排序是一种简单直观的排序算法,它的思想是将一个序列分为有序和无序两部分,每次从无序部分中取出一个元素,插入到有序部分的正确位置上,直到整个序列有序为止。
愚公搬代码
2024/02/03
3340
十大经典排序算法动图演示+Python实现
而今天这篇文章,转自 Github 上一个项目,此项目整理了 10 个常见排序算法的原理、演示和多种语言的实现。这里我们摘录其中 Python 的实现,分享给大家。
Crossin先生
2020/01/16
1.4K0
十大经典排序算法动图演示+Python实现
八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等
一、直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度二、希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度三、简单选择 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度四、堆排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度五、冒泡排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度六、快速排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度七、归并排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度八、基数排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度总结
用户7886150
2020/12/04
2760
十大经典排序算法(Python代码实现)
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:
Python数据科学
2018/08/06
2.4K0
十大经典排序算法(Python代码实现)
相关推荐
数据结构常见的八大排序算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档