浅析巴西恶意软件进化史
巴西的恶意软件日复一日地持续进化着,这使它变得越来越复杂。如果你想了解当前各种各样的恶意软件是怎么工作的,你可以直接跳到第三节。在此之前,我们将会展示巴西网络犯罪者使用的技术是怎么变化的,怎么变得如此高级而复杂。
以前,分析和检测巴西恶意软件是非常快的事情,因为没有任何混淆,没有反调试技术,没有加密,使用明文通信,等等。代码本身使用Delphi和Visual Basic6,由于包含很多大体积图片,使得其文件很大,因为很少使用异常处理,进程常常会崩溃。
现在情况不同了,攻击者花费时间和金钱来开发一套恶意软件方案,恶意载荷通过混淆和代码保护被完全隐藏起来。他们也使用Delphi和VB,但也开始采用像.NET之类的其它语言,代码质量相比以前有很大提高,很显然,它已经进入了一个新的水平。
让我们看一些例子,分析一下我们几年前发现的样本和当前正在发生的威胁有什么不同。
曾经发现的样本
键盘记录器
最初,第一个用于窃取用户银行信息的样本就是键盘记录器,其中很多使用了网上公开的代码,为了记录特定环境下的键盘会稍微做一些修改。这在那时是可行的,因为银行网站没有使用任何保护措施来对抗这种威胁。
公开的键盘记录器源代码
恶意二进制中的代码实现
代码非常简单,只是使用了GetAsyncKeyState来检查每一个键的状态,然后在需要的时候记录下来。大部分键盘记录器没有使用混淆的办法隐藏目标,这有助于提取攻击的特征。
用来检测导航栏的明文字符串
钓鱼木马
在银行把虚拟键盘引入到他们的系统中之后,键盘记录器不再那么有效了。为了绕过这种防护,巴西的坏家伙们开始开发鼠标记录器以及随后的钓鱼木马。
这类恶意软件使用了DDE(Dynamic Data Exchange动态数据交换),用来获取浏览器中当前打开的URL,这个方法现在依然管用,但是大部分恶意程序都更新了他们的代码,用OLE自动化来代替DDE,因为其提供了更多高级的选项。
使用DDE获取URL信息的代码
在获取当前的URL之后,恶意软件检查这个URL是否在目标列表中。如果找到了,恶意软件就会显示一个调用界面询问银行的账户信息。
Internet Explorer中显示的钓鱼木马
在这一阶段,恶意软件不使用任何加密和编码,所有的字符串都是明文的,分析起来很容易。
没有加密和编码的恶意软件字符串
窃取的信息通过邮件发给攻击者。
包含窃取信息的邮件
Hosts
为了在不被轻易识别出是一个钓鱼木马的条件下窃取信息,他们开始修改hosts文件,把银行的域名解析到一个硬编码的服务器上,这样就可以把用户重定向到恶意软件的web页面。这样的方式,感染之后对用户是透明的,增加了攻击成功的可能性。
为了重定向写入到hosts文件中的数据
向host文件写数据的代码
在当时,这种类型的攻击非常有效,并不是所有的杀毒软件厂商会识别并封锁他们。现在我们依然能够看到一些样本修改host文件,但是已经不是很有效了。
反rootkit
在这个阶段,他们意识到杀毒软件的解决方案以及网络银行的安全插件使他们开展工作越来越难。为了增加成功执行的机会,并且在感染的机器上尽量存活得久些,他们开始在运行恶意载荷之前先移除这些安全措施。
最好的方法当然是使用已经包含这些功能的有名的公开的命令行工具,其中大部分已经被禁用了。
RegRun Partizan
这个工具是一个本地可执行程序,在Wind32子系统启动前随着系统启动运行。它可以删除文件和注册表键,即便他们被内核模式下的驱动保护,因为它在驱动加载到系统之前就运行了。要执行命令保存在指定的.RRI文件中,如下所示:
包含要删除的文件的Partizan RRI脚本
The Avenger
一个用于移除文件和注册表键的Windows驱动。要执行的命令写在脚本中,驱动启动的时候会读取。
删除安全机制的Avenger图形界面和脚本
Gmer
Gmer是一个有名的rootkit检测器和清除器,有很多检测rootkit行为的函数,也可以用它的设备驱动删除文件。它有一个命令行接口,非常容易删除被保护的文件。
使用GMER的killfile函数删除安全机制
可以在这篇博客中找到更多关于使用GMER卸载安全软件的银行木马的信息,
Bootlader恶意软件
在使用反rootkit工具之后,巴西的网络罪犯们走得更远,开始开发他们自己的bootloaers,这被修改后用来专门移除用户机器上的安全机制。下载者负责安装恶意文件然后重启机器。在重启后,恶意软件bootloader能够移除系统中想要删除的文件。
一般地,恶意软件替换原始的NTLDR,从Windows NT系统到Windows XP上的一个bootloader,将其替换成一个经过修改的GRUB版本。
用于替换NTLDR的被修改的GRUB loader
这个loader会读取menu.lst文件,该文件指向一个已经安装在系统上的恶意文件xp-msantivirus和xp-msclean。
包含用于执行恶意软件命令的参数的Menu.lst文件
当恶意软件执行的时候,它会移除与安全机制相关的文件,然后恢复原来的NTLDR文件,这个文件之前被改名为NTLDR.old。
移除安全模块和恢复原始NTLDR的命令
现在的样本
自动化
大部分银行都使用机器标识码来阻止用窃取的信息进行非授权操作的企图。为了绕过这个,坏家伙们开始在感染的机器上实施恶意行为,使用Internet Explorer自动化(以前的OLE自动化)来操作页面内容。
第一个使用这种攻击类型的样本是浏览器帮助对象(Browser Helper Objects,BHOs),它可以检测到转账交易,改变目标账户,把钱转到攻击者那里而不是真正的账户。
后来,同样的方法被用到了Boleto攻击中,它使用自动化获取输入的条形码,然后用假的替换。
因为这方法只在Internet Explorer上有效,恶意软件需要强制用户使用该浏览器访问互联网。因此,它利用一个定时器检查被使用的Firefox或者Chrome,然后结束进程。
避免使用Chrome和Firefox的代码
当找到了一个IE实例,恶意软件会寻找tab页面以读取窗口文本,然后知道访问了哪个URL。
寻找tab句柄,获取访问的URL
搜索目标的特定标题
由于自动化会处理页面的结构,需要知道受害者是否在页面上输入Boleto信息(boleto是一种电子钱包付费方式,也是一种本地支付方法,且无需支付额外费用,常用于巴西)。为了页面一加载就得到完整的URL,并且检查用户是否在目标页面上,它在OnDocumentComplete事件上安装了处理函数:
搜索目标的特定页面
在确认用户在目标页面上之后,恶意软件处理页面结构,在submit按钮上安装一个处理函数,然后它就可以在用户提交页面的时候取得控制权,处理输入的内容。
搜索特定的文本框,获取输入的数据
在收集到输入的数据后,它被处理然后在提交页面之前换成恶意内容。
对于那些我们能找到的样本,字符串混淆,调试器检测,虚拟机检测以及这种方式,都使得其不像其它钓鱼木马和hosts木马那样容易检测。
代码混淆和RunPE
在寻找新的规避检测方法过程中,为了隐藏实施主要操作的代码,巴西网络罪犯开始使用混淆的方法。
在下面的代码中,开发者加密了原始的用于下载恶意载荷的函数代码,通过静态分析你无法明白这个函数的意图是什么。
加密下载者代码
在运行时,恶意软件调用函数解密前面的代码,然后执行:
调用解密代码
解密程序
正如我们在上面的代码中看到的,解密就是一个简单的对密字节的0×42减操作,这是一个简单快速的隐藏代码的方法。
已解密的下载者函数
为了避免被网络防火墙检测,下载的文件被它自己的加密函数加密。
加密的文件
解密的文件
使用与加密下载函数的相同的方法加密了加密函数,在解密这段代码后,我们能找到一个融合了对异或秘钥右移操作的基于异或的加密算法。
在解密完文件之后,不会用恶意代码常用的正常方法执行它。为了隐藏进程,恶意软件使用了一个有名的RunPE的技术,代码会以挂起的方式执行一个干净的进程(比如iexplorer.exe或者explorer.exe),然后把内存内容修改成恶意代码后再执行。
以挂起状态启动干净进程的代码
在以挂起的状态创建完进程之后,代码会把一段新的代码写到内存空间中,设置要执行的新的EIP,然后恢复线程。
写恶意代码,恢复线程
储存恶意文件的Internet explorer进程
因为恶意代码在分配给Internet Explorer的内存空间中运行,使用像Process Explorer的工具来检查发布者签名是不可行的,因为他们检查的是进程对应的文件的签名。
很明显,他们已经完全从使用初学者的代码转到更加专业的开发,我们意识到,是时候更新我们分析巴西恶意软件的方法了。我们肯定,大部分的进化是因为与其他地方的恶意软件的接触和交流,主要是东欧国家,我们在这篇文章中描述过。
AutoIt Crypto
为了躲避检测,AutoIt常用来下载和解密最终的载荷。在编译完成后,AutoIt脚本被加密并嵌入到一个生成的二进制文件中,这使得要分析原始的脚本就必须先提取它。
在寻找更好的隐藏最后载荷方法的过程中,巴西网络罪犯用AutoIt语言开发了一个新的Crypto,解密后的载荷使用RunPE的技术被执行。
AutoIt Cyrpto执行流程
这个crypto使用两种不同的方法保存加密的文件:第一个是使用AutoIt中已经存在的FileInstall函数,另一个是把文件嵌入到二进制文件的末尾。
在使用第二种方法的时候,crypto写一个关键字符串,用来标记加密载荷内容的起始位置,后面就可以找到要解密的内容。在下面的样本中,关键字用的是“Sei que ganharei 20K”的缩写版,意思是“我知道我会赚R$20,000”。
标记加密载荷起始的关键字符串
AutoIt Crypto主代码
在读取加密载荷后,它使用解密密钥“VENCIVINICI”解密内容,然后使用RunPE执行恶意代码。
解密函数的代码不是用AutoIt写的,它是用C语言写的。在编译后,作为一个字符串包含到代码中,然后映射到内存中,使用CallWindowProc API执行。
解密函数的实现
我们发现这个crypto使用了下面的加密和压缩算法。
RC4
XXTEA
AES
LZMA
ZLIB
在恶意软件开发时使用AutoIt并不是一个新鲜的事情,但是,在2014年中期,我们在巴西发现了一个使用AutoIt攻击的高峰,如下图所示:
Trojan.Win32.Autoit:在巴西受攻击的用户数量
MSIL数据库
另一个最近出现的恶意软件类型是恶意软件用.NET代码代替Visual Basic 6.0和Delphi,顺应了我们看到的历史潮流。找到一个用.NET写的下载者并不难。但是当我们发现其中一些样本并没有使用一般的函数下载载荷时,一些Trojan-Banker.MSIL.Lanima 样本吸引了我们的注意力。
下载函数
正如我们在上图中看到的,这个样本并没有使用任何下载函数,因为它使用了SQL Server来储存二进制的内容,它只是使用SQL命令获取内容然后保存到硬盘。
为了隐藏与恶意软件的主要行为相关的文本,字符串被用base64编码并且使用3DES算法加密。
解密函数
这个恶意软件家族在巴西和中国非常流行:
MSIL Crypto
与AutoIt Crypto使用相同的方法,坏家伙们又开发了另一个crypto,这次使用.NET语言。提取真正的可执行文件的过程与AutoItCrypto是一样的,但是它有一个中间模块负责提取最后的载荷。
主模块使用.NET代码,主模块的主函数的功能是提取并加载嵌入的DLL。
.NET Crypto执行流程
crypto主函数
正如我们看到的,上面的函数会使用字符串“cdpapxalZZZsssAAA”作为分隔符分割二进制内容,并且使用第一分块,此分块包含了加密的Loader DLL代码。
Loder DLL的加密内容
现在通过调用名为“fantasma”(英文为“ghost”)的函数解密它,在论坛上这个crypto的官方名称是PolyRevDecrypt,这其实是把要加密的字节,要加密的缓冲区的最后一个字节,以及函数提供的密钥的其中一个字节做一个异或操作。
解密函数
数据被解密之后,代码会使用“docinho” (英文为“candy”)函数加载并执行。
加载和执行Dll的函数
这个库的代码与主可执行文件的代码几乎是相同的,除了它使用的是分割内容的第二个部分。
Loader DLL主函数
RAT
为了降低网络攻击造成的损失,银行在在线交易中使用了两个因素的认证,在原来的基础上,比如机器标识码,使用了硬件token和短信验证码。为了解决这个问题,网络罪犯创建了一个远程管理工具,用于请求网银交易需要的信息。
RAT执行流程
浏览器监控者(browser watcher)会监控用户的浏览器,观察是否访问了目标银行,如果有,它会解压缩并执行RAT客户端,并且通知C&C有新的感染。
网银访问监视器
这个恶意软件使用的字符串被他们自己的加密代码加密。在解密后,它会识别出目标和代码的重要部分。
解密的字符串
对于这种感染方式,一般的,坏家伙们会构建一个管理攻击行为的模式。这里我们能够看到在同一天感染的机器的数量,请注意,这个数字意味着恶意软件控制的机器中访问网银的用户的数量。
展示感染用户列表的C&C面板
RAT客户端会链接服务端,提醒攻击者一个新的受害者访问了网银系统。然后,就可以进行实时攻击。
显示一个新的被害者连接的RAT服务器
在这个阶段,攻击者需要等待用户登录,然后进行攻击。当用户已经登录了,攻击者可以看到用户的屏幕,锁定它并且控制执行流,同时询问有助于他窃取账号的特定信息,比如:
Token
Access card code
Date of birth
Account password
Internet banking password
Electronic signature
为了防止用户发现计算机被远程控制了,这个RAT有一个函数用来模拟银行安全插件升级的样子,显示一个进度条,禁止所有的用户交互行为。同时,由于覆盖的屏幕不会影响攻击者,攻击者可以使用活动的浏览器区域执行银行操作。
模拟升级锁定屏幕
如果确认交易需要一些信息,比如:短信验证码,攻击者可以询问受害者,受害者以为是为了完成升级需要这些信息。
询问token码的屏幕
一旦用户提供了信息,攻击者就可以将之输入到网银屏幕中,绕过交易中使用的两个认证因素。
从受害者接收的信息
勒索软件
巴西网络罪犯不只使用银行恶意软件,他们也探索其它的攻击类型,包括勒索软件。几年前,我们发现了TorLocker,它在恶意代码中包含了一些说明开发者来自巴西的信息。
包含指明作者来自巴西的字符串的代码
正如上图所示,我们发现了蓝色加亮的句子:“Filho de Umbanda não cai!” (“Umbanda”的儿子决不会倒下)。Umbanda是巴西异教区。红色标记的名称是作者的昵称,它也常使用.d74作为加密的文件。这个用户在地下论坛非常活跃,寻找巴西的恶意软件服务。
我们也发现了其它线索,比如使用巴西的服务器获取受害者的IP,用以通知感染事件。
请求一个巴西的服务器来获得受害者的IP
几个月前,我们发现了另一个基于Hidden Tear源代码的勒索程序,它被改造用于攻击巴西用户,与初始程序攻击英语和日语用户不同。
显示葡萄牙语信息的受害者机器,想要获取文件需要支付。
为什么他们在进化
我们有足够的证据表明,巴西的网络罪犯与东欧的团伙有合作,包括Zeus,SpyEye和其它这一地区产生的恶意软件。恶意软件作者增加新的技术到他们的作品中,获得灵感,复制东欧的恶意软件的特性,这一合作直接影响了巴西本地恶意软件的质量和威胁水平。巴西的网络罪犯不仅发展他们的代码质量,而且使用国外的网络犯罪基础设施。
我们在使用恶意PAC脚本的恶意软件发展中第一次看到了这一合作关系的迹象。2011年,这一技术在巴西的恶意软件中迅猛采用,后来俄罗斯的银行木马Capper 开始采用这个技术。这一合作还在继续,巴西的网络罪犯开始使用东欧的银行木马的基础设施,Trojan-Downloader.Win32.Crishi第一个使用DGA域名,由一个东欧的公司所有。Boleto恶意软件也大量使用fast flux域名,以防C2s被拆除,我们看到了其使用“bagaça” (bagasse葡萄牙语)域名,该域名使用匿名服务注册,其与犯罪软件和boleto软件相关联,每一个请求解析到不同的IP。
“bagaça”域名:东欧的fast flux和 bulletproof
其它说明他们合作的迹象是,巴西网络罪犯常会出现在俄罗斯或者东欧的地下论坛中。经常发现以下事情,巴西网络罪犯在俄罗斯地下论坛寻找样本,购买犯罪软件和ATM/PoS恶意软件,或者商务谈判和提供他们的服务。这一合作的结果可以在巴西恶意软件中采用的新技术的发展中看出来。
在俄罗斯地下论坛谈判的巴西恶意软件TorLocker的作者
这些事实表明了,巴西网络罪犯是如何通过与欧洲伙伴合作引进新技术的。我们相信这只是冰山一角,随着巴西网络罪犯们探索和寻找新的攻击商业和普通个人的方法,这种交流会越来越多。
结论
巴西的网络犯罪在最近几年发生了激烈的变化,它从一个利用公开源代码构建的简单的键盘记录器转向一个定制的能使用受害主机实施完整攻击的远程管理工具。
恶意软件以前在执行后立即显示一个钓鱼的屏幕,现在,完全以反应的方式执行,等到一个有效的会话后才开始工作。
这意味着为了开发他们的恶意代码网络罪犯投入了大量的金钱和时间,增强反调试技术,使恶意软件长时间运行,不被检测到。
正如我们知道的,他们在和东欧,俄罗斯的网络罪犯们联系,他们交换信息,恶意软件源码,以及在攻击中会用到的服务。我们可以看到,巴西使用的许多攻击是在俄罗斯的恶意软件中首次发现的,并且巴西使用的技术后来也会用到俄罗斯的攻击中。
基于此,我们预测将会发现使用代码混淆,反调试,加密算法以及安全通信技术的巴西的恶意软件,这将使我们的工作变得比现在更艰难。