近期,火绒收到用户反馈称自己电脑运行异常,火绒安全工程师第一时间为用户提供技术支持。在溯源的过程中发现,用户是在搜索 todesk 应用程序时点击了非官网链接(hxxps://aaa.csdunlun.cn/tdk/index.html 现已失效)进行下载,该网址随即跳转到 123 盘中下载被恶意分享的病毒文件。
火绒安全实验室对样本进行提取分析后发现其为一个成熟的远控型后门,并在后续会联合其它模块进行扩展操作,包括下载挖矿病毒进行挖矿,通过 Rootkit进行杀软对抗等,危害极大。此外,样本中涉及的驱动文件均带有微软合法签名认证,据火绒威胁情报系统监测显示,目前该类恶意驱动在野数量达到2000多个。
目前,火绒安全产品已支持对该类病毒进行拦截和查杀,请广大用户及时更新病毒库以提高防御能力。
在此,火绒工程师建议大家在下载软件时,尽量选择官方网站或正规可信的应用商店,同时安装可靠的安全软件保护设备免受恶意软件和病毒的侵害。目前,火绒应用商店已独立上线,提供软件下载、程序升级、卸载管理等功能,省时、省力、更省心,欢迎大家到火绒官网下载体验。
样本执行流程如下:
一、样本分析
虚假 todesk 安装包
源头来自于一个虚假官网上的虚假安装包 tod1sk_18.exe,其为一个 downloader,用于下载 C2 上的文件并执行:
其在执行过程中逐步解密出对应数据和相关代码,连接远端 c2:206.238.115.152的 7800端口开启下载:
下载的多个文件 L - 7、1、2、3、4 用于加载执行及下一阶段操作。其中 L- 7 用于加载执行,1 和 2 重命名为随机但同名的cDA34i7Jn.exe 和 cDA34i7Jn.dat;3 和 4 分别重命名为固定的 edge.xml、edge.jpg:
第一个模块:远控模块
虚假安装包完成下载任务后会启动 cDA34i7Jn.exe 进程,该进程会加载与自己同名的 cDA34i7Jn.bat,后者是一个包含 lua 脚本的压缩包 :
cDA34i7Jn.exe 会加载压缩包内的 lua 脚本进行解析,然后开辟对应线程,读取同目录下的 edge.xml,解密其文件头成一个 dll 文件并内存加载执行:
edge.xml解密的dll分析
由 xml 解密而来的 dll 大体流程可以划分为三个阶段:前期准备、后门开启、潜伏的备份后门。
第一阶段:
首先开启一个线程执行关闭 UAC,关闭 360 窗口,创建计划任务等操作:
创建的计划任务是通过 com 机制调用计划任务相关 API ,在执行目录下释放 exe 和dat 文件的副本并设立好相关计划任务属性:
释放的 dat 和exe 文件与原始文件相同,只是最后两字节用了随机数代替,并没有实际影响:
第二阶段:
加载同目录下 edge.jpg 文件并解密成 dll,然后调用唯一的导出函数 Edge,该 dll 是专门的远控程序:
edge.jpg解密的dll分析
由 edge.jpg 解密的 dll 是专门的后门模块,其会检测一些文件的创建时间等信息用于标识后门在该主机上建立的时间,所以会先删除已存在的冲突文件。并且在执行过程中还会检测已存在的窗口的标题,遇到逆向分析工具或其它检测工具时会终止运行:
该后门模块根据多个标志位执行不同的操作:
这些标志包括禁用微软自带的杀毒软件,从C2下载新的文件并执行,键盘窃密等,部分标志解析列举如下:
Disable_sleep_flag 用于禁用休眠,检测360 进程并创建标志文件 xxxx.ini,keylog_flag 标志用于进行键盘记录:
connect_flag 标志用于测试端口的连接,ip_flag标志用于确认是否根据 ip.txt 内容替换 C2 地址:
还有非持久化标志,该后门模块会根据是否设立非持久化标志来决定是直接执行远控操作还是驻留执行,非持久化标志下又细分 autorun 和 service 标志来具体化驻留的方式:
第三阶段:
若前面连接中断并退出循环,则还有备用选项SoftwareMicrosoftMMSNG,用于在 7 天后开启新的后门:
备用后门中字符串 “REPLACE ME TO BACKDOOR URL” 表明该后门工具的分发化和成熟化,与前面的后门一样,使用同一套解密算法并调用相同的导出函数:
第二个模块:对抗模块
对抗模块推测是在前面后门建立之后进行投放的,主要目的是进行杀软对抗操作,前期流程无异,投放的包括 mLIM186a.exe、mLIM186a.dat、syncstatus.png,由 mLIM186a.exe 引导执行:
mLIM186a.exe 读取dat 中的 lua 脚本开启线程后,继续读取同目录下 syncstatus.png 并解密出 dll,然后内存加载导出函数 PluginMe:
syncstatus.png解密的dll分析
该 dll 会将相关字符串进行拆分,并使用异或运算操作来动态生成字符串:
在执行初期,其会查看 TokenElevation 属性值确认权限并尝试关闭UAC:
然后开始遍历相关进程,进程名是以对应的 hash 来代表的,使用的算法修改自 FNV hash,依据特定进程的存在情况来决定执行跳转逻辑:
逻辑跳转分析:
跳转逻辑依据国内外杀软的存在情况决定,当指定的国外杀软存在时就直接返回0,不进行任何操作。当指定的国外杀软不存在时,会判断是否存在国内杀软从而执行不同的逻辑分支:
- 当指定的国内杀软存在时,会开辟新线程用于在内核层和用户层进行对抗。
- 当指定的国内杀软不存在时,会下载挖矿病毒进行挖矿操作。
检测到指定的国内杀软存在时
当检测到指定的国内杀软存在时,对抗模块会获取前面后门模块释放的 c:xxxx.ini 的创建时间与系统时间进行比较,当系统时间比该文件的创建时间大2592000000毫秒(30天)时,才会执行杀软对抗操作及开展后续的行为,也就是会潜伏整整30天:
当时间条件满足时,样本会解密并释放驱动文件 hwperf.sys,并写入到计划任务当中:
随后开启多个线程,分别用于执行驱动对抗,遍历并终止杀软进程,清除日志,用 powershell 添加保护路径等操作:
检测到指定的国内杀软不存在或已被终止时:
驱动分析:
“hwperf.sys”是一个使用OLLVM编译的驱动文件,使用OLLVM编译的文件能有效的增加软件的逆向工程难度防止被分析,常见于商业软件与病毒程序上。“hwperf.sys” 会解密前面模块中保存在注册表内的数据,此数据是AES_ECB加密的,解密后仍是一个驱动程序,在解密完后会在内核层申请内存并加载此驱动:
hwperf.sys分析:
样本会通过ZwQuerySystemInformation(SystemModuleInformation)获取当前系统驱动列表如下图所示:
样本会通过HASH动态获取系统内核函数地址如下图所示:
HASH算法如下图所示:
通过” ZwQueryValueKey”获取注册表里保存的数据如下图所示:
在读取保存在注册表里的数据后会通过cng.sys!BCryptDecrypt进行解密如下图所示:
AES_ECB_KEY在“hwperf.sys”内存里,AES_ECB_KEY的解密算法如下图所示:
此key长度为16,具体代码如下图所示:
完整解密流程C语言代码如下图所示:
AES解密后得到一个异或加密后的PE文件,AES解密后的文件内容如下图所示:
通过使用PE头0x4d 异或 0xB2得出0xff, 同样使用0x5a 异或 a5得出0xff.由此判断此文件使用了0xff进行异或。并且发现0值没被异或,由此得出异或解密算法如下图所示:
解密完成后hwperf.sys会把解密后的驱动放到内核地址里,修复完导入表跟重定位后执行入口,执行完入口后会帮助抹除目标驱动的前0x1000字节
修复导入表如下图所示:
执行入口点以及抹除前0x1000字节如下图所示:
kplugin.sys分析:
解密后的驱动文件能发现PDB名为: kplugin.pdb,故此文档后续把解密后的驱动文件叫作kplugin.sys
kplugin.sys是个rootkit,会检测电脑内各种关键通知回调,有进程回调(CreateProcessNotify)、线程回调(CreateThreadNotify)、模块回调(LoadImageNotify)、进程线程句柄操作回调(ObRegisterCallbacks)、注册表操作回调(CmRegisterCallback)、文件过滤器(miniflter)以及删除文件和结束进程。
kplugin.sys在入口处开启了一个线程常驻于系统内,代码如下图所示:
线程启动后会先通过各种回调的驱动名HASH判断是否需要执行移除回调、删除文件、结束进程等操作,最后每循环15次就会执行一次结束进程和删除文件的操作,每循环25次会执行读取注册表数据进行删除回调,删除文件,结束进程等操作,代码如下图所示:
kplugin.sys会获取进程回调(CreateProcessNotify)、线程回调(CreateThreadNotify)、模块回调(LoadImageNotify)的列表,然后根据列表内的区段名字算HASH进行比较,检测到是安全防护类软件的驱动程序会进行移除。
获取回调列表代码如下图所示:
移除回调代码如下图所示:
判断回调是否为安全防护类软件驱动程序代码如下图所示:
由于该HASH算法不可逆,通过把部分安全防护类软件驱动程序进行同样 HASH计算来碰撞,结果如下图所示:
kplugin.sys移除进程线程句柄操作回调(ObRegisterCallbacks)代码如下图所示:
kplugin.sys会通过PsProcessType和PsThreadType获取回调列表,然后判断回调,最后进行移除,具体代码如下图所示:
kplugin.sys通过CmUnRegisterCallback函数找到注册表操作回调(CmRegisterCallback)列表,具体代码如下图所示:
最后检测注册表回调操作是否为HASH列表内的驱动,最后进行移除,具体代码如下图所示:
kplugin.sys会通过FltEnumerateFilters找到文件过滤器(miniflter)列表,代码如下图所示:
最后检测文件过滤器是否为HASH列表内的驱动,然后进行移除,具体代码如下图所示:
kplugin.sys会检测进程名,检测到后会结束相关进程。具体代码如下图所示:
一部分进程列表如下图所示:
kplugin.sys会检测进程名,检测到后会删除文件,具体代码如下图所示:
以下文件会被删除:
kplugin.sys会读取注册表里的数据来进行一些操作。代码如下图所示:
读取的数据是加密过的,解密代码如下图所示:
最后根据注册表内的数据执行移除各种回调,结束进程,删除文件等操作,代码如下图所示:
二、附录
C&C:
HASH: