# TruSSH Worm分析报告

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-09-15T07:00:00Z
Canonical: https://wepostx.com/topics/1041

> 乌云历史资料归档
>
> **原始作者：** 百度安全攻防实验室
> **原始编号：** superkieran-wooyundrops:766
> **原始发布时间：** 2015-09-15 15:00
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

最近百度X-Team捕获到一个利用SSH弱口令漏洞构建僵尸网络的蠕虫，该蠕虫具有自动扫描、自动传播、并依托公共社交网络服务作为获取Command and Control(后文简称C&C)控制信息等特点；蠕虫作者为保证控制方式的独享性，上线地址的变化性以及隐蔽性做了大量工作，C&C上线地址能够做到每天一换。根据其上线特点，我们将此蠕虫命名为：TruSSH Worm。目前此蠕虫已经在全世界范围内大规模传播。鉴于此蠕虫的编写和控制方式有些特殊，特拿出来和大家分享。

# 0x01 蠕虫主体特征

所有的蠕虫主体执行文件均通过upx壳进行压缩，但通过破坏upx header等方式防止upx –d的自动化脱壳，这在linux类的恶意样本中并不多见。

![原文图片](/media/2016/06/79b634e45dd26e62b63cea9f61801a37)

手工脱壳后继续分析，整个ELF文件静态链接，并且被stripped。蠕虫支持在i686、mips、arm架构的linux上运行，能够适应在各种小型被裁剪过的路由器上进行传播。通过对脱壳后的bin中关键字符串进行查看，发现其集成了openssl、libssh2、libevent, libcurl等库，其中openssl的库给出了版本号以及发布时间等信息，让我们得知此恶意蠕虫属于被近期投放，要晚于2015年6月12日。X-Team在捕获改样本时，VT上并没有发现有过历史提交。

![原文图片](/media/2016/06/9ae6f2a188c51cbda4302b911674ada7)

# 0x02 蠕虫传播方式

蠕虫运行成功后，会开启大量的线程，随机选择生成一个B段IP段，扫描其中22端口的开放情况，成功连接的IP地址保存到名为list2列表中，当一次扫描完成后，会读取list2数据，并尝试使用事先设置好的弱口令集进行破解，该蠕虫仅仅依靠三个弱口令root:root, admin:admin 以及ubnt:ubnt三个用户名密码进行破解。其中ubnt属于近期被DDOS集团重点关注airos系统的SSH默认账户名密码。通过zoomeye和shodan，我们也可以看到全网的此类设备的量级是非常可观的。
生成IP地址列表

![原文图片](/media/2016/06/d21d2be8590cdedb11f0b015b851f5c6)

一旦破解成功，会将该IP地址的信息保存到good2文件中,并将当前目录下的所有.mod文件全部复制到远程服务器的/tmp/.xs目录下，然后设置可执行属性并依次执行这些文件。

![原文图片](/media/2016/06/4cce7479b2c12d56e5b98f318a1c5fed)

为了防止目标环境没有wget或者tftp等命令，这里蠕虫采用了一个比较tricky的方式方法，直接在server端使用cat > xxxx.mod的方式传送文件，下图是我们抓取到的命令执行内容：

![原文图片](/media/2016/06/62d43c0b7aa13775b01a86299ce0d6f2)

蠕虫同时会监听9000和1337端口接受外界请求，其中9000端口是一个非常重要的感染标志。蠕虫周期性的会检查good2中机器的存活情况，确保感染率，在对SSH进行爆破前，蠕虫先会向9000端口发送post 请求时，如果其响应“{status: 1}” 则表示该机属于存活状态，跳过SSH密码尝试过程，如下所示:

![原文图片](/media/2016/06/6f73e275707a5f9193f4535a6bb92f3a)

9000端口还提供update和download等功能，这些功能的用途在后面会看到。

# 0x03 蠕虫的上线方式

蠕虫利用了公共社交网络平台进行控制，并采用两阶段获取C&C IP的上线方式，这是我们之前捕获的蠕虫中没有发现过的。该蠕虫通过www.twitter.com、www.reddit.com、my.mail.ru等网站上搜索特定的信息，解析页面内容来找到第一阶段控制IP信息，来看下这个流程是怎么进行的：

![原文图片](/media/2016/06/6b39e8bd6f85c54049965d5b52c884d3)

通过在twitter上搜索关键字获取一阶段IP地址,其他连接www.mail.ru以及www.reddit.com的情况类似。在这些社交平台上搜索的关键字，蠕虫通过一定的算法来进行得到，有点fastflux的感觉。准备连接前，蠕虫会根据内置的算法从www.google.com返回Server Response中的Date域中提取出来的值作为变量生成随机数，再使用随机数从预先定义好的词表字典中来选择两个对应的词，然后加上随机数拼接成一个合适的url，如下所示：

![原文图片](/media/2016/06/6b4d55b5468591dc027d68bab33bc59a)

![原文图片](/media/2016/06/6d27d048e9bebad9032c314f9b64909a)

用来构造请求的词表：

![原文图片](/media/2016/06/271de25e1fa5597792bc24fb9eecce6d)

下图是逆向出来随机数生成算法的C实现

![原文图片](/media/2016/06/ee1069920091baa18dc841d739c3ced7)

蠕虫在收到Response code 200的返回后，在回复的页面中尝试查找base64 特征的字符串，并结合蠕虫内置的KEY，使用openssl中椭圆曲线算法（ECDSA）来验证数据的有效性。此时蠕虫会得到一个二进制文件，该文件格式如下所示。

![原文图片](/media/2016/06/8062bf46359af76000095385930f0d87)

第一部分红线标注的即为上线IP地址，蠕虫此时会连接IP的9000端口，获取实际的上线地址，并连接到该地址，请求名为http://IP:9000/srv_report&ver=0的URL， 并从这个url中得到实际的C&C地址，下图是我们捕获到的srv_report，格式如下所示：

![原文图片](/media/2016/06/249b85138f4784600bfadda854637322)

其组成也是分成三部分，第一部分为最终的上线URL，后紧跟着一个04开头的值，然后是4位的时间戳。最后是一个32位的签名校验。在校验URL的有效性后，蠕虫会连接该URL地址，通过请求该地址，得到实际需要执行的命令。

![原文图片](/media/2016/06/93242cde7f6a0d9d0a7ef0777add73fa)

![原文图片](/media/2016/06/1590f7e4c9c96e53ad4c6e9acdc09092)

![原文图片](/media/2016/06/61846651782e2b8ecc76aa283c600d03)

# 0x04 感染范围

我们根据之前提到的9000端口特征，8月底的时候在全网范围内进行了一次排查,结果如下：全球共感染主机23367台，其中中国是受影响最多的国家 达到7000+

![原文图片](/media/2016/06/99e82bb53ae739e3bc813cafe41ea469)

# 0x05 其他

在分析代码的过程中，我们发现了一些有趣的信息，蠕虫的编写者有使用truecrypt的习惯，编译在bin中的路径字符串泄露了这一点。

![原文图片](/media/2016/06/9a4d17e47a89531075d5cb46de05db33)

从连续监控twitter等社交网络数据来看，原作者大约是在2015年7月17 到2015年7月23 日左右放出了控制信息，之后未有新控制信息放出。

## Replies
