rmnet蠕虫病毒样本分析

rmnet蠕虫病毒样本分析

目录

0x00基本信息

样本名称ff5e1f27193ce51eec318714ef038bef_ff5e1f27193ce51eec318714ef038bef.vir
文件大小56320 byte
是否加壳3层UPX
样本类型感染型蠕虫病毒
MD5ff5e1f27193ce51eec318714ef038bef

0x01 概述

12
木马病毒特点感染传播
攻击人群移动磁盘用户和网络用户
活跃地区全国各地
传播方式通过浏览器访问被感染的html,移动磁盘自启动

0x02流程图

流程图有些繁琐

0x03 技术细节详细分析

第一层壳

解密出PE文件

常规UPX壳,ESP定律常规脱壳
在这里插入图片描述

第二层壳

第二层壳,看着像是将文件解密出来,本质还是个壳

在这里插入图片描述

偷了个技术,直接在脱第一层壳的时候,利用硬件断点还在一直F9,(前提我们知道他除了第一层壳还有壳)

直到再次看到popad

找到popad

在这里插入图片描述
等一个大跳就到了第二个壳之后的OEP:

脱完第二个壳发现图标都变化了:
左边是没脱壳的

在这里插入图片描述

这时,就能看到比较正确的程序代码了:

检查环境

首先,程序通过
HKEY_CLASSES_ROOT\http\shell\open\command
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\IEXPLORE.EXE"
两个注册表项
以及扩展环境变量
"%ProgramFiles%\Internet Explorer\iexplore.exe" 的值来检测iexplore.exe 是否存在

在这里插入图片描述
如果存在iexplore.exe等与http协议关联的浏览器程序 才会继续进行下面的操作:
注意:这里指存在是指路径存在并且有值,但不一定非是IE浏览器,进行判断的通过条件只要是找到了HTTP协议关联的程序就能继续进行操作。

检测互斥量 KyUffThOkYwRRtgPP 是否存在

如果互斥量不存在 那就返回创建的KyUffThOkYwRRtgPP互斥量的句柄
如果互斥量已经存在,就释放掉当前互斥量,并返回0。
在这里插入图片描述

在这里插入图片描述

只有互斥量不存在时,才会执行重新设置互斥量hMute=HANDLE_FLAG_INHERIT, 程序代码也才会正常执行:

在这里插入图片描述
检测完互斥量,接下来检测自身是否在固定磁盘下运行,并且名称是否是DesktopLayer.exe。

在这里插入图片描述

如果不同时满足上面两个判断条件,则程序会按顺序遍历下面的系统环境的目录,直到找到一个可以创建Micsoftware文件夹的目录 便不再遍历。

然后返回完整目录路径+DesktopLayor.exe的路径

下面是该函数的备选路径:

%ProgramFiles%
%CommonProgramFiles%
%HOMEDRIVE%%HOMEPATH%
%APPDATA%
SystemDirectory
WindowsDirectory
TempPath

在这里插入图片描述

然后将自身文件拷贝到返回的完整路径中并运行,然后退出当前进程

在这里插入图片描述

准备注入iexplore.exe

获取一些ntdll.dll的导出函数地址,并保存在全局变量中。

在这里插入图片描述
在这里插入图片描述

hook ZwWriteVirtualMemory 由于用CreateProcess创建iexplore.exe的进程的时候,会调用ZwWriteVirtualMemory API 所以利用 hook ZwWriteVirtualMemory函数的方式去注入iexplore.exe

首先,先对ZwWriteVirtualMemory函数地址所在的空间,修改访问权限而使得可以进行修改。

然后对ZwWriteVirtualMemory函数前五个字节进行处理。以方便接下来进行填充 jmp addr

在这里插入图片描述

流程图:

在这里插入图片描述

emmm 就是上图那样 hook了ZwWrite…函数

代码实现:

在这里插入图片描述

为什么要使用ZwWriteVirtualMemory函数,而不是别的函数?

在这里插入图片描述

hook ZwWriteVirtualMemory函数:
首先修改需要hook的函数地址前五个字节的访问权限,
修改为jmp 到自己想要的函数。
本次样本 hook 到了402a59函数地址

hook后的ZwWriteVirtualMemory函数:

在这里插入图片描述

对应的反汇编:

在这里插入图片描述

注入Iexplore.exe

hook ZwWritevirtualMemory函数成功之后,调用CreateProcess 函数创建一个iexplore.exe进程,并触发被hook的ZwWriteVirtualMemory

在这里插入图片描述

现在来看看hook ZwWriteVirtualMemory之后,hook到的函数都做了些什么事情

首先需要先把原先ZwWriteVirtualMemory函数该做的事情做了,就像上面hook流程图中的call 0x1116

代码:

在这里插入图片描述

sub_402002 是主要注入函数

该函数在当前进程中 申请了和要远程注入的相同基址20010000 ,避免了要频繁计算地址差值和重定向数据的一些麻烦,然后把dll在当前内存中展开,然后注入到iexplore.exe

