freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

警惕GitHub恶意病毒项目,持续活跃释放远控木马
2024-05-28 19:37:15

近期,火绒安全实验室在日常威胁巡视中发现一 GitHub 仓库发布的项目存在病毒风险行为,火绒安全工程师第一时间提取样本进行分析。分析中发现样本会通过多种手段对抗杀软,并最终释放 Remcos 商业远控木马控制受害者机器,且病毒作者仍在积极开发当中。

get?code=ZWNiNzIyNzQzNTRhNDE1YjYwZTRiNTA5MmIyNDE0NzUsMTcxNjg4NDc5NzExNg==火绒 6.0 查杀图

观察到的病毒样本来源于一个名为 "CodeBlock" 的 GitHub 仓库发布的项目,没有任何有关的项目描述,但已有不少受害者中招。调查分析过程中发现该程序利用多层文件进行跳转,利用层层解密进行免杀,除此之外还利用包括 “天堂之门” 在内的多种手段对抗分析。通过最终释放远控木马,攻击者能够执行各种远程操作,从而使用户机器沦为”肉鸡”。

get?code=Y2UxODdiMjA3YWYzZGNhYWY2YzcyMzAzNTVmZTY1MDUsMTcxNjg4NDc5NzExNg==样本来源仓库

样本执行流程图如下所示:

get?code=MDFmMDljOWYyMWYxMzhiOGZhZmM3MzBmODY0NmU2MmYsMTcxNjg4NDc5NzExNg==执行流程图

在此,火绒工程师提醒大家对来历不明的文件应保持警惕,同时安装可靠的安全软件保护设备免受恶意软件和病毒的侵害。

一、样本分析

第一阶段分析:

(由于病毒作者的积极开发,样本分析以附录中的 HASH 为准)

从恶意仓库中下载的 "CodeBlock-wallet_v1.3.1.zip" 压缩包内容如下,运行 "CodeBlock-wallet_v1.3.1.exe" 后其只加载 CodeBlock-wallet_v1.3.1-0.bin 和 CodeBlock-wallet_v1.3.1-1.bin 两个文件:

get?code=NjNjN2MzOGQzYmJiM2NkNDc2MDgxZjIwYjI0YTc3OTQsMTcxNjg4NDc5NzExNg==解压文件

"CodeBlock-wallet_v1.3.1.exe" 由 Embarcardero Delphi 编译,是 Inno Setup 的引导程序,其会加载同目录下的 CodeBlock-wallet_v1.3.1-0.bin 进行第二阶段 Payload 文件的释放:

get?code=NTliZWEwOTBiODgwZGIxYWI2N2ZkNDIwNDZmNDg2MTEsMTcxNjg4NDc5NzExNg==文件信息

get?code=MzFiMjdkMGNmYjQzMGI2YjQxN2JmYzkzNDgyNTlkYTYsMTcxNjg4NDc5NzExNg==Inno Setup 标志

CodeBlock-wallet_v1.3.1-1.bin 是 Payload 的源文件,样本分段读取并解密 CodeBlock-wallet_v1.3.1-1.bin 的内容后,在 C:\Users\Administrator\AppData\Roaming 目录下先以xxxx.tmp 的形式释放,再重命名为 bigmouth.ai、nighttime.xlsx、relay.dll、UIxMarketPlugin.dll、UniversalInstaller.exe,随后执行 UniversalInstaller.exe 开启下一阶段流程:

get?code=NWQ5YTE1NTcxOGMyMzViM2Q1Y2FiZTEyNjlmZjJjODQsMTcxNjg4NDc5NzExNg==文件重命名

get?code=MTQ3NTFmNmE3ZTlmNjE0ZWRiZTQ2ZTI1Y2M4OWU5OWUsMTcxNjg4NDc5NzExNg==解密文件展示

第二阶段分析:

在前面释放的文件中 UIxMarketPlugin.dll 并没有被加载执行,UniversalInstaller.exe 直接通过 LoadLibraryW 加载同目录下 relay.dll ,调用其 DllMain 函数执行后续主要操作:

get?code=MTcwN2I4N2Y5NDE0ODFkNzBiN2VjY2FjZTgzYThlZmYsMTcxNjg4NDc5NzExNg==加载relay.dll

部分解密逻辑梳理:

