原文:https://blog.malwarebytes.com/threat-analysis/2018/04/pbot-python-based-adware/
最近,我们遇到了一个基于Python的、通过漏洞利用工具包进行投放的恶意软件样本。虽然该样本以MinerBlocker示人,不过经分析后发现,它与挖矿软件没有一毛钱关系。实际上,它更像是PBot/PythonBot:一款基于Python的广告软件。
除了在俄语论坛上的几个帖子和几则简短的威胁说明外,我们尚未发现其他有关该软件的详细分析说明。
由于该软件的一些功能非常有趣,所以,我们决定进行深入的研究。研究发现,该恶意软件可以发动MITB(man-in-the-browser)攻击,将各种脚本注入到合法网站中。实际上,该软件的功能远不止广告注入这么简单,而是取决于其分销商的意图。
分析的样本
5ffefc13a49c138ac1d454176d5a19fd - 下载器(由EK下载)
b508908cc44a54a841ede7214d34aff3 - 恶意安装程序(名为MinerBlocker)
e5ba5f821da68331b875671b4b946b56 - 主DLL(注入Python.exe)
596dc36cd6eabd8861a6362b6b55011a - injecteex64(注入浏览器的DLL,64位版本)
645176c6d02bdb8a18d2a6a445dd1ac3 - injecteex86(注入浏览器的DLL,32位版本)
传播方式
本文中的研究样本是通过RIG漏洞利用工具包进行投递的:
行为分析
安装方法
漏洞利用工具包投放的主要可执行文件是一个下载器。该下载器的代码非常简单,并且没有经过混淆处理。我们可以在资源段中看到相应的脚本:
它的作用是获取包含所有恶意Python脚本的第二个安装程序。这里的第二个组件被命名为MinerBlocker。
有趣的是,如果下载的组件独立运行的话,其行为就像一个正常的合法安装程序,会显示相应的EULA和安装向导:
虽然该样本伪装成一款专门阻止恶意挖矿软件的合法应用程序,但是,我们无法找到与上述产品相对应的网站,因此,我们怀疑这款产品并不存在。
当原始下载程序运行相同的组件时,安装过程完全是静默进行的。它会将程序包放入%APPDATA%中。
相关组件
被投递的应用程序包含多个组件。我们可以看到,为了运行投递过来的脚本,它会提前安装完整的Python。此外,该软件包还提供了相应的卸载程序(uninstall.exe),一旦部署完成,它就会将该软件包全部删除。
在js目录中,我们可以找到一个含有JavaScript代码的文件i.js:
在configs目录中,有两个配置文件:rules.ini和settings.ini。
配置文件rules.ini指定了JavaScript的路径,以及相应的注入位置:
文件settings.ini包含各种有趣的参数,如:
1)服务所在的端口以及使用的证书的颁发者:
2)可能被攻击的进程列表(浏览器):
3)一组列入白名单的IP和域。这些域名采用Base64格式,解码后我们可以看到,都是些俄罗斯银行网站。解码后完整的网站清单可以从这里找到。正如我们后来证实的那样,这些网站都是该样本需要避免感染的站点。
持久性是通过注册表中的Run键实现的:
它们会生成一个名为“ml.py”的脚本。该脚本运行后,会部署另一个Python组件:“httpfilter.py”,其中包含投递过来的.ini文件:
恶意软件的功能
对于这个包含卸载程序的程序包来说,表面上看就是一个合法的程序。然而,这只是一个假象而已:首先,它会将脚本插入到用户访问的每个网站中。注入的脚本来自配置文件中指定的路径,同时,它会从远程服务器进一步加载第二阶段代码(关于第二阶段代码的捕获内容,请访问这里)。
所以,一旦它被注入,攻击者就可以控制浏览器中显示的内容。他们不仅可以注入广告,而且还可以注入更多得恶意内容。
例如,下面的示例网站就被恶意软件注入了脚本,并且该脚本来自一个与Google域名相关的域,容易被误认为该域名隶属于谷歌旗下:
将它与js文件夹中的i.js脚本(格式化版本请访问这里)进行比较:
此外,该恶意软件还会伪造证书并进行MITB攻击。启用HTTPS的网站上的合法证书,将被非法机构“The Filter”颁布的假证书所替换:
如果将浏览器(即ProcessExplorer)打开的套接字与Python实例打开的套接字进行比较,我们就会发现,两者是匹配的。这表明,浏览器会跟恶意软件进行通信,并在其控制下工作。
示例:连接套接字24681的Internet Explorer。我们可以看到,该套接字是被运行恶意软件的Python进程所打开的:
深入分析
加载器(用Python编写)
该恶意软件的第一层是经过混淆的Python脚本。
如前所述,刚开始的时候会运行脚本ml.py。该脚本经过了混淆处理,作用是运行第二个Python层:httpfilter.py。
脚本httpfilter.py会对存储在文件httpfilter.bin中的DLL进行解密。
然后,它将DLL注入到Python可执行文件中。这一点很有趣,因为用Python编写的PE注入器非常罕见。
注入器(DLL)
这个通过Python代码完成注入的DLL(e5ba5f821da68331b875671b4b946b56)是该恶意软件的主要组件。该组件将被注入到Python可执行文件中:
它还需要传入两个参数(settings.ini和rules.ini)。所以,我们可以看到,这两个参数传递给DLL之前,会首先传递给一个脚本,但是那个脚本并没有解析这两个参数。
作者留下了一些调试字符串,使执行流程更易于跟踪。 例如:
该DLL负责解析配置并设置恶意代理。
它带有两个硬编码的DLL:一个是32位的和一个是64位的(它们都存储在PE文件的覆盖层中,并且没有进行混淆)。这两个DLL后面会注入到由配置选择的浏览器中,DLL名称分别是injectee-x86.dll和injectee-x64.dll:
注入体(DLL)
注入体DLL是从导出的函数InjectorEntry中开始执行的:
注入体被植入浏览器并负责hooking其DLL。这个hooking函数的开始部分如下所示:
对于这种类型的事件来说,hooking函数是标配。它用于获取指定的导出函数的地址,然后覆盖每个函数的起始部分,将其重定向到恶意DLL中的相应函数。
这里的目标是负责解析证书的函数(在Crypt32.dll中)以及负责发送和接收数据的函数(在ws32_dll中):
当通过PE-sieve转储hook时,就能弄清楚这些函数是如何被重定向到恶意软件的。以下是从相关DLL收集的标签列表:
来自Crypt32:
16ccf;CertGetCertificateChain->510b0;5
1cae2;CertVerifyCertificateChainPolicy->513d0;5
1e22b;CertFreeCertificateChain->51380;5
来自 ws32_dll:
3918;closesocket->50c80;5
4406;WSASend->50d90;5
6b0e;recv->50ea0;5
6bdd;connect->50780;5
6f01;send->50c90;5
7089;WSARecv->50fa0;5
cc3f;WSAConnect->50ab0;5
1bfdd;WSAConnectByList->50c70;5
1c52f;WSAConnectByNameW->50c50;5
1c8b6;WSAConnectByNameA->50c60;5
在这两种情况下,我们都可以看到,这些地址已被重定向到从基址为50000处加载的注入体DLL了。
因此,函数WSASend被拦截,执行流程被重定向到注入器dll中RVA 0xd90的函数:
完成拦截功能的函数的开始部分为:
通过这种方式,所有请求都被重定向到该恶意软件。它可以作为代理,在半路上篡改数据。
代理函数运行结束后,它将跳回原始函数,因此用户感觉不到功能有任何变化。
小结
通过分析这个恶意软件,我们发现它不仅非常简单,同时也没有进行复杂的混淆处理,甚至都没打算实现隐身。换句话说,它的目标不是隐藏自己,而是试图让自己看起来是无害的、合法的。但是,它提供的功能却足以造成严重的危害:因为该样本不仅可以被配置为显示无害广告,也可以配置为以任何其他方式修改网站内容。例如,显示网络钓鱼弹出窗口,就像Kronos中所做的那样。此外,仅凭伪造网站证书这一事实,也应引起人们的高度关注。