3CXDesktopApp遭遇APT组织供应链攻击分析报告

1.前言

3CX的VoIP客户端3CXDesktopApp遭遇了APT组织的供应链攻击,Windows和Mac OS平台下的的多个3CXDesktopApp版本被攻击者用于侧加载恶意dll,在3CX的官网介绍中宣传有190个国家/地区的超过600,000个公司使用3CX的产品并且每天有超过12,000,000名用户使用,本文主要分析的是Windows平台下的3CXDesktopApp样本。

2.样本流程图

3CXDesktopApp遭遇APT组织供应链攻击分析报告

3.恶意代码分析

根据公开的情报显示最先报告3CXDesktopApp可疑恶意活动的为3CX的用户于2023年3月22日在3CX论坛中发布的帖子,该客户的SentinelOne EDR检测到了3CXDesktopApp*ex.e**的shellcode api调用以及试图向其他进程内存空间注入代码。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

随后2023年3月29日CrowdStrike在reddit发布了3CX遭遇APT组织供应链攻击的报告。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

3CX的CEO在用户论坛中指出这次被供应链攻击的原因是上游库被污染(指ffmpeg.dll)。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

之后ffmpeg官方进行了有力回击,指出恶意的ffmpeg.dll和他们无关,因为ffmpeg只提供源代码并不提供编译后的ffmpeg.dll。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

在CrowdStrike的分析报告中指出根据此次攻击的加密密钥和HTTPS通信数据包格式推断此次3CX供应链攻击的幕后黑手是来自北朝鲜的APT组织LABYRINTH CHOLLIMA。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

根据公开的情报Windows下有2个版本受到此次供应链攻击的影响分别为18.12.407和18.12.416,我这里就先以3CXDesktopApp-18.12.407.msi为分析目标,可以看到msi安装包有3CX的有效数字签名,签名日期为2023年3月3日。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

我们安装完后启动3CXDesktopApp,然后3CXDesktopApp*ex.e**会加载app文件夹下的ffmpeg.dll。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

我们查看3CXDesktopApp*ex.e**的进程树,可以看到已经加载了app文件夹下的ffmpeg.dll。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

在3CXDesktopApp进程找到一处可疑内存,通过0x4550(PE)标志可以推断到此块虚拟内存中应该是一个PE文件,Dos头和DosStub被抹除。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

可以看到可读可执行内存属性的应该是通过反射式注入的PE文件代码段了。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

ffmpeg.dll是使用VS2015链接器版本14.0编译的x64 dll,编译时间戳为2022年11月12日,无数字签名。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

3.1 CVE-2013-3900

d3dcompiler_47.dll有Microsoft有效的数字签名证书,数字签名证书的时间戳为2021年5月8日序列号为:33000003dffb6ae3f427ecb6a30000000003df。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

此d3dcompiler_47.dll的版本为10.0.20348.1。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

经过一番查苦寻找我从Chrome浏览器的路径中找到了此d3dcompiler_47.dll,可以看到Chrome版也是有Microsoft有效的数字签名证书,签名日期时间戳和数字签名证书的序列号和3CXDesktopApp自带的d3dcompiler_47.dll完全一致。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

Chrome目录下的d3dcompiler_47.dll的版本也为10.0.20348.1。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

好了既然这两个d3dcompiler_47.dll的版本号相同数字签名时间戳和数字签名证书序列号都相同,那sha256哈希应该也是相同的吧,但是我们可以看到这两个d3dcompiler_47.dll的大小和sha256哈希都不相同,明显是3CXDesktopApp自带的d3dcompiler_47.dll要比Chrome自带的要大,这是怎么回事呢?我们知道如果我们修改了经过数字签名证书签名的PE文件Windows就会提示我们数字签名无效。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