relay.dll 的 DllMain 函数会加载同目录下的 nighttime.xlsx 文件并进行解密,先是定位到固定的 D6C0 位置处,获取文件数据区的正向偏移后开始解密 D6C0 处的内容,解密方式是从第 4 位偏移开始,以 DWORD 为单位向前递加,具体细节如下所示:

get?code=MDgzMTEyNmY2NGExMDIzZWRkNGRiZDg2YzYyZjg0NTMsMTcxNjg4NDc5NzExNg==解密逻辑

get?code=ZTJlMDhjNzFlZDE5ZTA0NTc1MzY2OTc2ODlkMWM2Y2UsMTcxNjg4NDc5NzExNg==解密前后对比

解密后的内容中,前面是需要调用的字符串,relay.dll 会分别定位解密数据前面的 3 个字符串 LoadLibraryA、VirtualProtect、dbghelp.dll,获取其函数地址并进行调用,然后加载 dbghelp.dll 进内存空间准备执行后续注入操作:

get?code=MTk0NDliMWJiNzI0NjkwMDhmMTk5ZWUzNjQ1MjBlOGYsMTcxNjg4NDc5NzExNg==定位字符串并调用

解密后的字节码有很多都是用于标记位置的“偏移值”,在加载 dbghelp.dll 后,会先获取用于定位注入 dbghelp.dll 位置的偏移写入解密代码,再根据“划分数据段的”的偏移限制注入大小,以此“分段”执行——即执行代码位于 dbghelp.dll 中,但相关数据依旧存在于解密空间中:

get?code=M2VmNTE5YTZhN2Y2NWZmOGU0YWQ4NGE4YjkxZmFmMDIsMTcxNjg4NDc5NzExNg==解密内容展示

get?code=ZmI1NThkYmEwNTMxN2RhMGMyYWYyMzg2MmExZDk4YjcsMTcxNjg4NDc5NzExNg==定位及注入逻辑

get?code=OTU1OWE4YzJmMDBjOGQ4OTI2MDk4NDBlZTI0YmRhNTAsMTcxNjg4NDc5NzExNg==注入代码展示

get?code=YmMyYTZjNTQzYjBlNjUzZTBhZjJmOWVmMzllNTYyOTgsMTcxNjg4NDc5NzExNg==解密关系图

dbghelp.dll 注入代码分析:

Dump 出解密代码进行分析,其先动态获取所需函数,执行相关初始化操作:

get?code=YTZjZjYxYTE2ZGE2YWZlZjE3ZTFlNzkxMGVkMTk3YTUsMTcxNjg4NDc5NzExNg==动态获取函数

随后读取同目录下 bigmouth.ai 文件进行第一次解密,第一次解密后 0x8、0xC、0x10 偏移处的值是后续调用 RtlDecompressBuffer 函数解压缩的参数:

get?code=MzBjMDQ3NGNmZGMxZmFmYjNmMTE5ZTQzZmYwY2I3NTMsMTcxNjg4NDc5NzExNg==一层解密代码

get?code=NDFjOTRhNjYxNDQyYzNmNDE4YTVhYTY4ZWY0ODVmNDUsMTcxNjg4NDc5NzExNg==一层解密

解压缩后得到真实的数据和代码,包含前面的数据区和后面的代码区:

get?code=OThiNTg1OTg2MWQxYjE1Y2EzYWVjOGY5YjY1OTk3YjMsMTcxNjg4NDc5NzExNg==二层解压缩

同样的读取解密代码前面的字符串数据继续执行下一步注入,这里定位解密代码入口点并替换到加载的 pla.dll 的入口点处:

get?code=Y2NiYzJmOTdjYTVhMzkwMWNkODM2ZTM5MWE4M2Y5NTAsMTcxNjg4NDc5NzExNw==定位入口点

替换后入口点代码如图所示:

get?code=NzRkMjVhZjE0YzcyNWRhY2UwMjEzM2Y2OWQyYzU1N2UsMTcxNjg4NDc5NzExNw==注入入口点

pla.dll 注入代码分析:

pla.dll 中注入的解密代码会读取前面数据区中的 ruzNode_test 字符串用于在 C:\Users\Administrator\AppData\Roaming 目录下创建备份文件夹,然后调用 CopyFileW 函数将原先释放的 bigmouth.ai、nighttime.xlsx、relay.dll、UIxMarketPlugin.dll、UniversalInstaller.exe 复制过来作为备份:

