一个淘宝客劫持木马的分析

近期,我们收到很多淘宝卖家的投诉,报告说他们的淘宝联盟付费推广被莫名奇妙地扣除了一部分,而这个商品是没有经过推广的。360病毒响应中心的工程师收到投诉后,经过一系列的分析和追踪,发现了一种专门通过劫持淘宝客骗取卖家推广费的木马,我们将其称为淘宝客劫持木马。

说起淘宝客劫持木马,就要先从淘宝客说起。淘宝客是指通过互联网帮助淘宝卖家推广商品,并按照成交效果获得佣金的人或者集体(可以是个人,网站,团体,公司)。简单地说,现在卖家在淘宝上开了一个店,但是没人知道怎么办呢?做广告呗。有一种广告形式就是淘宝客,有的人拥有一些流量很大的网站,就想在上面放点广告赚点钱,于是他们可以去申请一个淘宝客ID,然后挂一个广告到淘宝。当买家通过他的广告进入淘宝并购买了东西的时候,卖家就需要为这位广告主支付一定的广告费,这就是淘宝客佣金,而一件产品分配多少钱给淘宝客的比例就叫做佣金比例。

淘宝客

淘宝客流程介绍,图片来自百度百科,由ganlifu贡献

既然有了这种赚钱的方法,就会有人动歪脑筋。于是有人想:“我要是写个木马,住在用户机器上,不管他访问淘宝上面的什么商品,都加上我的广告号码,淘宝不就认为是我带的流量,就会给我打钱了吗”。于是,就有了淘宝客劫持木马这种东西。那么,这些淘宝客木马作者是如何做到劫持用户的网络访问,并添加上自己的广告编号的呢?下面就是我们的工程师对其中一种木马手段的分析。

我们分析的这个样本来自一个盗版软件下载网站。这种网站经常会发布一些被处理或打包过的工具软件,号称免费版或破解版,供别人去下载。例如在网站www.ta****.com/down这个网站上的众多工具,第一眼看上去确实都是众多网友需求量比较高的软件:

当广大网友下载下来任意一款工具使用的时候,确实如网站描述:挺好使不说吧,还免费,最重要的一点是并没有捆绑病毒。但事实真的是如此么?我们下载下来这么一个叫:亿家QQ群刷皇冠管家V9.6的软件下来看看这个网站上的工具提供商到底在搞什么猫腻。

此压缩文件MD5:3ad31f62ac898a58fdb3e97eeba53f18
解压后包含如下所示的一些文件:

Txt文档里自然是做一些像告诉用户运行的时候最好关掉杀毒软件,本软件绝对无毒等贼喊捉贼的说明。有的善良的用户确实会相信他们,并且将安全软件退出。

下面我们运行文件:亿家QQ群刷钻皇冠管家V9.6.exe,当然,我们模拟一个裸奔的用户,机器上没有装任何安全软件。

在整个执行过程中,有以下的几个可见现象:

  1. 弹出一个极具诱惑力的色情游戏网站(太过诱惑,打个码再发)
  2. 打开刷钻界面

除此之外,系统看起来运作一切正常。

现在让我们看看它在后台到底干了什么:

我们再次运行QQ群刷钻皇家管家V9.6.exe,只是这次我们用工具监控它的行为,并附加上OllyDbg,发现程序首先将本目录下的yjiashuai目录放到了临时目录中。
然后我们在OD中下断CreateProcessW断点,发现程序暂停在下面的位置,参数如下:

程序用cmd去启动temp目录下的“QQ群刷钻皇家管家V9.6.exe”,这个新起来的进程会将yjiashuai目录放到其他多个目录,然后开启一个IE,弹出色情游戏推广页面,并展示刷钻管家的界面。

有趣的是,当用户关掉后面启动的这个刷钻管家的时候,第一个刷钻管家就会启动一个httpd.exe进程,并在C:\Windows下的Temp目录当中释放出配置文件system.ini。