3CXDesktopApp自带的d3dcompiler_47.dll其实利用了CVE编号为CVE-2013-3900的Windows WinVerifyTrust签名验证漏洞,但是这个漏洞是一个十分古老的漏洞在2013年Microsoft已经发布补丁KB2893294进行修复,那为什么2013年已经被修复的漏洞在2023又重生了呢。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过msrc在2022年1月21日发布的安全更新指南中告诉了我们答案,其实Microsoft并没有完全修复此漏洞,并且在Windows10和Windows11中CVE-2013-3900这个漏洞都可以被利用,并且msrc还告诉我们这个漏洞会导致攻击者可以修改现有的已签名可执行文件来利用该文件的未验证部分,从而在未使签名无效的情况下向文件添加恶意代码从而利用此漏洞,到这里我们大概就知道3CXDesktopApp自带的d3dcompiler_47.dll利用此漏洞的方式了。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

msrc告诉了我们32位和64位系统对应的漏洞缓解方式,主要就是通过注册表添,EnableCertPaddingCheck键值并设置为1。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过msrc的漏洞缓解措施后3CXDesktopApp自带的d3dcompiler_47.dll属性中已经不显示数字签名证书信息。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

有安全研究员称如果使用了我们使用了添加注册表的漏洞缓解措施,在升级到Windows11后可能会将此缓解措施移除。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用BCompare对Chrome和3CXDesktopApp自带的d3dcompiler_47.dll进行了比对,通过对比后可以确认Chrome自带的就是原版的d3dcompiler_47.dll,对比图左为Chrome图右为3CXDesktopApp,首先就是OptionalHeader的checksum字段,原版的checksum字段值为0x4ACD32,经过修改的checksum字段值为0x4F36D7,然后OptionalHeader的DataDirArray的Security也就是数据目录表中的证书表的Size字段,原版的值为0x21C8,修改版的值为0x45CD8,由此可以计算出利用了CVE-2013-3900的d3dcompiler_47.dll相比于原版的增加了0x43B10字节大小的内容。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

接着就是WinCertificate表中的dwLength字段了,和数据目录表中的证书表Size字段信息相同原版的值为0x21C8,修改版的值为0x45CD8。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

然后就是证书表增加的内容了,增加的内容以特征码FE ED FA CE为开头。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

3.2 Shellcode Load

ffmepng.dll的恶意代码位于DllMain的18004DE60函数。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

首先会使用CreateFileW函数创建一个名为AVMonitorRefreshEvent的事件对象确保唯一性。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

GetModuleFileNameW函数获取当前进程模块路径。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用wcsrchr函数查找当前模块路径中最后一个\\的位置并+2。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用d3dcompiler_47.dll字符串替换原模块的名称。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用CreateFileW打开d3dcompiler_47.dll,GetFileSize获取dll文件大小,并且使用HeadAlloc申请堆空间用于读取dll。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用ReadFile函数读取d3dcompiler_47.dll到堆空间后,检查d3dcompiler_47.dll的MZSignature标志是否为0x4D5A(MZ)。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

之后开始*力暴**搜索FE ED FA CE特征码。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

搜索到特征码后计算加密的shellcode的大小0x43b08并使用HeapAlloc函数申请堆空间。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

