“双头龙”源自海莲花组织?
我们的双头龙blog发布后引起了较大反响,除了媒体转载,一些安全同行还纷纷在我们blog下面留言和提问,其中5月4号的一则留言提到双头龙跟海莲花(OceanLotus)样本的C2行为有联系:
留言所提到的样本为一个zip打包文件,2016年就已出现。该zip可以解压出多个文件,那个名为Noi dung chi tiet
(对应中文详细信息
)的Mach-O格式可执行文件即是海莲花样本。对比分析显示该样本确实与双头龙样本存在多个相似之处,所以它们或许可以解开双头龙的身世之谜:它极可能是海莲花的Linux版本。本文主要从2进制代码层面介绍这些相似点。
相似点1:C2会话建立函数
Linux常见的域名解析函数为gethostbyname(),但双头龙使用了相对小众的getaddrinfo()函数,C2域名的解析和会话建立都在一个函数中完成,而海莲花样本中也存在一个模式类似的相同功能的函数,2者的函数对比如下:
这些相似性是是2者存在关联的第一个证据。
相似点2:上线包构造手法
双头龙和海莲花的网络数据包都是由Head,Key,Payload
三部分组成,其中Head是必须的,长度为82字节,而Key和Payload则是可选的。Head中的关键字段包括:
- 偏移1,DWORD类型,存放一个magic;
- 偏移9,DWORD类型,存放Payload长度;
- 偏移13,WORD类型,存放Key长度;
- 偏移15,DWORD类型,存放消息码。
双头龙通过一个单独的函数初始化上线包的Head:
这个函数先调用malloc()函数为上线包动态分配内存,接下来依次调用time()/srand()/rand()函数生成一个随机字符然后赋给上线包的第一个字段,剩下的大片代码就是用多个常量对其余字段逐一赋值,所以该函数最明显的特点就是用多个常量初始化上线包。
海莲花样本中也存在1个专门初始化上线包Head的函数:
该函数没有内存分配和随机生成字符的代码,整个函数都是用多个常量逐一赋值上线包的具体字段,这一点跟双头龙一模一样。此外,在1、24和75这三个偏移处海莲花跟双头龙共享了同样的字段值,尤其是偏移为1处的magic都为0x3B91011
,这很难用巧合来形容,所以大大增加了这两段代码同源的概率。
另外,双头龙和海莲花都为上线包分配了消息码,并且都是0x2170272:
最终产生的上线包也非常相似,双头龙上线包如下:
下面是PAN
2017年分析出的海莲花上线包:
双头龙解密后的上线包如下所示:
下面是PAN分析报告里的海莲花明文上线包:
可以看到它们的明文结构一样,关键字段值基本相同。
相似点3:均存在rotate函数
双头龙和海莲花都存在一个我们称之为“rotate()”的函数,用于加/解密,双头龙的rotate函数如下:
海莲花版本:
两相对比不难发现它们的共同点:
- 均接受3个参数。
- 原型相同,其中第1参数为实际的rotate对象,第2个参数为长度字段,第3个参数起控制作用。
在实际使用中,例如在加密上线包的过程中,可以看到,双头龙和海莲花使用了一样的参数。
相似点4:相同的指令码
双头龙和海莲花都用DWORD类型的指令码
来指定消息的功能,并且共享了多个语义相同的指令码,部分有特色的指令如下表所示:
Cmd | Function |
---|---|
0x18320e0 | Upload device Info |
0x2170272 | Register |
0x1B25503 | execute function from a plugin(a aynamic library) |
0x1532e65 | execute function from a plugin(a aynamic library) |
0x25D5082 | execute function from a plugin(a aynamic library) |
这种相似显然不能用巧合来解释了,这是它们代码同源的极强证据。 |
总结
双头龙与MAC版的海莲花木马虽然是用不同语言实现的,但是它们在功能和消息格式设计上的相似,在具体实现上的雷同,已经不能用巧合来解释了。从目前的线索来看,双头龙极大可能是由海莲化组织开发的Linux后门木马,很可能就是Linux版本的海莲花。
感谢社区提供的各种线索,让我们一起Make Cyber Security Great Again
。
引用
https://unit42.paloaltonetworks.com/unit42-new-improved-macos-backdoor-oceanlotus/