首页
社区
课程
招聘
[原创]一个数据加密恶意样本分析
2021-12-22 14:23 12495

[原创]一个数据加密恶意样本分析

2021-12-22 14:23
12495

    该样本为帖子[讨论]抠下来的,过火绒-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com看到的,当时闲的没事下载来看了看。样本运行后会对电脑文件加密,并且删除了卷影文件,防止通过磁盘工具恢复。

运行效果以及行为

弹出网页

隐藏了所有的文件夹,并创建了新的文件夹,实则为快捷方式,右键属性可看到重定向。

                                             

                                

加密了文件,无法打开

                      

对文件进行了截断操作,加密。

手动检查启动项后发现,在启动中添加了一个html,该html为样本弹出的html。

                        

样本分析:

MD5 8f2050c9937f5f21b118c18dce3054fb

SHA1 0df872ae7916dd70e69b3a319ef57612e0ace739

SHA256 32e504c5664ee16d00149c1d8fe8184b872b07f9fad93ed3bce2bf11c1cc7c3a

                           

突破口:通过VirusTotal和微云沙盒分析的得知可能的操作有分配内存,写内存。在给WriteProcessMemory下断调试观察参数时发现当前区域为动态分配的内存,

                                                                          

                           

故其首先调用了VirtualAlloc,ida进行交叉引用可到

int __thiscall sub_2001DC0(int this, struct tagCREATESTRUCTA *a2)

该函数内部进行了shellcode初始化及解密后进行调用

                                

在dbg里对VirtualAlloc下断后跟踪后可得到解密的内容

这里直接对shellcode进行dump。

因为是从EF0000开始dump,所以拖进ida分析的时候需要修复一下头部,从28开始。

                         

                

ShellCode分析

函数进来后会进行初始化字符串。

                

然后调用InitProcAddr获取LoadLibrary和GetProcAddress地址。InitProcAddr的实现也是从Ldr中去遍历

        

紧接着分别获取以下这些函数地址

GetModuleFileNameW

CreateFileW

VirtualAlloc

GetFileSize

ReadFile

CloseHandle

SHGetSpecialFolderPathW

CopyFileW

SetFileAttributesW

                            

随后获取了AppData和StartUp的路径,其中AppData进行了以下拼接

%AppData%\CSIDL_

%AppData%\CSIDL_X