get?code=OTcxY2FkYzQzNjFhMmExNWI1MjI0Zjc2NTc4ZTA0ZWIsMTcxNjg4NDc5NzExNw==复制文件

get?code=MmUzZTIyNGViZTQwYTdlMDg4ODRiZTI4ZGQ5MGVjODQsMTcxNjg4NDc5NzExNw==备份文件目录

随后创建以 C:\Users\Administrator\AppData\Roaming\ruzNode_test 目录下的 UniversalInstaller.exe 为主体的执行进程替换 C:\Users\Administrator\AppData\Roaming 目录下的 UniversalInstaller.exe 以执行后续操作:

get?code=M2FhOTk0MmJjOWE5YmI0ZjNmMzkzOGM3ZWIzMjg5ZTUsMTcxNjg4NDc5NzExNw==替换 UniversalInstaller.exe

新启动的 C:\Users\Administrator\AppData\Roaming\ruzNode_test\UniversalInstaller.exe 会重复上述解密流程,随后继续以类似的逻辑将分段代码注入到 shdocvw.dll 中(这里不再细究),并在该区段内调用 CreateProcessW 函数创建 "C:\Windows\SysWOW64\cmd.exe" 进程用于注入第三阶段 shellcode:

get?code=N2RlZWEzMDUyOTJhNTRkOTM1NzdmMmEwZmNmNWQ1YmEsMTcxNjg4NDc5NzExNw==创建 cmd 进程

get?code=OWNkODFmYzJkZmEyNjRiNTg5ZTFlNTdhZGQ0NjU2ZjAsMTcxNjg4NDc5NzExNw==当前进程关系

天堂之门利用:

在创建 cmd 进程后,为了隐藏 API 的调用痕迹,并干扰安全研究人员分析,还特别调用了天堂之门来 “遮掩” 其内存注入的操作:

get?code=OTViYzhjOGQ5ZjI2NjgyOTMwNWY0Nzg0YzM2ODBlYjQsMTcxNjg4NDc5NzExNw==天堂之门

dump 出的 shellcode 如下,其中传参用的 rcx、rdx、r8、r9 分别由不同的 [rbp-xxh] 来赋予:

get?code=Y2Y5N2VhYjhkOGQxZjkwMzM3MzZkNDcyODA0MTAyMmEsMTcxNjg4NDc5NzExNw==64 位指令解密

通过天堂之门调用 Ntdll!NtCreateThreadEx、Ntdll!NtWriteVirtualMemory 等 API,将下一阶段 shellcode 以远程线程注入到 "C:\Windows\SysWOW64\cmd.exe" 中——先是将完整的 pla.dll 写入 cmd 的内存空间中,随后再将解密的代码注入到 pla.dll 的 .text 段入口点,最后调用 Ntdll!NtResumeThread 恢复线程:

get?code=NmZjMTYyZjEwOTg4MTdhMjA5NjczZjUwM2VmOTJhOTIsMTcxNjg4NDc5NzExNw==调用 Ntdll!NtWriteVirtualMemory 展示

get?code=NjY3YTdlMmFkYmUxNGVkM2FkMGZiN2VmZWViMzY5N2UsMTcxNjg4NDc5NzExNw==被注入的入口点

其中,与 "C:\Windows\SysWOW64\cmd.exe" 的通信是通过管道进行的,最后会通过管道向 "C:\Windows\SysWOW64\cmd.exe" 写入"\r\n" 使其执行注入的 shellcode:

get?code=Yjg3ZDBmZmJjYTZlYWJjZDc1NTU2NmVkNzYxN2I2MjIsMTcxNjg4NDc5NzExNw==管道通信

第三阶段分析:

第二阶段的代码在成功注入 "C:\Windows\SysWOW64\cmd.exe" 后会在 "C:\Users\Administrator\AppData\Local\Temp" 目录下释放加密的字节码文件,被注入的 "C:\Windows\SysWOW64\cmd.exe" 在执行过程中会读取该文件的内容并进行解密:

get?code=N2JhMDNjNmQ3NmFmM2Y0YTgwY2UyNTY1Nzk3YThmNDYsMTcxNjg4NDc5NzExNw==读取加密文件

get?code=NGM3MTg5NTk3MDM0NzBkMGVkMmQxNTNhOTEzOWQxY2QsMTcxNjg4NDc5NzExNw==加密内容展示

