[样本分析] Ramnit感染型病毒

样本信息

MD5:ff5e1f27193ce51eec318714ef038bef
类型:exe32
分析工具:DIE、OD、IDA

样本行为

该样本属于Ramnit蠕虫病毒,样本主体会创建傀儡进程(默认浏览器进程)并向其注入病毒DLL,病毒DLL会创建几个线程分别执行功能,包括实现自启动、查询网络连通情况、记录系统时间、向C2(fget-career.com)发送收集到的用户数据、感染磁盘上的exe,dll,html,htm文件、感染可移动磁盘以试图感染更多主机等,感染性极强。

详细分析

拿到样本之后,先拖到DIE中看一下,发现有UPX壳。
在这里插入图片描述

脱壳

用UPX直接脱壳:
在这里插入图片描述
脱壳成功后,用IDA打开,发现入口处是无意义的函数调用:
在这里插入图片描述
这肯定不是真正的入口,在OD中跟踪一下,发现它中途有通过VirtualAlloc申请内存,是个突破点!
在这里插入图片描述
在数据窗口中跟随此处申请到的内存(通过硬件断点),发现在此处填充数据后,随后就去执行了。
在这里插入图片描述
retn返回之后就到了002C2CA9,之后是一堆jmp混淆。
在这里插入图片描述
疯狂F8,中间经过了很多循环(应该是解密),最后跳到了正常的代码段(40开头)。
一看是pushad,盲猜又是个壳,用ESP定律脱壳,就到了真正的入口:
在这里插入图片描述
真是不容易啊,一层又一层!!!

样本主体行为

入口处主要有六个行为:
在这里插入图片描述

获得默认浏览器路径

查询注册表HKEY_CLASSES_ROOT\http\shell\open\command,获得默认浏览器的路径,如果没有,则用IE浏览器。
在这里插入图片描述

创建互斥体

创建互斥体,名称为KyUffTh0kYwRRtgPP,这一步用来确保只有一个病毒实例存在。

自拷贝

判断当前进程名,如果不是DesktopLayer.exe,则拷贝自身到C:\Program Files\Microsoft\DesktopLayer.exe,结束当前进程,启动新进程。
在这里插入图片描述

InlineHook

ZwWriteVirtualMemory函数进行InlineHook,Hook之前要挂起当前进程中的其他线程,Hook完之后恢复。
挂起和恢复线程,用的是同一套代码(通过CreateToolhelp32SnapshotThread32FirstThread32Next遍历线程):
在这里插入图片描述
具体Hook过程如下

  • 首先通过GetProcAddress获得OriginalAddress
  • 然后通过VirtualProtect修改OriginalAddress的页面属性为PAGE_EXECUTE_READWRITE
  • 然后通过VirtualAlloc申请一块可提交内存(大小为5+10),用于存放数据;
  • 保存OriginalAddress的前五字节,然后把它改成jmp FakeFunc
  • 修改完成后,通过VirtualProtect恢复页面属性;
    在这里插入图片描述
    Hook前后ZwWriteVirtualMemory函数的入口分别为:
    在这里插入图片描述
    在这里插入图片描述

创建傀儡进程,注入病毒DLL

创建傀儡进程,即上面获得的默认浏览器进程。
在这里插入图片描述
CreateProcessA内部会调用ZwWriteVirtualMemory,因此会进入自定义的钩子函数(00402A59)。
调用堆栈为
在这里插入图片描述
钩子函数行为
在这里插入图片描述
在这里插入图片描述

  • 调用原函数;
  • 获得浏览器进程的EP;
    在这里插入图片描述
  • 将DLL及三个函数注入浏览器进程;
    首先在浏览器进程中申请内存,然后展开DLL并将其写入浏览器进程,随后写入三个函数。
    在这里插入图片描述
    在这里插入图片描述
    展开DLL的过程:
    在这里插入图片描述
  • 修改浏览器进程的EP,使其调用之前写入的第三个函数。
    在这里插入图片描述
    这样,当浏览器进程恢复运行时,会进入Func3函数,它会先调用Fun1初始化DLL的IAT表,然后遍历DLL的节区依次设置节区属性,最后跳到了DLL的EP:
    在这里插入图片描述
    Func1主要是遍历DLL的导入表,依次加载DLL并初始化IAT表:
    在这里插入图片描述
    在这里插入图片描述
    至此,傀儡进程创建完成。

UnInlineHook

恢复ZwWriteVirtualMemory函数,之前Hook时提前保存了被换掉的那五字节。
在这里插入图片描述
到这里,样本主体行为就分析完了,接下来看一下病毒DLL的行为。

病毒DLL行为

在上面分析样本主体时过程中,将病毒DLL dump下来。
DllEntryPoint中创建了五个线程来实现不同的功能,随后开始感染磁盘上的exe、dll、html、htm文件以及可移动磁盘。
在这里插入图片描述

线程1

设置注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon下的Userinit,以实现开机自启动。并且每隔一段时间就会设置一次。
在这里插入图片描述
在这里插入图片描述

线程2

尝试连接google.com、bing.com、yahoo.com,以测试网络的连通性。
在这里插入图片描述
具体是通过套接字来测试的:
在这里插入图片描述
在这里插入图片描述

线程3

创建dmlconf.dat文件,写入当前系统时间。
在这里插入图片描述

线程4

连接fget-career.com,并向其发送收集到的用户数据。
在这里插入图片描述

  • 首先通过套接字绑定并监听4678端口:
    在这里插入图片描述
  • 然后创建线程来连接fget-career.com并收发数据。
    在这里插入图片描述

线程5

fget-career.com上下载文件并运行。

开始感染

sub_1000749F函数内部创建了两个线程来感染,分别感染磁盘上的文件以及将自身复制到可移动磁盘,尝试感染更多主机。
在这里插入图片描述

  1. 遍历磁盘,感染文件,感染的总体思路都是将自身写入目标文件。遍历的时候会跳过System目录和Windows目录下的文件。
    在这里插入图片描述
    在这里插入图片描述
  • 对于exe和dll文件,会先做一系列的判断,满足是未签名的PE32、没有".rmnet"节、有LoadLibraryA和GetProcAddress函数,才会开始感染。具体的感染手段是在文件末尾新增一个.rmnet节,并写入sub_10006F2C函数和病毒样本。
    在这里插入图片描述
    在这里插入图片描述
  • 对于html和htm文件,会读取文件数据并匹配,看文件末尾是不是</SCRIPT>,若不是则写入VB脚本,脚本会将病毒样本写入目标文件。
    在这里插入图片描述
    在这里插入图片描述
  1. 感染可移动磁盘。首先遍历磁盘,满足是可移动磁盘、磁盘上有可用空间、暂未被感染三个条件则开始感染。
    在这里插入图片描述
    具体感染过程为:在可移动磁盘的根目录下创建目录RECYCLER\S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx,在其下创建xxxxxxxx.exe并写入病毒数据。另外在磁盘根目录下创建autorun.inf文件,并写入四段数据,其中第三段数据的作用是,当打开磁盘时自动运行xxxxxxxx.exe,即病毒样本。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

最终总结

好像感染型病毒总体来说都差不了太多,都会将病毒样本写入目标文件并设法让其运行。对于PE文件来说,最常用的就是新增节,修改EP到节区首地址,然后将病毒数据写入新增节区,中间涉及到基址重定位和重建导入表的一些内容,需要分析者对PE文件结构很熟悉。对于其他类型的文件,以html为例,在文件末尾写入脚本来将病毒数据写入目标。其他类型的文件暂时没有接触到,后续分析遇到时再总结,就先到这里吧!