Mydoom邮件传播蠕虫样本分析

一、Readme模块分析

1、样本标签

标签名 描述
原始⽂件名 Readme.exe
MD5 194B2F31CC40249C041A5581E6A12A5B
⽂件⼤⼩ 41.6 KB (42,624 字节)
⽂件格式 Win32 Exe
时间戳 1970-01-01 08:00:00
加壳类型 UPX
编译语⾔ C/C++
SHA1 D3D8BEE614F04572DA7EAA26D51C15EBB3C8D6C2
CRC32 BB433F23

2、详细分析

样本(194B2F31CC40249C041A5581E6A12A5B)首先检查是否处于调试环境和虚拟机环境。

image-20221108104256332

image-20221108104413183

然后使用自写的字符串解密算法将字符串”fureinaf.qyy”解密为”shervans.dll”,并与路径%SYSTEM32%进行拼接后添加到注册表进行COM组件劫持,实现持久化。

image-20221108104646144

其中样本的字符串解密算法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
BYTE* __cdecl sub_404AD6(BYTE* a1, char a2)
{
BYTE* v2; // ecx
int v3; // ebx

v2 = a1;
if (*a1)
{
if ((char)*a1 == a2)
return v2;
do
++v2;
while (*v2 && (char)*v2 != a2);
}
v3 = 0;
if ((char)*v2 == a2)
return v2;
return (BYTE*)v3;
}

int __cdecl DecryptChar_404B16(char a1)
{
BYTE* v1; // eax
int v2; // edx
BYTE* v3; // eax
BYTE v5[32] = "abcdefghijklmnopqrstuvwxyz"; // [esp+18h] [ebp-48h] BYREF
BYTE v6[40] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // [esp+38h] [ebp-28h] BYREF

v1 = sub_404AD6(v6, a1);
if (v1)
return v6[(v1 - v6 + 13) % 26];
v3 = sub_404AD6(v5, a1);
v2 = a1;
if (v3)
return v5[(v3 - v5 + 13) % 26];
return v2;
}

void __cdecl strcpy_404C38(BYTE* a1, char* a2)
{
char* i; // ebx
char v4; // [esp+0h] [ebp-Ch]

for (i = a2; *i; ++a1)
{
v4 = *i++;
*a1 = DecryptChar_404B16(v4); //解密
}
*a1 = 0;
}

接着通过注册表Software\Microsoft\Windows\CurrentVersion\Explorer\vulnvol32\Vers是否存在来判断是否为首次运行样本。

image-20221108105115626

image-20221108115655959

经过分析后可得知样本使用的注册表内容含义如下:

项名 描述
iduser 唯一标识ID
usw 自身认证
pafw 自身认证
statem 窃取传播邮件功能开关
usbactiv 感染可移动磁盘功能开关
namecp 感染可移动磁盘中autorun.inf执行的恶意模块名

image-20221108130527982

2.1 初始化

创建了一个名为VULnaShvolna的互斥体,确保样本单例运行。

image-20221108105527041

然后读取注册表中Software\Microsoft\Windows\CurrentVersion\Explorer\vulnvol32\Versstatem项来判断当前是否有运行传播恶意邮件模块,没有则启动。

image-20221108105736279

接着再创建一个名为x_socks5aan的互斥体,并读取Software\Microsoft\Windows\CurrentVersion\Explorer\vulnvol32\Versusbactiv判断是否有感染U盘模块运行,没有则启动。

image-20221108115627027

然后执行函数remote_407c4E,进行与C2通讯执行rce。

2.1.1 收集邮箱并发送恶意邮件

首先将grcopy.dll(实际为Readme.exe)文件压缩为zipfi.dll文件和zipfiaq.dll文件,压缩文件名分别为readme.exe、foto.pif,用于后续邮件附件发送。

image-20221108121336444

然后从C盘开始遍历磁盘。

image-20221108120411393

image-20221108143148932

image-20221108120437883

并筛选文件后缀名为html、htm、php、doc、xml、txt、pl、tbb的文件。

image-20221108120539969

然后搜索这些文件中是否存在邮箱格式的数据。

image-20221108120618112

其中会过滤掉一下这些特殊邮箱格式。

image-20221108121007084

获取到邮箱后,开始随机拼接邮件的主题、内容、附件和发件人。

image-20221108120746829

随机的内容、主题、附件名、发件人如下:

image-20221108120950223

image-20221108121025350

image-20221108120920022

最后连接SMTP服务器将样本压缩文件作为附件一同发送给目标邮箱。

image-20221108121103348

image-20221108121109044

通过样本字符串在github上关联到部分实现代码:https://github.com/ChinesesBlueSky/learngit/blob/a22988db03194f043033e041884993f88c084fd4/wazuh/src/os_maild/sendmail.c

