Sodinokibi 病毒分析报告

病毒分析 2019-11-09

该样本是云沙箱漏报的样本,需要人工分析漏报的原因,以及具体的行为分析。

反沙箱技术

该样本在运行初期,会调用 2 次 SetErrorMode 函数,通常我们分析病毒的时候,都是直接就跳过了,并没有往里面深入多想。但这却能成为反沙箱的技术手段。

img

原理

可以看下百度百科 or MSDN 的描述:

1、SetErrorMode

SetErrorMode() 函数控制 Windows 是否处理指定类型的严重错误或调用应用程序来处理它们。

2、函数原型

UINTWINAPISetErrorMode(_In_UINTuMode)

3、参数

img

SetErrorMode是用于设置如何处理程序错误的,设置不同的值有不同的作用。而 SetErrorMode 有一个特点就是返回值为上次设置的值。

SetErrorMode 有一个比较特殊的参数 SEM_NOALIGNMENTFAULTEX 该值的话,就不会清空上一个返回值,而会进行累加。

代码展示

#include "pch.h"
#include <iostream>
#include <concrt.h>
#include <windows.h>

int main()
{
DWORD dwCode;
//SetErrorMode返回的是上一次函数运行的返回值
//往往第一次都是返回0,因为前面并没有调用该函数
//开始没有设置任何值,所以返回值为0
//参数SEM_FAILCRITICALERRORS的值为1
dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); printf("the first dwCode:0x%x\n", dwCode);

}

img

#include "pch.h"
#include <iostream>
#include <concrt.h>
#include <windows.h>

int main()
{
DWORD dwCode;
//此参数是不消除标志,值为4
//第一次SetErrorMode返回0
dwCode = SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT); printf("the first dwCode:0x%x\n", dwCode);

//  这里设置值SEM_NOGPFAULTERRORBOX是2,返回值为上面设置的值所以为4
dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX); printf("the second dwCode:0x%x\n", dwCode);

// 这里设置值SEM_FAILCRITICALERRORS是1,返回值为上面的 4+2 = 6
dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); printf("the second dwCode:0x%x\n", dwCode);

}

img

我也觉得自己讲得比较拗口,大家实践一下就知道了。

沙箱运用

cuckoosandbox 里有一段代码,沙箱会预先设置值用于监控错误的发生,这里就用到了 SetErrorMode 并且其中的参数有 SEM_NOALIGNMENTFAULTEX。(ps:得要参与沙箱开发的才知道沙箱机制会使用这一段代码了)

如第一张图所示,恶意代码进行了 2 次的 SetErrorMode 函数,紧接着就是 cmp 对比。伪 C 代码示意:

img

最后修改其标志位可以让沙箱正常把病毒跑起来了。

GandCrab5.2 和他的继承者 Sodinokibi 都使用了此反沙箱的技术手段。

病毒分析

往下的病毒分析主要就是写分析流程了,当时外网发布的那篇分析文章就十分之详细

样本是个伪装成 PDF 文件的 .exe 程序,拖入 IDA 静态分析在函数列表找到 wWinMain 入口函数

先做了恶意代码运行前的前期铺垫工作,加载 kernel32.dll 模块

img

后在内存中动态解密出 payload 部分:

img

Sub_43B31B 为主要恶意函数,IDA 无法静态分析,使用 OD 动态调试函数体内动态加载各种各种模块

img

模块正常退出 leave 后跳转到 eax

img

跳转后到主线程的 c13455c1 模块

img

img

下面的代码为 opcode 不可读

1、ctrl+a 自动分析可分析出部分代码

2、右键分析-下次分析时视为 commands

可转成可读代码

img

也可以把 payload 部分 dump 下来后修复 IAT 表,可以静态分析

img

恶意代码主要逻辑部分在 sub_402d34 中:

img

恶意程序刚执行时,会为程序创建互斥体防止多开:

GlobalFDC9FA6E-8257-3E98-2600-E72145612F09

img

img

然后会调用解密函数,解密出自身的配置文件信息