这个东西是做什么的呢?我们试试访问淘宝,并且在首页上面随便打开一个商品的详细页面,仔细看网址发现,商品最后的部分被加上了一段奇怪的字符。

而天猫(淘宝商城)上的商品也不能幸免:

被圈出来的部分就是这个木马作者的淘宝客的广告编号,如果你在这个页面下了单,卖家就糊里糊涂地需要将钱付给这个木马作者了。

那问题就出在这个httpd.exe上,原本这是开源的web服务器Apach服务器上的一个文件,它运行的时候要加载一个dll文件(libapr-1.dll),而这个文件被人恶意修改,这个dll里进行了一些非常规的操作,下面我们就进一步分析。

运行httpd.exe之后会加载libapr-1.dll文件。此dll会导出ServerStart函数,在该函数中有如下的代码片段:

在这里,程序在用户机器上安装了一个LSP,分层服务则是由mswsck2.dll文件提供的。这个文件名称仿冒成微软官方的文件名,用来迷惑用户。我们先去看一下mswsock2.dll文件中都实现了哪些功能。

mswsock2.dll 作为LSP的提供者,需要实现一系列的函数,我们先看 WSPStartup 这个函数的实现。这个函数负责整体的初始化:

上来先打调试日志,干脆搜了一下这个调试文本,发现微软提供的SPI/LSP的实例代码当中就有,估计木马作者就是直接拿这个改的。继续分析也验证了这一点:函数紧接着是一个循环枚举出下层协议的提供者,并在循环中依次打印出本层协议的ID、以及下层协议的ID,下层协议提供者的文件路径、并加载下层协议提供者的文件路径、加载每层协议提供者dll、获取每层协议提供者dll的WSPStartup函数并执行之,这都是示例代码当中的内容。随后,木马启动一个线程:

这个线程当中,木马会从网上下载更新几个组件并放在下面几个目录当中:

  • 使用的文件路径:C:\WINDOWS\MSAgent
  • 备份的文件路径:C:\WINDOWS\Installer\{89F4137D-6CD6-4AF4-BDB8-2E5ACBB71E00}

download

UpdateFileFromWebSite 当中指定了下载的域名:

download_host

更新后的目录当中的内容:

folder

更新完成之后,会立即启动httpd.exe:

starthttpd

再回到 WSPStartup 这个函数的最后,WSPStartup函数将自己的几个函数注册给 LSP:

register_hijack

这三个函数的主要功能就是对进程本系统的流量重新定向到本地的Apcah代理服务器。该代理的本地监听端口为:6786。其中最关键的是 WSPConnect:

wspconnect

这其中的逻辑就是,如果要connect的远端IP不是 127.0.0.1,就将对远端IP的连接请求劫持到本地的 127.0.0.1:6786 端口。

那么127.0.0.1:6786 是什么呢?你猜对了,就是刚刚被启动起来的httpd.exe 程序。

这个httpd.exe 是一个正常的开源 Apache 程序,只是它启动时会加载当前目录下的libapr-1.dll文件,执行函数ServerStart函数,而木马就劫持了这个DLL,先从 ServerStart看起:

serverstart

两个函数、三个线程构成了这个淘宝客木马的主体部分。

首先 Check_BakFile()函数会看一下木马文件是否都在,在前面我们已经分析过,当启动主程序的时候,主程序会释放文件到多个目录,并启动httpd.exe。在这里httpd.exe就来检测一下是否文件都完整,完整的话继续往下执行。

然后我们看线程函数:Do_Confile_File线程函数:

do_config_file

这个线程函数主要是做一些配置文件相关的操作。获得程序运行的过程中需要的各种配置文件。

在开启的update_config_file线程函数中,从服务器上取得如下的配置信息:

update_config

访问该网址,获取的信息如下:

systemconfig该信息将被用于后面淘宝客挟持的工作。

在GetConfigFileFromWebSite_1函数中有读取配置信息的函数:

get_config_2

获取的信息为:

get_config_2_result

记录要搞哪个浏览器。