在解密完成后,还会释放 svcultra_test 到开机启动项目录中,指向 "C:\Users\Administrator\AppData\Roaming\ruzNode_test\UniversalInstaller.exe" 执行持久化操作:

get?code=NWIyMDY2NDc3Yzk1ZGU4NjhhNGI2ZGM0NGU1YjgxM2IsMTcxNjg4NDc5NzExNw==查看文件属性

get?code=ZjIyMDVjZmY2ZDNjYjEyMjZhMTk5OTkzMDk4MGY2MzksMTcxNjg4NDc5NzExNw==创建链接文件

接着调用 Ntdll!NtCreateFile 在同样是 "C:\Users\Administrator\AppData\Local\Temp" 的目录下创建相应文件准备写入解密内容:

get?code=ZGFhODE5ZmFjNjEzMzg2NWQ4ZWIzMTdjNTk4Yzg1YjIsMTcxNjg4NDc5NzExNw==创建解密文件

写入文件调用的函数 NtWriteFile 依旧是通过天堂之门进行调用的:

get?code=NTUxOTUxZDE4MmZhNmU5MmRmMGEzZDIyYWZjYmYxYzUsMTcxNjg4NDc5NzExNw==天堂之门

64 位指令如下,由于混淆的原因,调用参数所对应的 [rbp-xxh] 的位置稍微有点偏移:

get?code=OGVmZWRhNmU2NzAyNWQyNTM4MTM3NDFhMTJiZGRlZjcsMTcxNjg4NDc5NzExNw==64 位指令解密

除了 rcx、rdx、r8、r9 外的参数是通过 rdi 和参数数量结合的偏移 [rdi+rax*8-8] 来定位的,如下图所示,写入的解密代码为一个 exe 文件,用于执行后续注入:

get?code=M2ZjZWJlZGVkZmU3ZDU5NDU4YjdkZDQ5NGJmMTUyNzcsMTcxNjg4NDc5NzExNw==调用 Ntwrite 函数

get?code=NTZmYzVlNmY3YzcyY2I3ZTQxMGY3ODQ3YWI4NTdlNGQsMTcxNjg4NDc5NzExNw==解密文件内容

最后创建 "C:\Windows\SysWOW64\explorer.exe" 进程,以同样的方式将解密的 EXE 文件以远程线程的方式注入进去:

get?code=ZDBkYTY0ZTlmZjY3NTBlOTBiZDZkZTVjOTE2MjA4OTEsMTcxNjg4NDc5NzExNw==创建 explorer 进程

get?code=YjYxZjcyODNhZDc2ZWIyMDY1ODU5NzkzYzI4MjA1MTksMTcxNjg4NDc5NzExNw==当前进程关系

后门分析:

用于注入 "C:\Windows\SysWOW64\explorer.exe" 进程的 EXE 实际上是一个 Remcos 远控后门,属于 4.9.3 的专业版:

get?code=OGM5ZThkMTBjMTI5NzIxNTFhZWVkM2I3OTc1M2Y0NGIsMTcxNjg4NDc5NzExNw==Remcos 标识符

Remcos 是一个成熟的远控后门,目前已更新到 4.9.4,是一个商业化的木马,与 cobalt strike 相似,能完全控制受害者机器:

get?code=ZGI4MGRkYTllMTMzNjgyZmI4MDk1OTQ2MWU4MjNhYzEsMTcxNjg4NDc5NzExNw==官网页面

get?code=M2JmZWY0Mjk3YjczZGE0MjRiMDU0ZTgzNWE3N2Q5OWUsMTcxNjg4NDc5NzExNw==官网宣传图

获取到的外联 IP 地址如下:195.54.170.36:22077

get?code=ZTVlZTI2MGU0NDBkY2Q3ZjExM2MzOTMzY2Y4NGQ2ZjAsMTcxNjg4NDc5NzExNw==外联 IP 获取


二、附录

C&C:

get?code=YzBkODYzYTU0NDU5ODliODdhNzY5M2Q0OGI3MTkzODMsMTcxNjg4NDc5NzExNw==

HASH:

get?code=MzdmZjhjYjk5MjY5ZDM1NGJjOGEwMjM1N2ViMzM4NzcsMTcxNjg4NDc5NzExNw==


# 网络安全 # 数据安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者