扒一扒CARBANAK的源代码,看它们是如何巧妙构思并运行的?(一)

xiaohui 逆向破解 2019年4月26日发布
Favorite收藏

导语:在本系列文章中,我们将详细阐述并分享以前基于二进制代码逆向工程的公开分析中得出的推论。在本文的第一部分中,我将从源代码的角度讨论俄语语言问题,CARBANAK工具的翻译图形用户界面以及反分析策略。

FLARE(FireEye Labs Advanced Reverse Engineering 的缩写)通常会分析一些被大量使用的、且危害极大的恶意软件的源代码,然后对其进行分析,比如通过逆向工程、事件响应、取证调查和渗透测试。

FIN7(也被称为Anunak或银行大盗Carbanak)是目前为止组织最为严密的复杂网络犯罪组织,自2013年起就开始活跃。

以下为该团伙犯罪时间线:

2013 年-2014 年 – 开发和使用 Anunak 恶意软件,主要针对金融机构和 ATM 网络;

2014 年-2016 年 – 开发并使用 Carbanak 恶意软件,相当于 Anunak 更新更复杂的版本;

2016 年-2017 年 – 使用合法渗透测试框架 Cobalt Strike 开发定制恶意软件;

2016 年初,Carbanak 团伙主要针对美国和中东地区的银行和金融机构。卡巴斯基实验室于 2015 年首次发现 Carbanak 团伙,该集团从 100 家金融机构窃取了 10 亿美元资金;

2016 年11月,Trustwave 的专家发现了该组织针对酒店业发起的一项新活动;

2017 年1月,Carbanak 团伙开始使用 Google 服务进行命令和控制(C&C)通信,监控被感染的电脑

2018年3月,欧洲刑警组织、FBI,以及西班牙、罗马尼亚、白俄罗斯以及中国台湾的网络安全公司、金融机构和执法机构联手行动,在西班牙阿利坎特市抓捕了利用 Carbanak 木马和 Cobalt 木马攻击银行谋取暴利的 Carbanak 犯罪团伙头目,对该团伙予以致命打击。

Carbanak 犯罪团伙至今共针对全球几十个多个国家和地区(俄罗斯、日本、瑞士、美国、荷兰、中国等)的 几百家家银行、电子支付系统和金融机构发起攻击,造成了至少几十亿欧元的重大损失。

2017年,FireEye 的威胁分析师Barry Vengerik和Tom Bennet发表了《CARBANAK后门背后的玄机》一文,文中强调:

Carbanak 犯罪团伙使用的许多技术,通常都是国家资助的攻击者使用的。其使用的技术的复杂程度,在经济动机趋势下的黑客身上并不多见。

在那篇文章发表之后,FireEye 的威胁分析师Nick Carr又发现了两个RAR压缩文件,其中包含CARBANAK源代码、构建器和其他工具(VirusTotal上目前有kb3r1papwmie两种版本)。

FLARE恶意软件分析请求通常最多只包含几十个文件,但是CARBANAK的源代码是20MB,其中了包含755个文件,由39个二进制文件和100000行代码组成。

我们本文的目标是找到之前分析中漏掉的威胁情报,在本系列文章中,我们将详细阐述并分享以前基于二进制代码逆向工程的公开分析中得出的推论。在本文的第一部分中,我将从源代码的角度讨论俄语语言问题,CARBANAK工具的翻译图形用户界面以及反分析策略。对源代码的分析与对二进制代码的分析一样困难,甚至更困难。

文件编码和语言注意事项

阅读源代码的过程需要两步:首先是正确的编码显示文件,其次是学习足够的俄语。图1显示了文本编辑器中,一开始还不知道正确编码的CARBANAK源代码:

1.png

没有正确解码的文件

根据猜测,这位文件的编码应该使用的是UTF-8和codepage1251(西里尔语或 古斯拉夫语)。以下这些文件的语言主要是codepage1251:

2.png

codepage1251(西里尔语)源代码

