APT-C-26
Lazarus
APT-C-26(Lazarus)组织是一个高度活跃的APT组织。该组织除了对金融机构和加密货币交易所感兴趣外,也对全球的政府机构、航空航天、军工等不同行业开展攻击活动,主要目的是获取资金和窃取敏感信息等。其攻击方式主要包括网络钓鱼、网络攻击和勒索软件攻击,并且它们的攻击行为具有高度的技术复杂性和隐蔽性,也具备Windows、Linux、MacOS系统攻击能力,以及拥有多种攻击载荷武器。
360高级威胁研究院捕获到了Lazarus组织通过恶意Python包下发攻击载荷的多个攻击样本,然后通过层层加载,最终完成攻击行为,并且这些样本针对了Windows、Linux、MacOS等不同操作系统,可见该组织针对目标人群不遗余力的开发各类攻击武器。鉴于该组织近期频繁通过将恶意载荷存放于Python包的方式攻击多个平台,因此我们在这里进行详细分析,希望经过曝光披露,相关的企业和个人可以提高安全防范意识,保护企业财产和相关用户财产免受损失。
本轮攻击中,Lazarus组织通过PyPI仓库向各个平台的用户投递恶意样本进行攻击,其中Windows系统下的安装包携带加密载荷,通过层层解密,内存加载Comebacker恶意样本;Linux系统下的恶意安装包加载后,完成初始化时会远程下载ELF恶意文件,该文件具备完整的远控功能;在MacOS系统下,我们捕获的恶意样本和Linux系统下的恶意样本功能相似,文件名也类似,并且还具有相同C2,因此我们推测MacOS系统下的执行流程大概率与Linux下相同,也是通过PyPI仓库进行投递。相关攻击流程如下图所示:
本次我们捕获到了多个利用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执行恶意功能。
解密得到的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]进行投递,但没获取到后续载荷。
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模块,执行有效负载。
os.py模块中关键代码如下:
攻击者主要代码通过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={系统平台首字母} ,这里不再详细分析。
下载的Linux样本基本信息如下:
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
退出进程
在MacOS系统下,我们捕获的多个恶意样本和Linux系统下的恶意样本功能相似,文件名也类似,并且还具有相同C2。此外在分析Linux的载荷投递流程来看,攻击者在下载链接时只选择了判断是否为Windows,因此结合这些我们推测MacOS系统下的执行流程大概率与Linux下相同。
我们以其中一个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”字符串。
已披露的URL格式:
此次披露的URL格式:
最后结合到部分基础设施C2与之前攻击行动有所重叠,并且Lazarus组织也多次进行供应链攻击,综上将其归属于APT-C-26(Lazarus)组织。
总结
在本次详尽的攻击分析中,我们揭秘了APT-C-26组织如何巧妙地利用Python包存储库PyPI下发后续样本,并且这些样本都是层层递进,具备相当强的隐蔽性,通过一系列执行达到窃取用户信息的目的。此外,攻击组织针对 Windows、Linux、MacOS系统都使用了完善的攻击流程,并且注册的域名也有一定的迷惑性,如pypi.online,这都体现出该组织背后有强大的经济能力支撑,以及对目标人群的意志坚定性。因此在这里提醒相关企业和个人加强安全意识,无论何种操作系统,切勿执行未知样本。这些行为可能导致系统在没有任何防范的情况下被攻陷,从而导致机密文件和重要情报的泄漏。
另外,本文披露的相关恶意代码、C2只是APT-C-26组织近期攻击过程中使用的攻击武器,该组织不会因为一次攻击行动的暴露而停止活动,反而会持续更新其载荷,后期我们也将持续关注该组织的攻击活动。
附录 IOC
Windows
8c351d35369a63d6c4a1478428a593d7
267ef172f81bb8577e5371fbf20f7306
5a25375f2b23680690fe82c99cf3d314
10f190b9bbb875d3b2582ae9229da634
1352f2621107e503cddde3bcc0d53d52
133b1621d76bd7f1f4c814f53cd501bc
494f2cc788afc585b4a5bd39ecb6dcca
11c0ce888a5aedf82c509c4dca1b5b00
46127a35b73b714a9c5c58aaa43cb51f
3fcb2ccdc883d8f2d1a3761c1dc5cb3e
330fff5b3c54a03fd59a64981e96814d
a6e7c231a699d4efe85080ce5fb36dfb
716f20a45816101a1dc58a02f776ea24
8c9094137a1624abb0f94d5fb3143d1e
e88528ac23092ba628523654cad8abc4
Linux
420f6e424b1b4a5b9d817c73f9eafa84
73850470a358c79b0a67eb809491dfdb
864cbadfcc4a6d3554c032e7eb30d03f
67d112a63fd9c9c9ebb022675e794322
33c9a47debdb07824c6c51e13740bdfe
744187fb884a7650f4981d0d28ffdfd4
4b3462420d5b05c78cfefec0e233b4ef
7f30ca2454e02be1d5e71b3682b04ea5
1f76eb089ef9f9cbf6840eb5231b2e75
f2013e689dad863e02bfda9481f37085
15a5fc35905624174077afcc1eaaa4ea
8eca54af4e9e013acff7b2f18ac6ccff
cd980f9f4de27f712f69ad31f8cc13a9
MacOS
05957d98a75c04597649295dc846682d
f50c83a4147b86cdb20cc1fbae458865
b62c912de846e743effdf7e5654a7605
79a022c9b41cab5900a46c4b59c02954
C2:
fasttet[.]com
blockchain-newtech[.]com
chaingrown[.]com
jdkgradle[.]com
arcashop[.]org
pypi[.]online
91.206.178[.]125:80
https://fasttet\[.\]com/user/agency.asp
https://blockchain-newtech\[.\]com/download/download.asp
http://91.206.178\[.\]125/upload/upload.asp
https://chaingrown\[.\]com/manage/manage.asp
https://jdkgradle\[.\]com/jdk/update/update.php
https://arcashop\[.\]org/boards.php
https://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保障国家网络安全提供有力支撑。