然后检查当前运行的实例是否存在于其中一个目录中,如果不存在则自我复制后,将文件设置为隐藏状态(单独分析shellcode时路径不存在,猜测为主程序创建目录

中间存在一些对文件读写操作,经过分析后发现是为了给新的shellcode申请空间。

                                 

老规矩,直接弄出他的shellcode。

ShellCode1分析

                    

以0,1和0,0不同参数执行了两次call

函数进来会进行字符串初始化,用于后面调用api

strcpy(str_kernel32, "kernel32.dll");

strcpy(str_ntdll, "ntdll.dll");

strcpy(str_shell32, "shell32.dll");

strcpy(str_advapi32, "advapi32.dll");

strcpy(str_psapi, "psapi.dll");

strcpy(str_GetProcAddress, "GetProcAddress");

strcpy(str_GetModuleHandleA, "GetModuleHandleA");

strcpy(str_GetModuleFileNameA, "GetModuleFileNameA");

strcpy(str_GetModuleFileNameW, "GetModuleFileNameW");

strcpy(str_CreateProcessA, "CreateProcessA");

strcpy(str_CreateProcessW, "CreateProcessW");

strcpy(str_CreateToolhelp32Snapshot, "CreateToolhelp32Snapshot");

strcpy(str_Process32First, "Process32First");

strcpy(str_Process32Next, "Process32Next");

strcpy(str_Module32First, "Module32First");

strcpy(str_Module32Next, "Module32Next");

strcpy(str_CloseHandle, "CloseHandle");

strcpy(str_GetCurrentProcess, "GetCurrentProcess");

strcpy(str_GlobalAlloc, "GlobalAlloc");

strcpy(str_OpenProcessToken, "OpenProcessToken");

strcpy(str_GetTokenInformation, "GetTokenInformation");

strcpy(str_AllocateAndInitializeSid, "AllocateAndInitializeSid");

strcpy(str_EqualSid, "EqualSid");

strcpy(str_LookupAccountSidA, "LookupAccountSidA");

strcpy(str_OpenMutexA, "OpenMutexA");

strcpy(str_CreateMutexA, "CreateMutexA");

strcpy(str_CreateFileA, "CreateFileA");

strcpy(str_CreateFileW, "CreateFileW");

strcpy(str_GetFileSize, "GetFileSize");

strcpy(str_ReadFile, "ReadFile");

strcpy(str_GetSystemDirectoryA, "GetSystemDirectoryA");

strcpy(str_GetSystemDirectoryW, "GetSystemDirectoryW");

strcpy(str_SetFileAttributesW, "SetFileAttributesW");

strcpy(str_MoveFileExW, "MoveFileExW");

strcpy(str_SHGetSpecialFolderPathA, "SHGetSpecialFolderPathA");

strcpy(str_SHGetSpecialFolderPathW, "SHGetSpecialFolderPathW");

strcpy(str_RegOpenKeyExA, "RegOpenKeyExA");

strcpy(str_RegOpenKeyExW, "RegOpenKeyExW");

strcpy(str_RegSetValueExA, "RegSetValueExA");

strcpy(str_RegSetValueExW, "RegSetValueExW");

strcpy(str_RegQueryValueExA, "RegQueryValueExA");

strcpy(str_RegQueryValueExW, "RegQueryValueExW");

strcpy(str_RegCloseKey, "RegCloseKey");

strcpy(str_CreateDirectoryW, "CreateDirectoryW");

strcpy(str_ExitProcess, "ExitProcess");

strcpy(str_Sleep, "Sleep");

strcpy(str_GetFileTime, "GetFileTime");

strcpy(str_SetFileTime, "SetFileTime");

strcpy(str_CopyFileW, "CopyFileW");

strcpy(str_DeleteFileW, "DeleteFileW");

strcpy(str_VirtualAlloc, "VirtualAlloc");

strcpy(str_GetTickCount, "GetTickCount");

strcpy(str_IsWow64Process, "IsWow64Process");

strcpy(str_OpenProcess, "OpenProcess");

strcpy(str_DuplicateHandle, "DuplicateHandle");

strcpy(str_NtUnmapViewOfSection, "NtUnmapViewOfSection");

strcpy(str_VirtualAllocEx, "VirtualAllocEx");

strcpy(str_WriteProcessMemory, "WriteProcessMemory");

strcpy(str_GetThreadContext, "GetThreadContext");

strcpy(str_SetThreadContext, "SetThreadContext");

strcpy(str_ResumeThread, "ResumeThread");

strcpy(str_SuspendThread, "SuspendThread");

strcpy(str_TerminateProcess, "TerminateProcess");

strcpy(str_NtReadVirtualMemory, "NtReadVirtualMemory");

strcpy(str_GetCommandLineW, "GetCommandLineW");

strcpy(str_GetProcessMemoryInfo, "GetProcessMemoryInfo");

strcpy(str_WriteFile, "WriteFile");

初始化完毕后,根据参数值进行分支操作,由于第一个参数为1,这里从1开始。

                                      

首先进行了一些看不懂的文件操作。

            

然后开始解密新的shellcode

        

然后开始进行一下虚拟机检测之类的东西

                          

                  

                     

然后是运行一个脚本,但是这个脚本在整个分析过程中没有碰到。

      

该shellcode的内容比较多,最后会执行到比较核心的内容。

                 

首先是判断电脑是否存在浏览器。

                 

如果IE存在,则启动IE浏览器,以IE浏览器为目标程序,解密一个资源文件并内存加载到IE中。反之自启动一份作为目标进程。

     

           

   

动态调试直接捕获到最终加载的恶意样本(7396C43A6E8CCA2F811939EF1BE71B73)

ShellCode2

MD5    7396c43a6e8cca2f811939ef1be71b73

SHA-1    a7dace43bcc5e7108a9827dd3a7e03c30acdeeba

SHA-256    5548fec3bae254f7882d9b681080261ba588bc05cb63a81a28107ff49f71c513

File size    52.00 KB (53248 bytes)

                                   

该样本首先创建一个互斥名作为单例启动。

                       

随后删除了卷影文件,防止通过该文件进行文件恢复。

                             

然后开始加密文件。

                          

加密过程主要是遍历电脑磁盘和移动硬盘文件。

                           

然后查看文件是否为需要加密的文件。

                                  

以下为该样本所要加密的文件后缀。

                             

加密后的文件在文件的头部会存在一个CRC32的值,该值由原文件前128个字节计算来的。样本会判断前面这个CRC32的值来判断是否需要加密。

                        

                              

             

之后开始进行隐藏文件和创建快捷方式

                

隐藏文件。

                

创建快捷方式,并重定向为临时目录的样本文件。

     

然后进行疑似横向感染操作。

                    

然后开始解密HTML数据,就是运行样本后弹出的那个网页。

                   

                     

该样本在运行之初会判断是否为管理员运行,如果不是管理员,会以管理员模式运行,并关闭当前进程。

                       

该样本中还存在疑似公钥的东西,估计是可以用来解密,但是本人对加密这一块比较弱,就没去详细分析。

                        



至于提供样本的那个老哥问怎么解决,我这边建议闲鱼5元包邮送出远方。

 


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2021-12-22 14:27 被PlaneJun编辑 ,原因:
收藏
点赞8
打赏
分享
最新回复 (4)
雪    币: 3825
活跃值: (5433)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
badboyl 2 2021-12-22 16:33
2
0
真是小母牛不下崽
雪    币: 1448
活跃值: (14585)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
SSH山水画 3 2021-12-22 17:07
3
0
真是小刀剌屁股
雪    币: 398
活跃值: (1267)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4Chan 2021-12-24 14:56
4
1
就是我发的,目前解决了,只能说大佬NB!
雪    币: 389
活跃值: (3998)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0x太上 2021-12-25 15:49
5
0
真是小刀剌屁股
游客
登录 | 注册 方可回帖
返回