解密前会通过自身校检 CRC,然后再调用解密函数解密配置信息

img

img

通过内存窗口查看,可以发现这是个 .json 文件格式的内容,可以复制提取出来

img

对配置信息中个别字段通过 TG Soft 的研究中心(CRAM)可以查到:

img

Win10 下可能会弹出请求管理员权限操作,win7 下则不需要

img

sub_40149E 函数主要执行了加密前的准备操作,秘钥的生成,电脑信息的获取等

img

根据 CPU 处理器的 CRC 和卷序列号计算得到的用户 ID,用来组成支付赎金的 URL

img

我的 ID 即:19A0218BAA25CBA3

img

img

在 sub_4021F5 函数中,生成了加密文件的秘钥信息

检索注册表信息,如果注册表 recfg 项已经存在则跳过

img

Sub_405639 是生成 pk_key 的算法,其参数 2 作为输出参数,用来保存计算出后的秘钥,再在下面被写入注册表作为键值内容

img

计算出来的秘钥值:

img

秘钥生成函数:

img

img

最后在函数套着的函数里,找到了 AES 算法:

img

AES rijndael 加密算法:

img

写入注册表操作:

img

img

sub_401B7B 函数生成了随机后缀名,用来作为加密后文件的后缀名

并且把后缀名写入了注册表的 rnd_ext 项

然后恶意程序还获取了电脑的 pc、用户名、注册表参数等

最后还获取了计算机语言和键盘布局,可以辨别中毒机器所在的地区

img

img

img

sub_40207F 函数根据之前生成的 4 个 key 值和计算机信息组合在一起,通过 CryptBinaryToStringW 函数生成字符串,并且存储在注册表的 state 项,以后还作为勒索文本中的 {key} 值

img

img

最后检查信息是否按恶意程序预期一样生成出来

img

img

调用 cmd 命令行删除系统卷轴副本,防止用户通过副本恢复系统

img

img

从 A-Z 遍历磁盘目录,为后续的加密操作做准备

img

加密函数主逻辑:

img

在 C 盘下生成勒索文档和 .lock 文件

img

恶意程序遍历文件时,提取后缀,看是否需要对此加密

img

配置文件中的白名单文件夹和后缀,确保不会加密以下内容,从而使计算机还能正常运行

img

遍历全盘文件,生成勒索文本文件

img

枚举计算机存在的网络资源

img

恶意程序创建了多线程,加快遍历加密文件的速度

img

样本使用了 I/O 端口模型进行线程间通信以及 salsa20 加密算法对系统文件进行加密

img

img

使用自绘函数代码,修改用户桌面背景

img

sub_404DDB 函数发起了网络 winhttps 通信,向服务器发送感染机器的数据

解码出域名地址

img

img

但是他的二级域名会根据下表随机组合 1:

img

img

向服务器端发送感染机器的 state 数据

img

配置文件中的 dmn 字段,包含了一堆的域名地址,最后程序都会解密出来并且一一发送连接请求

img

但是打开网址发现并非全是恶意链接,很有可能是作者故意设置,迷惑分析人员找出真正的 C&C 服务器地址

img

img

恶意程序生成的勒索文本格式:

赎金文本是从主体中准备的,主体是从 json 配置的“nbody”字段中提取的。

.json 文件中的 nbody 字段内容经过 base64 解码再经 utf-16 解码后,可以得到明文勒索内容

正文格式如下:

1、uid

2、rnd_ext

3、stat in base 64

“uid”是由“处理器品牌串”的 CRC 和卷序列号计算得到的用户 ID,用来组成支付赎金的 URL:

http://aplebzu47wgazapdqks6vrcv6zcnjppkbxbr6wketf56nf6aq2nmyoyd.onion/<;uid>

http://decryptor.top/<;uid>

访问链接中的网址:

img

img

据其病毒家族中的成员行为分析,其中配置文件中如果“exp”字段为“true”,则使用漏洞 CVE-2018-8453 通过提升特权执行 32 位或 64 位 shell,但此分析的版本字段为 false

img


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论