image-20221108121207928

由于C2失活,因此无法获取样本建立stmp连接时使用的账号密码。

2.1.2 感染可移动磁盘

将satornas.dll修改为autorun.inf后写入到可移动磁盘中。

image-20221108121543379

satornas.dll的实际内容如下:

image-20221108121720073

2.1.3 远程命令执行

首先将url和C2进行解密,用于后续访问。

image-20221108121848675

C2的生成使用了DGA算法生成。DGA 域名生算法以当前时间为种子。

image-20221108122021685

image-20221108141433891

image-20221108141405789

然后通过拼接解密出的c2+url进行get请求访问文件进行认证。

image-20221108122813293

image-20221108122853440

返回的数据进行解密判断认证是否成功。

image-20221108122909074

最后与C2进行建立通讯。

image-20221108122238589

命令解析。

image-20221108123042152

其中各项指令有如下含义:

指令 描述
http GET请求向服务器发送数据
spamon 关闭发送邮件功能
down_file 下载文件
pusk 下载文件并执行
restart 重新启动样本文件
socksa 设置注册表的usw和pafw
flash_on 开启磁盘感染功能
flash_off 关闭磁盘感染功能
icmp TCP协议向服务器发送数据

2.2 非初始化部分

当初始化完毕或并非首次执行时,首先将资源数据进行解密,解密后的数据实际上为PE文件,样本将恶意模块覆盖到系统原文件ctfmon.exe进行伪装,并将use32.dll的时间戳替换到新的ctfmon.exe中。

image-20221108123820213

image-20221108124059545

同理,解密另一个资源数据解密后,以shervans.dll为名写入到System32目录下。

image-20221108123952364

然后随机生成一个iduser,写入到注册表中。

image-20221108124228654

并将自己伪装成grcopy.dll写入到System32目录下。

image-20221108124253955

最后通过APILoadLibrary函数将shervans.dll加载,并执行ctfmon.exe。

image-20221108124352302

二、ctfmon模块分析

1、样本标签

标签名 描述
原始⽂件名 ctfmon.exe
MD5 4C1F6CF4E7DA5C96D6279B02B349B9FD
⽂件⼤⼩ 4.06 KB (4,160 字节)
⽂件格式 Win32 Exe
时间戳 1970-01-01 08:00:00
加壳类型 UPX
编译语⾔ C/C++
SHA1 38E767685A76319D01E75C2DDFE9EC0A166BC706
CRC32 67CE3B69

2、详细分析

样本(4C1F6CF4E7DA5C96D6279B02B349B9FD)的作用为执行模块smnss.exe(实际上为样本原始文件)和加载shervans.dll。当执行smnss.exe失败,则加载shervans.dll

image-20221108124928779

三、shervans模块分析

1、样本标签

标签名 描述
原始⽂件名 shervans.exe
MD5 1C437748F7AB08B03BEB56CFA69016B5
⽂件⼤⼩ 8.50 KB (8,704 字节)
⽂件格式 Win32 DLL
时间戳 2010-05-20 17:10:51
加壳类型 UPX
编译语⾔ C/C++
SHA1 B420D23E3CF680021EEA8C4B14685306024EAEE3
CRC32 F627F616

2、详细分析

样本(1C437748F7AB08B03BEB56CFA69016B5)首先将grcopy.dll修改为smnss.exe

image-20221108125408991

然后创建一个名为x_socks5aan的互斥体后,在C盘写入了文件satornas.dll,该文件实际上为一个autorun.inf文件。

image-20221108125505024

image-20221108125514696

并将grcopy.dll复制到磁盘根目录,名称是注册表配置项中的namecp

image-20221108125730940

然后执行smnss.exe。

image-20221108125653750

添加shervans.dll到注册表实现COM组件劫持、添加ctfmon.exe到注册表启动项。

image-20221108125901981

image-20221108130320170

最后以本机为服务器,启动并监听端口3159,等待连接并执行接收到的指令

image-20221108130206441

四、IOC

一、MD5

文件名 MD5
Readme.exe 194B2F31CC40249C041A5581E6A12A5B
ctfmon.exe 4C1F6CF4E7DA5C96D6279B02B349B9FD
shervans.dll 1C437748F7AB08B03BEB56CFA69016B5

二、HOST

HOST
hxxp://qehspqnmrn.info
hxxp://qehspqnmrn.info/imgs/krewa/nqxa.php
hxxp://qehspqnmrn.info/imgs/xvima/mvid.php
hxxp://qehspqnmrn.info/imgs/ckanp/load.php
hxxp://qehspqnmrn.info/imgs/necxa/qnumz.php

三、开源报告