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



留言所提到的样本为一个zip打包文件，2016年就已出现。该zip可以解压出多个文件，那个名为Noi dung chi tiet（对应中文详细信息）的Mach-O格式可执行文件即是海莲花样本。对比分析显示该样本确实与双头龙样本存在多个相似之处，所以它们或许可以解开双头龙的身世之谜：它极可能是海莲花的Linux版本。本文主要从2进制代码层面介绍这些相似点。



相似点1：C2会话建立函数


Linux常见的域名解析函数为gethostbyname()，但双头龙使用了相对小众的getaddrinfo()函数，C2域名的解析和会话建立都在一个函数中完成，而海莲花样本中也存在一个模式类似的相同功能的函数，2者的函数对比如下：



能看出来它们不但功能相同，对sprintf()和getaddrinfo()的使用方式也几乎一模一样。此外，双头龙和海莲花都使用了单独的数据结构来保存C2会话信息，比如socket fd, 是否active, timeout等，而且它们的数据结构也很相似。



这些相似性是是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：




最终产生的上线包也非常相似，双头龙上线包如下：



下面是PAN2017年分析出的海莲花上线包：




双头龙解密后的上线包如下所示：



下面是PAN分析报告里的海莲花明文上线包：



可以看到它们的明文结构一样，关键字段值基本相同。



相似点3：均存在rotate函数


双头龙和海莲花都存在一个我们称之为“rotate()”的函数，用于加/解密，双头龙的rotate函数如下：




海莲花版本：




两相对比不难发现它们的共同点：


 1. 均接受3个参数。
 2. 原型相同，其中第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/

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