1. 威客安全首页
  2. 默认分类

Sodinokibi 病毒分析报告

本文作者:RedScarf(信安之路病毒分析小组成员 & 信安之路首次投稿作者)

获得奖励:免费加入信安之路+邀请加入信安之路核心群+获得 90sec 论坛邀请码一枚

成员招募:信安之路病毒分析小组寻找志同道合的朋友

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

反沙箱技术

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

Sodinokibi 病毒分析报告

原理

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

1、SetErrorMode

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

2、函数原型

UINTWINAPISetErrorMode(_In_UINTuMode) 

3、参数

Sodinokibi 病毒分析报告

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的值为1dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); printf("the first dwCode:0x%xn", dwCode);
}

Sodinokibi 病毒分析报告

#include "pch.h"#include <iostream>#include <concrt.h>#include <windows.h>
int main(){DWORD dwCode;//此参数是不消除标志,值为4//第一次SetErrorMode返回0dwCode = SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT); printf("the first dwCode:0x%xn", dwCode);
//  这里设置值SEM_NOGPFAULTERRORBOX是2,返回值为上面设置的值所以为4dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX); printf("the second dwCode:0x%xn", dwCode);
// 这里设置值SEM_FAILCRITICALERRORS是1,返回值为上面的 4+2 = 6dwCode = SetErrorMode(SEM_FAILCRITICALERRORS); printf("the second dwCode:0x%xn", dwCode);
}

Sodinokibi 病毒分析报告

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

沙箱运用

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

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

Sodinokibi 病毒分析报告

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

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

病毒分析

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

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

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

跳转后到主线程的 c13455c1 模块

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

下面的代码为 opcode 不可读

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

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

可转成可读代码

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

GlobalFDC9FA6E-8257-3E98-2600-E72145612F09

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

我的 ID 即:19A0218BAA25CBA3

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

计算出来的秘钥值:

Sodinokibi 病毒分析报告

秘钥生成函数:

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

AES rijndael 加密算法:

Sodinokibi 病毒分析报告

写入注册表操作:

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

加密函数主逻辑:

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

解码出域名地址

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

赎金文本是从主体中准备的,主体是从 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>

访问链接中的网址:

Sodinokibi 病毒分析报告

Sodinokibi 病毒分析报告

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

Sodinokibi 病毒分析报告

 

Sodinokibi 病毒分析报告

原文始发于微信公众号(信安之路):Sodinokibi 病毒分析报告

本文转为转载文章,本文观点不代表威客安全立场。

发表评论

登录后才能评论

联系我们

4006-119-120

在线咨询:点击这里给我发消息

邮件:public@jinlongsec.com

工作时间:周一至周五,9:30-18:30,节假日休息

X