在这里插入图片描述

此外,为了dll在进程中完整顺利运行,还将

1.初始化导入表的代码,  
2.修改页保护的代码,
3.修复IAT表并启用2,3步写入的代码以及调用dll文件 的代码,
4,一些运行所需的数据以及调用启动3步代码的 代码

都注入了iexplore.exe

在这里插入图片描述

恶意六线程

在启用六个恶意线程之前,会先进行socket的初始化和系统信息获取:

本地磁盘信息
磁盘序列号信息
系统版本信息
语言环境信息

获取系统信息

在这里插入图片描述
初始化Socket服务
在这里插入图片描述

线程1: 7ACA 自启动

每一秒都读取一次注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon,并判断Userinit的值是否有样本文件目录c:\programfiles\microsoft\Desktoplayer.exe 是否在键值中,如果不在就将样本文件目录加到该注册表项的键值中,从而达到开机自启的目的。

代码

在这里插入图片描述

线程2: 7626 测试网络连通性

测试与 google.com ,bing.com , yahoo.com 这三个主机80端口的访问,一旦有一个可以访问,就停止测试,并保存两次能够连通的时间差多少秒

在这里插入图片描述

线程3: 781F 记录连通时差

每一分钟都向**“C:\Program Files\Internet Explorer\dmlconf.dat”**文件中写入一个16字节的数据,前八个字节是获取的系统时间,接着4个是联通网站的时间差,后四个是0.

在这里插入图片描述

线程4: 790C 发送本机信息接收返回指令

每十分钟向“fget-career.com”服务器发送当前系统时间以及本机信息,并接受服务器返回的指令 。端口:443

在这里插入图片描述

线程5: 6EA8 感染exe/dll/html/htm文件

每30秒遍历固定磁盘DRIVE_FIXED和移动磁盘DRIVE_REMOVABLE

在这里插入图片描述
在这里插入图片描述
先过滤掉文件的白名单:"." ,"…" ,“RMNetwork” 如果是这三个文件或文件夹不进行遍历
.是当前文件夹的意思, …是上层目录,RMNetWork 可能是作者自己存储信息用的文件夹。

在这里插入图片描述
如果这些都不是,并且是个文件而不是文件夹的话,进行判断是exe文件还是html文件,用不同的方法进行加密:
在这里插入图片描述

感染exe/dll

如果是exe/dll 则对文件继续进行判断,判断该文件能不能够被加密:

文件大小是否大于64字节
文件PE格式是否正确
文件大小足够有NT头
文件Machine的值为Intel 386
文件是32位文件
文件没签名
文件不是通过C#和.Net编译的

在这里插入图片描述

继续判断2,通过判断是否有rmnet节表,来判断是否已经被加密过

在这里插入图片描述
继续判断3, 遍历导入表查看是否有LoadLibrary和GetProcAddress函数。

在这里插入图片描述
继续判4,判断文件末尾是否有一个足够大的0的空节表。
如果有足够大的空表 0x28,就修改文件的sizeOfImage的值,改为根据节表对齐后加上新节表的文件映像大小。

在这里插入图片描述
对文件的改动:

添加一个节表名称为rmnet,赋值给新加节表的rawsize(使用要写入的文件大小)   
让原本的文件大小作为新节点的入口地址  
节表大小按节表对齐后的值作为RVAsize  
节表大小按文件对齐的后的值作为RAWsize
节表特征设为0xE0000020
重新设置sizeOfImage(文件映像大小)为加新节表后并且按文件对齐值对齐后的大小
再将结构中的表的数量加1

在这里插入图片描述

接下来 更改程序入口点为新节表的入口点(更改PE中的EntryPointAddress)

取消文件在进程空间中的映射,写入两份数据到新解表加密的PE文件(其实就是自身DesktopLayorer.exe,这个可以用OD调试加密的文件解密出来),第二份数据是当前文件被加密的相关信息。

在这里插入图片描述

至此 结束加密exe,该exe只要被执行就会执行DesktopLayorer.exe恶意程序

总结 :

1.文件末尾添加一个表.rmnet的结构
2.表的数量增加1
3.SizeOfImage的大小  进行了更正
4.更改程序入口点
感染html/htm

先检查文件内容的最后9字节数据是不是""以此来判断该文件是否被感染过,如果没有被感染,则在文件末尾添加数据,

在这里插入图片描述

感染后会发现html页面添加了一段脚本代码:

在这里插入图片描述

如果是企业网站的html文件被感染,则访问该网站被感染的html文件时,IE会提示运行脚本

在这里插入图片描述

一旦点击运行脚本,就会在本地在Temp目录生成svchost.exe并执行。而svchost.exe其实也就是DesktopLayorer.exe文件。

线程6: 6EC2 感染可移动磁盘,传播

首先判断是不是移动磁盘,该线程每十秒查找一次是否有移动盘磁盘

