APT-C-26 LazarusAPT-C-26(Lazarus)组织是一个高度活跃的APT组织。该组织除了对金融机构和加密货币交易所感兴趣外,也对全球的政府机构、航空航天、军工等不同行业开展攻击活动,主要目的是获取资金和窃取敏感信息等。其攻击方式主要包括网络钓鱼、网络攻击和勒索软件攻击,并且它们的攻击行为具有高度的技术复杂性和隐蔽性,也具备Windows、Linux、MacOS系统攻击能力,以及拥有多种攻击载荷武器。
360高级威胁研究院捕获到了Lazarus组织通过恶意Python包下发攻击载荷的多个攻击样本,然后通过层层加载,最终完成攻击行为,并且这些样本针对了Windows、Linux、MacOS等不同操作系统,可见该组织针对目标人群不遗余力的开发各类攻击武器。鉴于该组织近期频繁通过将恶意载荷存放于Python包的方式攻击多个平台,因此我们在这里进行详细分析,希望经过曝光披露,相关的企业和个人可以提高安全防范意识,保护企业财产和相关用户财产免受损失。
一、攻击活动分析
1.攻击流程分析
本轮攻击中,Lazarus组织通过PyPI仓库向各个平台的用户投递恶意样本进行攻击,其中Windows系统下的安装包携带加密载荷,通过层层解密,内存加载Comebacker恶意样本;Linux系统下的恶意安装包加载后,完成初始化时会远程下载ELF恶意文件,该文件具备完整的远控功能;在MacOS系统下,我们捕获的恶意样本和Linux系统下的恶意样本功能相似,文件名也类似,并且还具有相同C2,因此我们推测MacOS系统下的执行流程大概率与Linux下相同,也是通过PyPI仓库进行投递。相关攻击流程如下图所示:2.Windows载荷分析
2.1 载荷投递方式
本次我们捕获到了多个利用Python包投递的恶意样本,这些样本通过在Python包存储库PyPI进行传播,现均被下架。具体样本信息如下:MD5 | 文件名 |
8c351d35369a63d6c4a1478428a593d7 | pycryptoenv-1.0.7.tar.gz |
267ef172f81bb8577e5371fbf20f7306 | pycryptoenv-1.0.7-py3-none-any.whl |
1352f2621107e503cddde3bcc0d53d52 | quasarlib-1.0.8.tar.gz |
133b1621d76bd7f1f4c814f53cd501bc | quasarlib-1.0.8-py3-none-any.whl |
5a25375f2b23680690fe82c99cf3d314 | pycryptoconf-1.0.6.tar.gz |
10f190b9bbb875d3b2582ae9229da634 | pycryptoconf-1.0.6-py3-none-any.whl |
494f2cc788afc585b4a5bd39ecb6dcca | swapmempool-1.0.8.tar.gz |
11c0ce888a5aedf82c509c4dca1b5b00 | swapmempool-1.0.8-py3-none-any.whl |
这些软件包都携带相似的恶意代码且功能相同,但是这些软件包安装后都不会自动执行恶意代码,需要在一定条件下调用函数才能执行,因此在这里猜测这些Python软件包可能不是最终的版本。以其中之一(swapmempool-1.0.8-py3-none-any.whl)进行分析说明,包文件结构如下:当Python包被安装时在特定情况下会执行__init__.py文件里的load函数,该函数通过传入参数对同目录下的utilities.py和command指令进行XOR解密,解密文件保存为config.py,该文件实际为DLL文件,然后通过rundll32 "config.py", AddNumbers jweo执行恶意功能。2.2 攻击组件分析
解密得到的config.py恶意载荷信息如下所示:MD5 | 330fff5b3c54a03fd59a64981e96814d |
文件大小 | 342.50 KB (350720字节) |
文件名 | config.py |
编译时间 | 2024-01-16 07:36:44 UTC |
DLL的导出函数AddNumbers为空,当传入参数为宽字符时,对AddNumbers调用实际会执行AddNumbersW函数。该函数将传入参数 “jweo”进行拼接得到密钥:“jweoED]YC^Yn124Na&+a1p1=HPZ]<7p5”用于解密出新的DLL载荷,接着内存加载该DLL的入口函数。解密后的DLL被加载起来时采用相同解密算法对自身数据继续解密,并释放Local\\Microsoft\\OneDrive\\OneDrive.pri和\\Local\\Microsoft\\Windows\\credential.sys文件,其中前者是恶意DLL,后者为数据文件。接着尝试三种方式进行持久化,依次为创建计划任务、设置注册表和启动目录。cmd /c start /b rundll32 "%APPDATA%\\..\\Local\\Microsoft\\OneDrive\\OneDrive.pri,UpdateData %APPDATA%\\..\\Local\\Microsoft\\Windows\\credential.sys n0Yw "
OneDrive的UpdateData函数被调用时,实际也是执行UpdateDataW函数,该函数通过读取credential.sys文件进行解密出新的载荷并内存执行。与之前解密不同,本次采用两次解密,首先读取文件,获取实际数据大小,并判断标志位是否正确,若不符合直接返回,接着读取数据到缓冲区,然后继续读取数据“GgoC!ur|fJFt8rwM{{$;4k#p*b>:Q”与传入的“n0Yw”参数组成新的密钥用于第一次解密,接着再采用之前相同的方式进行第二次解密出PE文件。通过credential.sys文件两次解密得到的DLL,该DLL类型为Comebacker,其主要功能是继续下载下一阶段payload并执行。其流程首先是获取C2地址,接着向服务器发送的POST请求。请求参数按照如下方式进行拼接,共有七对参数,下图是其中六对参数,图中备注了一些重要参数的说明,其中参数的key基本都是随机大写字母,最后一对参数其key和value都为随机大写字母。若请求到后续载荷并校验通过,则对payload进行解密并执行。需要说明的是,同期我们也捕获到多个该下载器类型的恶意样本,猜测这些样本可能是通过Python包或npm 软件包[1]进行投递,但没获取到后续载荷。3.Linux载荷分析
3.1 载荷投递方式
Lazarus组织在Linux下分发恶意软件过程跟Windows类似,将恶意程序隐藏在Python软件包,并上传至Python包存储库PyPI中,遗憾的是现在官方PyPI已下架,不过在某些自动同步PyPI的镜像站还能看到攻击者上传的部分Python包,下图展示的只是coloredtxt包,此外攻击者还上传了real-ids、beautifultext、minisound等Python包。我们以其中coloredtxt-0.0.2.tar.gz文件为例分析。
MD5 | 73850470a358c79b0a67eb809491dfdb |
文件大小 | 132 KB |
文件名 | coloredtxt-0.0.2.tar.gz |
这些恶意载荷存放在os.py文件中,当用户安装coloredtxt库时,会调用__init__.py完成包的初始化,该过程会导入此OS模块,执行有效负载。
攻击者主要代码通过base64加密多次,经过base64多层解密后通过exec执行,解密后的代码如下:主要功能是通过curl从pypi.online下载下一阶段文件,命名为oshelper,并设置cookie为 oshelper_session=10237477354732022837433。另外下载过程中会判断系统版本,如果是windows则不会进行下载,下载的链接为https://pypi.online/cloud.php?type={系统平台首字母},如果是linux则为https://pypi.online/cloud.php?type=l,如果是MacOS,则URL末尾替换成type=m即可,现已无法下载。
特别需要说明的是,在其他恶意安装包,攻击者关键代码不是通过base64加密,而是通过十六进制编码,如下所示,解密后的代码基本类似,都是通过curl下载下一阶段代码,只是下载链接变成了https://arcashop.org/boards.php? type={系统平台首字母} ,这里不再详细分析。3.2 攻击组件分析
MD5 | 33c9a47debdb07824c6c51e13740bdfe |
文件名称 | oshelper |
文件大小 | 2.60 MB (2,734,385 字节) |
文件类型 | ELF |
oshelper是一个由GCC编译的64位ELF可执行文件,但在编译的时候并没有去除符号信息,我们可以通过工具查看到函数名。在分析过程中,我们发现oshelper默认使用https协议和C2服务器进行通讯,以加密通讯过程中的流量,但是作者也提供了http协议的选项,只是该开关并没有启用。
另外oshelper使用了特定的http报文头部与C2服务端进行通信,以避免被空间测绘工具识别。接着将获取的pid以及tuid信息加密编码,以“lkjyhnmiop=&odldjshrn=odlsjdfhw&ikdiwoep=”形式发送到https://jdkgradle.com/jdk/update/check,待服务端返回“OK”字样说明通讯正常。
经过分析,oshelper是远控程序,下表是具备的远控功能。命令号 | 功能描述 |
0x892 | 发送响应,并休眠 |
0x893 | 上传文件 |
0x894 | 下载文件 |
0x895 | 发送响应,不休眠 |
0x897 | 命令执行,不回显 |
0x898 | 命令执行,并回显 |
0x899 | 退出进程 |
4.MacOS载荷分析
4.1 载荷投递方式
在MacOS系统下,我们捕获的多个恶意样本和Linux系统下的恶意样本功能相似,文件名也类似,并且还具有相同C2。此外在分析Linux的载荷投递流程来看,攻击者在下载链接时只选择了判断是否为Windows,因此结合这些我们推测MacOS系统下的执行流程大概率与Linux下相同。4.2 攻击组件分析
我们以其中一个MacOS样本进行分析,基本信息如下:MD5 | 05957d98a75c04597649295dc846682d |
文件名称 | os_helper |
文件大小 | 169 MB (173,792 字节) |
文件类型 | macho |
os_helper是一个Mach-O文件,Mach-O是MacOS以及IOS上一种用于可执行文件、目标代码、动态库的文件格式。
此外为了保证能够兼容MacOS平台上的多种处理器架构,在os_helper文件中包含了支持x64架构以及ARM架构的可执行文件。这两个可执行文件是同一套代码编译而成的,因此此处仅分析x64架构的文件。分析发现os_helper和Linux下的oshelper 文件代码层面是一致的。首先将生成的pid以及tuid经加密编码后发送给服务端,以便在接收和发送数据的时候进行身份识别,然后执行AcceptRequest函数来接收和执行请求。需要注意的是,初始化连接和轮询命令的URL请求关键字是不同的,初始化连接的时候使用的是“lkjyhnmiop=&odldjshrn=odlsjdfhw&ikdiwoep=”,发送数据则使用“lkjyhnmiop=&odldjshrn=content&ikdiwoep=”,接收数据则使用“lkjyhnmiop=&odldjshrn=dsaewqfewf=”,具体如下图所示:
os_helper和Linux下的oshelper的远控指令是一致的,如下图所示,这里就不再详述。
二、归属研判
根据对此次攻击活动的相关信息进行深入分析,有证据表明此次针对多平台的攻击活动符合Lazarus组织以往的TTP,具体表现如下:1)Windows上通过rundll32调用DLL的导出函数,格式为[DLLFile][导出函数][加密文件] [4位数字字母密钥],其中传入的4位数字字母密钥,只是真正解密密钥的一部分。此外DLL有两个名字基本相同的导出函数,如AddNumbersW和AddNumbers,当传入宽字符串参数时,对AddNumbers的调用实际会执行AddNumbersW函数,这里与之前lazarus通过使用武器化的开源PDF阅读器的攻击活动[2]文章提到的加载方式类似;2)Windows下内存加载的DLL类型为Comebacker[3],该类型在此前Lazarus攻击活动中多次被使用;3)部分DLL样本pdb为D:\workspace\CBG\Windows\Loader\npmLoaderDll\x64\Release\npmLoaderDll.pdb,该PDB在之前lazarus通过npm包供应链攻击也出现过;4)在其他系统上,攻击者采用了同样的通过PyPI的方式传播恶意Python包,并且在URL格式也很类似,如本次披露的Linux与MacOS上的通信URL跟之前披露的URL含有相同的“update/update.php”字符串。最后结合到部分基础设施C2与之前攻击行动有所重叠,并且Lazarus组织也多次进行供应链攻击,综上将其归属于APT-C-26(Lazarus)组织。
总结
在本次详尽的攻击分析中,我们揭秘了APT-C-26组织如何巧妙地利用Python包存储库PyPI下发后续样本,并且这些样本都是层层递进,具备相当强的隐蔽性,通过一系列执行达到窃取用户信息的目的。此外,攻击组织针对 Windows、Linux、MacOS系统都使用了完善的攻击流程,并且注册的域名也有一定的迷惑性,如pypi.online,这都体现出该组织背后有强大的经济能力支撑,以及对目标人群的意志坚定性。因此在这里提醒相关企业和个人加强安全意识,无论何种操作系统,切勿执行未知样本。这些行为可能导致系统在没有任何防范的情况下被攻陷,从而导致机密文件和重要情报的泄漏。另外,本文披露的相关恶意代码、C2只是APT-C-26组织近期攻击过程中使用的攻击武器,该组织不会因为一次攻击行动的暴露而停止活动,反而会持续更新其载荷,后期我们也将持续关注该组织的攻击活动。8c351d35369a63d6c4a1478428a593d7267ef172f81bb8577e5371fbf20f73065a25375f2b23680690fe82c99cf3d31410f190b9bbb875d3b2582ae9229da6341352f2621107e503cddde3bcc0d53d52133b1621d76bd7f1f4c814f53cd501bc494f2cc788afc585b4a5bd39ecb6dcca11c0ce888a5aedf82c509c4dca1b5b0046127a35b73b714a9c5c58aaa43cb51f3fcb2ccdc883d8f2d1a3761c1dc5cb3e330fff5b3c54a03fd59a64981e96814da6e7c231a699d4efe85080ce5fb36dfb716f20a45816101a1dc58a02f776ea248c9094137a1624abb0f94d5fb3143d1ee88528ac23092ba628523654cad8abc4Linux
420f6e424b1b4a5b9d817c73f9eafa84
73850470a358c79b0a67eb809491dfdb
864cbadfcc4a6d3554c032e7eb30d03f
67d112a63fd9c9c9ebb022675e794322
33c9a47debdb07824c6c51e13740bdfe
744187fb884a7650f4981d0d28ffdfd4
4b3462420d5b05c78cfefec0e233b4ef
7f30ca2454e02be1d5e71b3682b04ea5
1f76eb089ef9f9cbf6840eb5231b2e75
f2013e689dad863e02bfda9481f37085
15a5fc35905624174077afcc1eaaa4ea
8eca54af4e9e013acff7b2f18ac6ccff
cd980f9f4de27f712f69ad31f8cc13a9MacOS
05957d98a75c04597649295dc846682d
f50c83a4147b86cdb20cc1fbae458865
b62c912de846e743effdf7e5654a7605
79a022c9b41cab5900a46c4b59c02954https://fasttet[.]com/user/agency.asphttps://blockchain-newtech[.]com/download/download.asphttp://91.206.178[.]125/upload/upload.asphttps://chaingrown[.]com/manage/manage.asphttps://jdkgradle[.]com/jdk/update/update.phphttps://arcashop[.]org/boards.phphttps://pypi[.]online/cloud.php[1]https://blog.phylum.io/crypto-themed-npm-packages-found-delivering-stealthy-malware/[2]https://mp.weixin.qq.com/s/Mflg1NZVrHC6JuVm0rW6GQ[3]https://www.microsoft.com/en-us/security/blog/2021/01/28/zinc-attacks-against-security-researchers/
360高级威胁研究院
360高级威胁研究院是360数字安全集团的核心能力支持部门,由360资深安全专家组成,专注于高级威胁的发现、防御、处置和研究,曾在全球范围内率先捕获双杀、双星、噩梦公式等多起业界知名的0day在野攻击,独家披露多个国家级APT组织的高级行动,赢得业内外的广泛认可,为360保障国家网络安全提供有力支撑。