目录
文章目录
- 目录
- 0x00基本信息
- 0x01 概述
- 0x02流程图
- 0x03 技术细节详细分析
- 第一层壳
- 解密出PE文件
- 第二层壳
- 检查环境
- 准备注入iexplore.exe
- 注入Iexplore.exe
- 恶意六线程
- 线程1: 7ACA 自启动
- 线程2: 7626 测试网络连通性
- 线程3: 781F 记录连通时差
- 线程4: 790C 发送本机信息接收返回指令
- 线程5: 6EA8 感染exe/dll/html/htm文件
- 感染exe/dll
- 感染html/htm
- 线程6: 6EC2 感染可移动磁盘,传播
- 0x04 样本溯源 & 作者溯源
- 0x05 查杀,防御技术方案
- 0xA 杀死iexplore.exe进程
- 0xB 删除恶意样本
- 0xC 恢复被感染的文件
- 恢复exe/dll文件
- 恢复html/htm文件
- 0xD 恢复被感染的磁盘
- 0x06 总结
0x00基本信息
样本名称 | ff5e1f27193ce51eec318714ef038bef_ff5e1f27193ce51eec318714ef038bef.vir |
---|---|
文件大小 | 56320 byte |
是否加壳 | 3层UPX |
样本类型 | 感染型蠕虫病毒 |
MD5 | ff5e1f27193ce51eec318714ef038bef |
0x01 概述
1 | 2 |
---|---|
木马病毒特点 | 感染传播 |
攻击人群 | 移动磁盘用户和网络用户 |
活跃地区 | 全国各地 |
传播方式 | 通过浏览器访问被感染的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.inf | 3374214FC65E4586B68FDEF7944856BC |
移动磁盘:\RECYCLER\S-3-0-14-0132847250-7673626366-775384636-4860\cLCbJNCI.exe | 5FFO6E6CD02773C13BEFBD82771223A6 |
上面最后一个文件移动磁盘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去执行写入的代码。 都还没来的及或者能力不够没能仔细分析,该样本除了感染能力强,传播区域广泛,还可以作为后门去执行服务器的命令。 接下来的时间,就去编写查杀的程序吧。