在这里插入图片描述

然后继续进行判断:
该磁盘是否已经被感染过

1.该盘符是否有autorun.inf 文件
2.autorun.inf文件大小>3字节
3.autorun.inf前三个字节是RmN

满足上面三个条件之后 就确定该磁盘已经被感染过。

在这里插入图片描述

然后根据判断结果,如果是移动磁盘且磁盘空间大小正常且是未被感染过的磁盘,就进行感染

创建新的文件
RECYCLER 并设置为隐藏

并在该文件夹下创建新的子文件夹RECTCKER\S-3-0-14-0132847250-7673(随机时间拼凑成的文件夹名) 也设置为隐藏

在这里插入图片描述

并在该文件下创建字母随机拼凑成的文件名:clCbjNCI.exe 然后把加密过的DesktopLayorer.exe的代码内容拷贝到该文件下,并设置文件属性为隐藏

在这里插入图片描述
在这里插入图片描述
之后 再在可移动磁盘打开或者新建一个autorun.inf文件,然后在该文件头写入被感染的标志RmN,

在这里插入图片描述
再写入加密后的数据以及
“[autorun]\r\naction=Open\r\nicon=&%WinDir&\system32\shel132.d11,4\r\nshellexecute=.%g\r\nshell\explore\com”
移动磁盘自动播放相关指令。达到插上移动磁盘自动运行原本DesktopLayorer.exe代码的效果

在这里插入图片描述

从而达到被动传播,主动感染的效果

0x04 样本溯源 & 作者溯源

IP地址服务器
72.26.218.76(荷兰阿姆斯特丹)fget-career.com(443端口)

释放的文件:

文件路径md5
C:\Program Files\Microsoft\DesktopLayer.exe.5FFO6E6CD02773C13BEFBD82771223A6
C:\Program Files\InternetExplorer\dmlconf.dat随时保存连通网站时差等信息md5不固定
移动磁盘:\autorun.inf3374214FC65E4586B68FDEF7944856BC
移动磁盘:\RECYCLER\S-3-0-14-0132847250-7673626366-775384636-4860\cLCbJNCI.exe5FFO6E6CD02773C13BEFBD82771223A6

上面最后一个文件移动磁盘RECYCLER文件夹名是固定的
后面的子文件夹名和恶意程序名称是随机的,但是MD5与c盘的样本本身是一样的

rmnet蠕虫病毒最早出现在2010年,至今已有8年之久,主流杀毒软件均可拦截。
但因为传播方式简单,容易被忽略,加上很多机子还没有添加杀软,至今仍然有较强的传播力。

0x05 查杀,防御技术方案

0xA 杀死iexplore.exe进程

杀死被注入的iexplore.exe进程

0xB 删除恶意样本

遍历7个目录路径

1"C:\Program Files\";
2:"C:\Program Files\Common Files\";
3:"C:\Documents and Settings\Administrator\ ";
4:"C:\Documents andSettings\Administrator\Application Data\ ";
5:"C:\WINDOWS\system32\ ";
6:"C:\WINDOWS\ ";
7:"C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\";

如果有"Microsoft"目录,删除该目录及其目录下的"DesktopLayer.exe"程序

0xC 恢复被感染的文件

恢复exe/dll文件

根据样本对文件的修改

1.添加一个表的结构
2.表的数量增加了一个
3.SizeOfImage的大小  进行了更正
4.更改程序入口点

编写脚本改文件PE, 遍历除了"C:\WINDOWS","C:\windows\system32"的其他目录下exe/dll文件,判断文件节表中是否有.rmnet节表(感染标志),如果有则进行下面的行为

1.最后一个节表结构中的数据全置为0
2.NumberOfSections -=1
3.更正SizeOfImage为倒数第二个节表对齐后的RVA大小
4.更改程序入口点为原始OEP

恢复html/htm文件

遍历目录下的html/htm文件
判断文件最后9个字节内容,如果是""
就从文件尾开始 删除5E1E2字节的数据

0xD 恢复被感染的磁盘

判断如果磁盘根目录下有"autorun.inf"文件且文件头三个字节为"RmN"
如果上述情况存在,就表明该移动磁盘已经被感染,

1.删除autorun.inf文件
2.删除RECYCLER文件夹及其子文件夹和文件
3.用恢复文件的方式,修复磁盘中的文件

能力有限,写了个恢复被感染的exe/dll/htm/html文件的小程序,凑合用。

下载链接

https://pan.baidu.com/s/18nTdPZWYJM-UpMlrYtwBQQ

0x06 总结

本次分析 注入的修复IAT表的函数,以及初始化导入表的函数和第4步添加数据中的shellcode,以及如何通过这段shellocde去执行写入的代码。 都还没来的及或者能力不够没能仔细分析,该样本除了感染能力强,传播区域广泛,还可以作为后门去执行服务器的命令。 接下来的时间,就去编写查杀的程序吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值