近期,火绒威胁情报系统监测到一款后门病毒正在快速传播,被激活后会通过远程服务器下载多个恶意文件并获取远端恶意代码,随后黑客可以进行截取受害者屏幕图像、远程控制受害者电脑等各种恶意操作。不仅如此,该病毒还使用多种手段来躲避安全软件的查杀,隐蔽性极强。目前,火绒安全产品可对上述病毒进行拦截查杀,请用户及时更新病毒库以进行防御。
火绒查杀图
该黑客团伙投递的文件名大部分与用户常用软件有关, 火绒安全实验室目前收集到其伪装的部分文件名如下图所示:
相关文件名
火绒工程师分析发现,该病毒使用了包括 VMProtect 壳保护、构造 ROP 链、DLL 内存加载、“白加黑” 、多层内存解密等多种技术来躲避安全软件的查杀,因此,火绒安全提醒用户不要轻易点击来历不明的文件,建议先查杀后再使用。
注:“ROP (返回导向编程) ” 是一种将栈上写入的 shellcode 指令串联起来,使其能作为函数被已加载指令调用的一种手段。
一、样本分析
本次分析的病毒执行流程如下所示:
病毒执行流程
该病毒类型随着时间线推进,分别使用了 UPX、VMP 等保护壳,而目前监测到最新的版本为无壳版本,可见作者仍在积极开发测试当中:
加壳情况
病毒首先在栈中开辟大块区域写入代码,该代码块随后作为 EnumFontsW 的回调函数被执行。这种通过记录栈中的可执行流(ROP)的方式可以绕过数据执行保护(DEP),增强其隐蔽性。
栈中记录代码
获取栈中展开的代码后发现内嵌了一个 DLL 文件,该 DLL 在内存中自加载,并调用其唯一的导出函数 make,这种加载方式能使其无法通过 ProcessExplorer 等软件检测出加载的行为,进一步增强了免杀效果。
DLL 内存加载
在 make 函数的执行过程中,其会先判断当前执行的文件名是否包含预定义数字,这些数字目前理解有两个含义:回连标志和单独执行标志。执行流程图如下所示:
执行流程图
1:第一个是回连标志,当包含特定的数字(回连标志)时,其会从 C2 下载相应的 jpg 文件并重命名为 md.jpg,分别存放在 "C:UsersPublic" 和 "C:UsersPublicDocuments" 目录下以供后续使用。
下载指定 jpg 文件
每一个下载的 jpg 文件实际上都是一个 shellcode,不同的 jpg 文件在代码层上都是统一的,但是在数据段中有着不同的回传 IP 和 C2 域名,所以称其为回连标志。(该类 shellcode 将在后面分析,每个 jpg 所含有的 IP 在附录中可查)
jpg(shellcode) 文件解析
2:第二个是单独执行标志,当程序不具备单独执行标志(这里是 "16116")时,其必须先拥有 md.jpg 文件,然后再下载其他恶意文件。这些病毒文件会分别存放到不同的位置中,包括 :
"C:UsersPublicDocuments" 目录下 ttd.exe、UnityPlayer.dll
“C:UsersPublic” 目录下 zd.exe、md.exe、zd.jpg
其它文件下载
分类执行:
根据 make 函数中的执行逻辑可知,所下载的恶意文件分成 3 大部分:
第一部分:zd.exe (单独线程执行,内存加载 zd.jpg)
第二部分:md.exe(单独线程执行,内存加载 md.jpg(如果有的话))
第三部分:Documents 下的 ttd.exe、UnityPlayer.dll (设置隐藏属性,暂时保留)
分别执行
第一部分——zd.exe:
zd.exe 是一个由 Rust 编写的恶意加载程序,用于将一同下载的 zd.jpg 作为 shellcode 加载并执行:
由 Rust 编写
在 zd.exe 内部也存在着 PDB 路径,许多调试符号,有意义的字符串等信息可以验证分析:
字符串等验证信息
zd.jpg 作为 shellcode 被加载执行,在代码与数据之间,病毒作者以 codemark 作为分界线。在数据区中,前面部分字节被赋予了特定的含义,有用作函数参数的,有用于作为执行条件的,称其为标志位区。后面有可直接使用的域名信息,称其为字符串区。最后是待解密使用的字符,称其为解密数据区(在后面会使用)。
shellcode 加载
当定位到分隔符 "codemark",获取特定标志位信息及域名字符串 yk.ggdy.com 后,便会对其发起连接请求。这里发送给 C2 的 "64" 猜测是要求回传 64 位的代码,由此也可进一步猜测有 32 位版本。
从 C2 下载恶意代码
回传代码部分:
C2 对指令的响应可能在不同的时间有着不同的下发代码,也可能还存在别的响应指令,这里仅讨论本次下发的代码内容。本次下发的恶意代码进行了包括屏幕截图,注册表读取,保持回连等操作。详细分析如下:
本次接收的代码依旧处于加密状态,在解密运算中,从 E byte 位开始为待解密信息,解密计算从 0 偏移处开始算起,解密逻辑如下。
解密回传代码
然而,在解密后的代码中发现里面还嵌套着两个 DLL 文件,并且是递归嵌套,下图并未展示嵌套关系:(在母 DLL 里面还嵌套着子 DLL 文件,但子 DLL 并未执行)。
DLL 嵌套
在执行过程中,其会先后执行内嵌母 DLL 的 dllmain 函数和 load 函数:
回传代码执行
虽然该 DLL 有 3 个导出函数,并且 run 和 zidingyixiugaidaochuhanshu(喻指自定义修改导出函数)并未执行,但是它们所作的操作都围绕着两个点:
第一个是获取并修改前面 zd.jpg 待解密数据区中数据进行解密并与注册表中 IP 数据相关联。
这部分代码将 shellcode 末尾加密数据的特定字符进行包括字符替换等解密方式后,得到一个类似于域名,时间,路由消息组成的以 "|" 分隔的关键字串,猜测是想创建并写入注册表 IpDate 中进行后续提取利用。
shellcode 末尾数据区解密
第二个是开启两个后台线程,一个是屏幕截图,另一个是保持回连。
屏幕截图所在的线程先会获取系统目录 "C:ProgramData",然后在该目录下创建 quickScreenShot 文件夹,以当天日期创建分类文件夹,最后把拍摄的屏幕数据以 "日期时间" 的命名方式写入并保存。
获取屏幕截图
在进行屏幕截图的过程中,另一个保持回连的线程也会同步开启,但该线程会先休眠整整60分钟:
进程休眠
之后会进行代码解密操作,以 hackbrian 作为 key 执行解密算法:
代码解密
解密后的代码与前面分析的 shellcode 同类,用于等待 C2 的下一步操作,可以执行包括远程控制在内的各种操作。(这里 ttkk.youbi.co 域名是错误的,末尾少了个m,怀疑由作者的疏漏导致)。
内嵌加密 shellcode
最后在该内嵌 dll 的字符串中发现有 "上线模块.dll",猜测会在后续阶段的由 C2 下发。
上线字符串
第二部分——md.exe
md.exe 也是由 rust 编写,经过逻辑对比发现其与 zd.exe 一致, 代码字节也是相同,故不再重复分析。
逻辑对比图
代码字节对比图
第三部分——ttd.exe 和UnityPlayer.dll
ttd.exe 在本次样本分析属于第三部分,并未被启动运行,怀疑是在开发中或暂时保留以备后续操作的模块,这里出于安全研究的目的继续对其进行分析。
病毒作者在这里利用了白加黑手法,通过合法的 ttd.exe 加载携带恶意代码的 UnityPlayer.dll 躲避查杀,该 dll 在被加载时也会 "变相" 执行 shellcode 中的代码进行后续操作。
其先进行文件复制,把 "C:UsersPublicDocumentsmd.jpg" 复制成 "C:Users8.jpg" :
文件复制
然后执行打开本地画板程序 mspaint.exe,以进程注入的方式在其内存空间中开辟适当空间,并写入 jpg 中的 shellcode 代码,随后调用 CreateRemoteThread 进行远程线程执行。
进程注入
加载并写入 shellcode
shellcode 的后续执行部分在前面已详细叙述,这里不再重复分析。
二、附录:
C&C
HASH