在do_statis函数中,只是为了做一个后台感染量的统计。其中有如下的代码:

get_statis第一步,获取到的信息如下:

get_statis_result

然后发送统计信息到c4.gostats.cn/bin/count/a_362678/t_5/i_1/counter.png这个页面,而 gostats.cn 是一家合法的web统计提供商。

另外两个线程,MakeSure_mswsock2Exist 和 MakeSure_RegKeyExists 就是不断监控木马文件(和备份文件),以及LSP的注册表键是否存在,如果不存在就回写,是很典型的木马行为,这里不再展开说。

截止到这里,我们明显看出,这个木马有一套非常成熟的云端交互机制,可以保证木马的更新、配置文件的更新、使用的淘宝推广ID的更新,甚至于感染量统计的更新。这也是现在的木马的一个典型的特征,即一切皆在服务器上控制,用来逃避淘宝的监管和杀软的侦测。

接下来到了这个淘宝客最为核心的技术,即该淘宝客是如何达到劫持的目的。主要是现在 StartServer 的最后部分调用的那个函数。我们分析这个函数的时候会发现目前市面上的绝大部分浏览器全部在它的监控之列:

try_to_find_browsers

首先这个函数会建立socket并侦听在 6786 端口,成为一个代理,并对于到来的连接开启工作线程进行处理:

startserver

通过前面的分析我们已经知道,进出被感染系统的流量都被LSP模块重新发送到本地的6786端口,在这里就是开启了一个本地的代理处理往来的连接。进入到mainloop函数中看看这个代理的一个核心操作——读取转发到该端口上的数据,判断是否满足修改条件、进行修改、转发出去。

send_modify_data

核心函数就是read_socket函数,跟进这个函数。其中V3是从端口已经得到的将要发送出去的数据包。

read_socket

首先,判断此次数据包的请求格式是不是以GET的方式请求的,如果是的话,分析一下URL的后缀,如果是exe,rar等下载文件就不处理(这个逻辑在 is_not_download当中),否则会进入 hijack 函数进行处理。继续跟进hajack函数,是下面这种逻辑:其中Str 是请求的URL, Str1是请求的域名:

hijack_sites

这个列表当中,淘宝和天猫的主要域名赫然在列,而木马如果发现用户正在访问以上的域名中的任意一个,就会开始调用相应的函数进行数据包格式的解析与替换,如下图所示的函数即完成了这样的一个功能:

hijack_data

而对数据的修改是这样做的:

change_data_1

这里面还很仔细地考虑了广告ID的格式,可见木马作者对于淘宝客这种方式的熟悉程度了。

除了处理对外发送的数据之外,这个木马对于浏览器接收到的数据包也做了处理,关于这部分的逻辑大部分和发送端逻辑很相似,其中有一些与发包不同的处理方式,比如通过劫持HTTP返回包,更改成 302重定向并添加广告ID等等。就不展开说了。

经过木马这么一处理,用户机器上所有对于淘宝的访问都带上了 mm_32616990_0_0 这个推广ID了,然后这个木马作者就在用户日常的淘宝交易当中,不断的从卖家那里偷走每笔交易额的 5-10%。这一切对于很多出售利润本来就薄的产品的卖家来说,也是笔不小的损失,说不定一件商品本身的利润都没这么高。我们在日常的过程当中,如果发现或监控到的这种推广ID,都已经第一时间报告给了淘宝。也正是因为这个原因,木马作者才将自己的推广ID都放在服务器上,随时可以更改。但是我们相信通过360和淘宝和通力合作,不管木马作者怎么变,我们都能一起将他们揪出来,打击掉。

虽然这一切暂时看起来对于买家用户还没有影响,但是请别忘了,这个木马是可以被木马作者远程控制的,而我们在分析过程当中也看到它对于淘宝的搜索关键词以及淘宝的浏览记录做了一些特殊处理,如果木马作者愿意,它随时也可以将黑手伸向买家,窃取买家的隐私,甚至劫持交易过程,谁又能保证他们不会这么干呢?