图2是一个C ++标头文件,定义了后门命令执行中涉及的错误值。其中大多数标识符都是英文的,但有些标识符俄语,需要学习俄语才能看出它描述的是什么。 

为了克服语言的障碍,我特意编写了一个脚本来仔细检查文件并创建优先级词汇表。该脚本位于FireEye vocab_scraper GitHub存储库中,它会遍历源目录,查找可打印的较低ASCII范围之外的所有字符序列:从十进制值32(空格字符)到126(波浪字符“~”)。该脚本将每个单词添加到Python defaultdict_并递增其计数。最后,脚本会按发生频率对此字典进行排序,并将其转储到文件中。

结果是一个3400多个单词的词汇表,部分结果如图3所示:

3.png

来自CARBANAK源代码的前19个西里尔字符序列

我花了几个小时在俄语学习网站上学习西里尔字母和俄语单词的发音。然后,我查找了使用最广泛的前600多个单词并创建了一个小字典。我将俄语语言输入添加到分析VM中,并使用Microsoft的屏幕键盘(osk.exe)来导航西里尔语键盘布局并查找定义。

译者注:2017年FireEye刚刚发布了一款名为 FLARE VM的软件,这是一款windows平台的发行软件,灵感来源于诸如Kali和REMnux之类的Linux发行版。它是由FireEye威胁研究员Peter Kacherginsky开发的,用来解决与维护定制VM相关的问题。

学习耳语除了对源代码注释之外,还可以了解如何阅读和输入西里尔字母对于翻译我在源代码转储中找到的CARBANAK图形用户界面非常有用。下图显示了我翻译的CARBANAK的命令和控制(C2)用户界面。

4.png

翻译后的C2图形用户界面

这些用户界面分别包括视频管理和回放应用程序,分别如图5和图6所示。

5.png

翻译后的视频管理应用程序用户界面

6.png

翻译后的视频回放应用程序用户界面

下图显示了操作员工具的RAR压缩中包含的后门构建器:

7.png

翻译后的后门构建器应用程序用户界面

操作员RAR文件还包含一个操作员手册,解释了所有后门命令的语义。下图显示了本手册中的前几个命令,包括俄语和英语。

8.png

操作员手册(左:原始俄语;右:翻译后的英语)

在更简单的后门中,函数会直接计算出从C2服务器接收的命令ID,并将控制分派给正确的函数以执行命令。例如,后门可能向其C2服务器请求一个命令,并接收一个带有命令ID 0x67的响应。后门中的dispatch函数将根据几个不同的值检查命令ID,包括0x67,比如,可以调用函数来向C2服务器执行反向shell。图9显示了在IDA Pro中查看的此类函数的控制流程图。每个代码块都检查命令ID,并将控制权传递给适当的命令处理代码,或者继续检查下一个命令ID。

9.png

一个简单命令处理函数的控制流程图

而在这方面,CARBANAK的做法完全不同。它使用一个名为命名通道的Windows机制,作为在后门控制下的所有线程、进程和插件之间进行通信和协调的手段。当CARBANAK任务组件接收到一条命令时,它将该命令转发到一个命名通道上,在该通道上它将通过几个不同的函数来处理消息,可能会将消息写入一个或多个额外的命名通道中,直到到达最终处理指定命令的目的地。命令处理程序甚至可以指定自己的命名通道,以便从C2服务器请求更多数据。当C2服务器返回数据时,CARBANAK将结果写入此辅助命名通道,并触发一个回调函数以异步处理响应数据。 CARBANAK命名的基于通道的任务组件非常灵活,可以控制固有的命令处理程序和插件。它还允许本地客户端在不使用网络的情况下向CARBANAK发送命令。实际上,我们不仅编写了这样的客户端来帮助进行分析和测试,而且还编写了一个名为botcmd.exe的客户端。

艰难的分析过程