将加密的shellcode复制到申请的堆空间中。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用硬编码的rc4密钥3jB(2bsG#@c7通过rc4算法解密shellcode。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

rc4算法解密shellcode后,可以看到开头的 E8 00 00 00 00一个很明显的GetPC技术指令opcode。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

接下来使用VirtualProtect函数将shellcode的内存地址运行权限改为PAGE_EXECUTE_READWRITE并通过函数指针直接调用shellcode。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

将shellcode从内存中dump下使用ida查看。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过ror13 hash获取需要使用的函数地址。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

紧接着开始解析PE文件了,通过刚刚获取的VirtualProtect和VirtualAlloc等函数可以判断此shellcode主要功能是使用反射式注入加载PE文件运行。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

shellcode结束后附加着确实是一个PE文件,可以看到明显的0x4D5A(MZ),DosStub等等。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

我们将shellcode末尾的PE文件dump出来,可以看到此PE文件为使用VS2022编译的x64 dll文件,编译时间戳为2023年1月11日,无数字签名并且PE尾部附加了一些二进制数据。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

查看PE文件尾部的数据:1200 2400 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 3CXDesktopApp/18.11.1197 Chrome/102.0.5005.167 Electron/19.1.9 Safari/537.36"为一个User-Agent,可以大致判断此PE文件可能会使用此User-Agent与C&C服务器进行通信。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

接下来分析shellcode,通过GetPC指令获取的地址偏移+0x658获得dll文件的VA。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过GetPC指令获取的地址偏移+0x43a58获取dll文件末尾的User-Agent数据VA。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过ror13 hash获取完函数地址后,验证dll文件的NTSignature是否为0x4550(PE)。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过dll文件的SizeOfImage字段大小申请虚拟内存。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

将NT头复制到虚拟内存,Dos头只复制了一个AddressOfNewExeHeader字段。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

将各个区段复制到虚拟内存。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

LoadLibraryA函数加载导入dll。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用GetProcAddress获取导入函数地址并填充到IAT。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

修复重定位数据。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

根据各个区段的Characteristics属性使用VirtualProtect函数修改对应的内存运行权限。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

使用NtFlushInstructionCache函数刷新代码缓存。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

调用dll main。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

dll main没有实际功能,所以代码又返回了shellcode开始解析dll的导出表获取DllGetClassObject导出函数地址并调用。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

DllGetClassObject首先使用MultiByteToWideChar函数将dll文件附加的User-Agent字符串转为了Unicode字符,然后调用CreateThread函数创建线程执行了StartAddress函数。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

StartAddress函数会先获取当前模块路径并拼接manifest文件。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

time64函数获取当前时间戳。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

我们将当前的时间戳转换为日期。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

之后通过rand() % 0x1B7740 + timestamp + 0x93A80操作将当前时间戳 + 7天(0x93A80)。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

将增加7天后的时间戳转换为日期。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

写入时间戳到manifest文件。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

查看manifest文件中写入的时间戳。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

wfoptn_s函数打开manifest文件如果为空就将7天后的时间戳写入,如果不为空就读取manifest中的时间戳和time64获取的当前时间戳对比,只有在当前时间戳大于manifest文件中的时间戳才会继续执行否则将会一直循环对比并调用Sleep函数休眠,也就是会休眠7天的时间。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

接下来了读取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid字段的值。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

尝试从https[:]//raw[.]githubusercontent[.]com/IconStorages/images/main/icon%d.ico的github存储库*载下**icon0.ico到ico15.ico的任意一个ico文件,使用rand函数随机0-15的种子。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

由于目前此github存储库已经被删除,这里引用互联网的公开的情报。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

我从第三方样本库中获取到了除了icon9.ico之外的所有ico文件,这些文件都是正常的ico图标可以正常显示。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

我们查看ico0.ico是一个正常的PNG文件。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

但是文件末尾附加了一段Base64编码的数据。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过strings查看每个ico文件末尾都附加有Base64编码数据。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

此为ico0.ico附加数据经过Bse64解码后的内容,所有的ico附加数据经过Base64解码后开头都是默认的29 00 00 00,之后紧跟着的16字节为authentication tag,剩下的字节才是经过Aes Gcm加密的加密数据。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

之后通过一个复杂的算法生成了32字节的Aes Gcm Key,并且生成的Key都为:0x21, 0xA1, 0xAC, 0xE1, 0xE6, 0x63, 0xBA, 0x45, 0x86, 0x4D, 0xF4, 0x57, 0xB2, 0x09, 0x18, 0x1E, 0xBD, 0x90, 0x10, 0x1B, 0x4A, 0x51, 0x28, 0x40, 0x38, 0x7C, 0xD2, 0x10, 0xE5, 0x8F, 0xA3, 0xF1。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

算法特征和github开源代码十分相似。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

接着生成0xC字节的Nonce,生成的Nonce都为:0x3B, 0x8A, 0x08, 0xED, 0x0F, 0x9E, 0x08, 0xCA, 0x57, 0x21, 0x09, 0xEF。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

可以看到使用的是Microsoft CNG加密api,并且使用的加密算法为Aes Gcm模式的加密。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

通过Aes Gcm解密后的数据为C&C服务器地址,那么可以确认icon0.ico到icon15.ico文件末尾的base64编码数据经过解密应该都为C&C服务器地址。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

在通过C&C服务器获取下一阶段的payload的时候会添加如下的请求头。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

在获取到下一阶段的payload后将内存权限改为PAGE_EXECUTE_READWRITE并通过函数指针方式运行。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

3.3 Final Stage Payload

由于目前C&C服务器已经关闭,所以我从网络上公开的第三方样本库中*载下**的最后阶段的dll,此样本是使用VS2022链接器版本14.32编译的64位dll,编译时间戳位2023-3-17。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

最后阶段的dll也有一个名为DllGetClassObject的导出函数,根据推测和公开的情报从C&C获取的最后阶段在此dll前附加有shellcode用于反射加载并调用此dll的导出函数DllGetClassObject,和我们之前分析的d3dcompiler_47.dll中的shellcode load功能相同。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

从字符串中可以看出最后阶段的payload目的是针对Chrome、Edge、Brave、Firefox浏览器历史浏览信息进行窃密,History为基于Chromium开发的浏览器用于记录历史浏览信息的sqlite数据库,places.sqlite文件为FireFox浏览器中所有的书签、*载下**文件记录、和浏览网页的记录的sqlite数据库。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

这两条sql语句分别查询基于Chromium的浏览器(Chrome、Edge、Brave)和FireFox浏览器的历史浏览记录的url和title信息并且限制为前500信息。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

NetWkstaGetInfo函数用于获取主机用户名和域名,RtlGetVersion函数用于获取系统版本信息。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

将收集到的主机信息格式化。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

由于针对的是4个特定的浏览器进行信息窃取,所以for循环4次代表分别对4个浏览器进行信息窃取。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

StealBrowserInfor遍历全盘文件查找对应浏览器的数据存储文件夹。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

如果找到对应浏览器的历史信息记录sqlite数据库则用对应的sql语句进行查询。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

信息收集完毕会返回调用模块然后对数据进行加密并将数据回传到C&C服务器。

3CXDesktopApp遭遇APT组织供应链攻击分析报告

4.yara rule

以下的yara rule用于检测Windows平台下遭受此次供应链攻击影响的3CXDesktopApp

import "pe"

rule SupplyChainAttack_3CX_MsiInstall
{
    meta:
        description = "Detect 3CXDesktopApp Msi Installer Attacked by Supply Chain"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
        hash1 = "aa124a4b4df12b34e74ee7f6c683b2ebec4ce9a8edcf9be345823b4fdcf5d868"
        hash2 = "59e1edf4d82fae4978e97512b0331b7eb21dd4b838b850ba46794d9c7a2c0983"
    strings:
        // 3CX Certificate serial number
        $hex1 = {1B 66 11 DF 9C 9A 4D 6E CC 8E D5 0C 9B 91 78 73}
        $astring1 = "3CX Ltd" ascii
        $astring2 = "3CX Desktop App" ascii
        $astring3 = "202303" ascii
    condition:
        uint16(0) == 0xCFD0 and all of them
}

rule SupplyChainAttack_3CX_DesktopApp
{
    meta:
        description = "Detect the 3CXDesktopApp*ex.e** program attacked by the supply chain"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
        hash1 = "dde03348075512796241389dfea5560c20a3d2a2eac95c894e7bbed5e85a0acc"
    strings:
        // 3CX Certificate serial number
        $hex1 = {1B 66 11 DF 9C 9A 4D 6E CC 8E D5 0C 9B 91 78 73}
        $astring1 = "3CX Ltd" ascii
        $astring2 = "webmaster@3cx.com" ascii
        $astring3 = "202303" ascii
    condition:
        uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and filesize > 140MB and all of them
}

rule SupplyChainAttack_3CX_ffmpeg_dll
{
    meta:
        description = "Detect ffmpeg.dll with malicious code added by the attacker"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
        hash1 = "7986bbaee8940da11ce089383521ab420c443ab7b15ed42aed91fd31ce833896"
        hash2 = "c485674ee63ec8d4e8fde9800788175a8b02d3f9416d0e763360fff7f8eb4e02"
    strings:
        // search FE ED FA CE
        $hex1 = {41 80 7C 00 FD FE 75 17 41 80 7C 00 FE ED 75 0F 41 80 7C 00 FF FA 75 07 41 80 3C 00 CE 74 0D}
        // VirtualProtect and call shellcode
        $hex2 = {4C 8D 4C 24 48 4C 89 F1 4C 89 EA 41 B8 40 00 00 00 FF 15 ?? ?? ?? ?? 85 C0 74 22 4C 89 F0 FF 15 ?? ?? ?? ?? 4C 8D 4C 24 48 45 8B 01 4C 89 F1 4C 89 EA FF 15 ?? ?? ?? ??}
        // rc4 key
        $astring1 = "3jB(2bsG#@c7" fullword ascii
        $ustring1 = "AVMonitorRefreshEvent" fullword wide
        $ustring2 = "d3dcompiler_47.dll" fullword wide
    condition:
        uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and filesize < 3MB and all of them
}

rule SupplyChainAttack_3CX_d3dcompiler_47_dll
{
    meta:
        description = "Detect the d3dcompiler_47.dll that the attacker uses the CVE-2013-3900 vulnerability to add additional malicious shellcode"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
        hash1 = "11be1803e2e307b647a8a7e02d128335c448ff741bf06bf52b332e0bbf423b03"
    strings:
        $hex1 = {FE ED FA CE}
        $hex2 = {7D 61 D5 99 70 A9 00 4E}
        $astring = "20210508"
    condition:
        uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and filesize < 5MB and all of them
}

rule SupplyChainAttack_3CX_ShellCode
{
    meta:
        description = "Detect decrypted shellcode load in d3dcompiler_47.dll"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
    strings:
        // shellcode start
        $hex1 = {E8 00 00 00 00 59 49 89 C8 48 81 C1 58 06 00 00 BA DA F4 58 F5 49 81 C0 58 3A 04 00 41 B9 AA 00 00 00 56}
        // shellcode call r8 
        $hex2 = {C1 E0 02 48 98 48 03 C6 44 8B 04 02 8B 94 24 D8 00 00 00 4C 03 C6 41 FF D0}
        // call dll main
        $hex3 = {45 33 C0 48 8B CE 41 8D 50 01 FF D3}
        // ror 13 hash
        $hex4 = {C1 CA 0D 80 39 61 0F BE 01 7C 03 83 C2 E0}
    condition:
        all of them
}

rule SupplyChainAttack_3CX_Shellcode_load_dll
{
    meta:
        description = "Detect dll injected by shellcode reflection"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
    strings:
        // time64(0i64); rand() % 0x1B7740 + time + 0x93A80
        $hex1 = {33 C9 E8 ?? ?? ?? ?? 48 8B D8 E8 ?? ?? ?? ?? 44 8B C0 B8 59 BE 90 4A 41 F7 E8 8D 83 80 3A 09 00 C1 FA 13 8B CA C1 E9 1F 03 D1 69 CA 40 77 1B 00}
        // Call Final Stage Payload 
        $hex2 = {85 C0 74 38 FF D5 48 85 C0 74 17 81 7B 04 CA 7D 0F 00 75 0E 48 8D 54 24 50 48 8D 4C 24 58 FF D0 8B F8}
        $astring1 = "__tutma" fullword ascii
        $astring2 = "gzip, deflate, br" fullword ascii
        $ustring1 = "manifest" fullword wide
        $ustring2 = "https://raw.githubusercontent.com/IconStorages/images/main/icon%d.ico" fullword wide
        $ustring3 = "ChainingModeGCM" fullword wide
    condition:
        all of them
}


rule SupplyChainAttack_3CX_Lastpayload_dll
{
    meta:
        description = "Detects dll used in the final stage to steal host information and browser history"
        author = "yauv"
        reference = "https://yauv.me"
        data = "2023-4-3"
        hash1 = "8ab3a5eaaf8c296080fadf56b265194681d7da5da7c02562953a4cb60e147423"
    strings:
        $ustring1 = "\\3CXDesktopApp\\config.json" fullword wide
        $ustring2 = "HostName: %s\r\nDomainName: %s\r\nOsVersion: %d.%d.%d\r\n\r\n" fullword wide
        $ustring3 = "places.sqlite" fullword wide
        $ustring4 = "History" fullword wide
        $ustring5 = "AppData\\Roaming\\Mozilla\\Firefox\\Profiles" fullword wide
        $ustring6 = "AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data" fullword wide
        $ustring7 = "SELECT url, title FROM urls ORDER BY id DESC LIMIT 500" fullword wide
        $ustring8 = "SELECT url, title FROM moz_places ORDER BY id DESC LIMIT 500" fullword wide
        $ustring9 = "\n******************************** %s ******************************\n\n" fullword wide
    condition:
        7 of them
}

5.IOCs

msi安装包

名称: 3CXDesktopApp-18.12.407.msi大小: 102522880 字节 (97 MiB)MD5: f3d4144860ca10ba60f7ef4d176cc736SHA1: bea77d1e59cf18dce22ad9a2fad52948fd7a9efaSHA256: aa124a4b4df12b34e74ee7f6c683b2ebec4ce9a8edcf9be345823b4fdcf5d868

名称: 3CXDesktopApp-18.12.416.msi大小: 102555648 字节 (97 MiB)MD5: 0eeb1c0133eb4d571178b2d9d14ce3e9SHA1: bfecb8ce89a312d2ef4afc64a63847ae11c6f69eSHA256: 59e1edf4d82fae4978e97512b0331b7eb21dd4b838b850ba46794d9c7a2c0983

dll

名称: d3dcompiler_47.dll大小: 5168344 字节 (5047 KiB)MD5: 82187ad3f0c6c225e2fba0c867280cc9SHA1: 20d554a80d759c50d6537dd7097fed84dd258b3eSHA256: 11be1803e2e307b647a8a7e02d128335c448ff741bf06bf52b332e0bbf423b03

名称: ffmpeg.dll大小: 2814976 字节 (2749 KiB)MD5: 74bc2d0b6680faa1a5a76b27e5479cbcSHA1: bf939c9c261d27ee7bb92325cc588624fca75429SHA256: 7986bbaee8940da11ce089383521ab420c443ab7b15ed42aed91fd31ce833896

名称: ffmpeg.dll大小: 2824448 字节 (2758 KiB)MD5: 27b134af30f4a86f177db2f2555fe01dSHA1: 188754814b37927badc988b45b7c7f7d6b4c8dd3SHA256: c485674ee63ec8d4e8fde9800788175a8b02d3f9416d0e763360fff7f8eb4e02

名称: lastpayload.dll大小: 1182208 字节 (1154 KiB)MD5: 7faea2b01796b80d180399040bb69835SHA1: 3b3e778b647371262120a523eb873c20bb82beafSHA256: 8ab3a5eaaf8c296080fadf56b265194681d7da5da7c02562953a4cb60e147423

6.总结

本次3CX遭遇供应链攻击事件根据目前的的公开情报应最早的报告3CX用户论坛中一个安装有SentinelOne EDR的3CXDesktopApp用户,

该EDR拦截了3CX有效数字签名的3CXDesktopApp*ex.e**并检测到了shellcode执行和代码注入,

在该帖子中也有许多3CX客户装有不同厂商的EDR并且都检测到了3CXDesktopApp*ex.e**的恶意行为,

由此可见在此次供应链攻击事件中EDR发挥了应有的作用。此次事件中Windows和Mac OS的3CXDesktopApp客户端都遭到了供应链攻击,

此次攻击事件幕后肯定有一个高水平的APT组织,虽然CrowdStrike的分析报告中指出此次3CX事件出自北朝鲜的APT组织LABYRINTH CHOLLIMA,

但是我认为CrowdStrike没有过多的清晰证据能够指明,在目来看国家级的APT组织活动越来越频繁,这些APT组织能够长期潜伏在目标系统内部,

并随时能发动类似的隐蔽供应链攻击,当然目前新兴的安全技术和手段(EDR、XDR、MDR)也能够有效预防和阻止类似的APT攻击。

from https://www.freebuf.com/articles/system/362686.html