从二进制角度分析CARBANAK中的这种命令处理机制无疑是具有挑战性的,它需要为反汇编中的许多不同视图维护选项卡,以及一种命令ID和命名通道名称的文本映射,以描述入站命令在到达目的地之前通过各种通道和函数的过程,图10显示了七个命名通道消息处理函数的控制流程图。通过二进制透视图,我就没有必要搜索多个源文件并处理模糊的函数名称。通过反汇编程序,我可以轻松地跟踪函数和全局变量的交叉引用,并在代码中打开多个相关的视图。

10.png

命名通道消息处理函数的控制流程图

通过源代码这个角度,我们可以很容易地对恶意软件做出准确的分析。这是因为,源代码包含了许多在编译和链接过程中丢失的信息。即便使用此方法,分析CARBANAK的任务组件(用于处理C2服务器发送的命令)也不是件容易的事。根据所使用的C2协议和正在处理的命令,控制流可能会在不同的函数中采用不同的路径,以便稍后再次使用相同流程并完成相同的命令。分析需要在5个文件中的近20个函数之间来回跳转,通常需要回溯以恢复关于函数指针和参数的信息,这些信息是从多达18个层传回来的。分析还涉及解决c++类继承、范围模糊、重载函数以及在使用命名通道使用时控制流终止等问题。简而言之,即使在源代码中,也很难对CARBANAK进行准确分析。

CARBANAK源代码中的反分析机制

CARBANAK的可执行代码充满了将十六进制数字推送到同一函数的逻辑,然后是对返回值的间接调用。这很容易被识别为模糊函数导入解析,其中CARBANAK使用一个名为PJW的简单字符串哈希(以其作者P.J. Weinberger的名字命名)来定义Windows API函数,而不公开它们的名称。PJW哈希的Python实现如图11所示。

def pjw_hash(s):
    ctr = 0
    for i in range(len(s)):
        ctr = 0xffffffff & ((ctr << 4) + ord(s[i]))
        if ctr & 0xf0000000:
            ctr = (((ctr & 0xf0000000) >> 24) ^ ctr) & 0x0fffffff
 
    return ctr

PJW哈

这种命名方法在CARBANAK样本中使用了数百次,阻碍了分析人员对恶意软件功能的分析。幸运的是,反汇编程序可以使用flare-ida脚本来注释混淆的导入,如图12所示。

12.png

使用FLARE的shellcode哈希搜索注释的模糊处理导入解决方案

CARBANAK的开发者通过使用C预处理器宏和预编译源代码扫描步骤来计算函数哈希,相对轻松地实现了整个后门的这种模糊的导入解析。图13显示了相关API宏和相关机制的定义。

13.png

用于导入解析的API宏

API宏允许恶意软件的开发者输入API(SHLWAPI, PathFindFileNameA)(…),并将其替换为GetApiAddrFunc(SHLWAPI, hashPathFindFileNameA)(…)。SHLWAPI是一个符号宏,定义为常量3,hashPathFindFileNameA是反汇编中观察到的字符串散列值0xE3685D1。但是如何定义哈希?

CARBANAK源代码中内嵌了一个程序,它负责扫描源代码,寻找API宏的调用,从而构建一个标头文件,为整个代码库中遇到的所有Windows API函数名定义字符串哈希。图14显示了这个实用程序的源代码及其输出文件api_funcs_hash.h。

14.png

字符串哈希实用程序的源代码和输出内容

当我对经过混淆处理的恶意软件进行逆向工程时,除了理解它本身的混淆技术如何实现外,我还发现了开发者使用了强大的C预处理器以及自定义代码扫描和代码生成工具进行混淆。

总结

通过CARBANAK的源代码,我们发现这些恶意软件的开发者是如何处理代码混淆的。无论是任务代码还是Windows API解析系统,恶意软件分析师都很难发现其中的机关。

在接下来的几个系列中,我们将逐步分析CARBANAK是如何规避安全监测,并进一步发起攻击的? 

本文翻译自:https://www.fireeye.com/blog/threat-research/2019/04/carbanak-week-part-one-a-rare-occurrence.html如若转载,请注明原文地址: https://www.4hou.com/reverse/17598.html
点赞 4
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论