Golang(去)是一种相对较新的编程语言,并不常见于在其中写入恶意软件。然而,在Go的新变种正在慢慢涌现,为恶意软件分析师提出挑战。以这种语言编写的应用程序庞大,并且在调试器下看起来很大,那些由其他语言编译的调试器,例如C / C ++。

最近,观察到Zebrocry恶意软件的新变种这是完全写的(详细分析可用这里)。

我们捕获了另一种类型的恶意软件在我们的实验室中。这一次,这是一个非常简单的偷窃者被恶魔饲料检测到必威平台APPtrojan.cryptostealer.go.这篇文章将提供其功能的细节,但也展示了方法和工具,可用于分析其他恶意软件编写的围棋。

分析示例

这个偷窃师被Malwarebytes作为Trojan.C必威平台APPryptostealer.Go检测到:

行为分析

在幕后,Golang调用WindowsAPI,我们可以使用典型工具跟踪调用,例如PIN跟踪器。我们看到恶意软件在以下路径下搜索文件:

“C:\ Users \ tester \ appdata \ local \ uran \ user data \”c:\ users \ tester \ appdata \ local \ amigo \ user \ user data \“c:\ desers \ tester \ appdata \ local \火炬\用户数据\“”C:\用户\ tester \ appdata \ local \ chromium \ user data \“c:\ users \ tester \ appdata \ local \ nichrome \ user data \”c:\ users \ tester \AppData \ Local \ Google \ Chrome \ User Data \“”C:\ Users \ tester \ appdata \ local \ 360browser \ browser \ user data \“”c:\ users \ tester \ appdata \ local \ maxthon3 \用户数据\““C:\ Users \ tester \ appdata \ local \ comodo \ user data \”c:\ users \ tester \ appdata \ local \ coccoc \ browser \ user data \“”c:\ busers \ tester \ appdata \ lockVivaldi \用户数据\“”C:\用户\ tester \ appdata \ roaming \ opera软件\“C:\ Users \ tester \ appdata \ local \ kometa \ user data \”c:\ users \ tester \ appdata \本地\ comodo \ dragon \ \ user data \“”c:\ users \ tester \ appdata \ local \ sputnik \ sputnik \ user data \“c:\ users \ tester \ appdata \ local \ google(x86)\ chrome \ mevicesData \“”C:\ Users \ tester \ appdata \ local \ orbitum \ user data \“c:\ users \ tester \ appdata \ local \ yandex \ yandexbrowser \ yandexbers \ user data \”c:\ users \ tester \ appdATA \ local \ k-melon \用户数据\“

这些路径指向从浏览器存储的数据。一个有趣的事实是,其中一个路径指向yandex浏览器,主要在俄罗斯流行。

下一个搜索的路径是桌面:

“C: \ \用户测试桌面\ \ *”

所有找到的文件被复制到%APPDATA%中创建的文件夹:

文件夹“桌面”包含从桌面和子文件夹复制的所有TXT文件。来自我们的测试机器的示例:

搜索完成后,文件被压缩:

我们可以将此数据包发送到C&C(CU23880.TMWeb.ru/landing.php):

内部

Golang编译的二进制文件通常很大,所以样品已经用UPX填充了样品以最小化其尺寸并不奇怪。我们可以用标准轻松打开包装UPX.结果,我们得到了简单的二进制。导出表显示编译路径和其他一些有趣功能:

看着那些出口,我们可以了解内部使用的静态图书馆。

这些函数(与蹦床相关的)可以在模块sqlite-3中找到:https://github.com/mattn/go-sqlite3/blob/master/callback.go.

功能CrossCall2来自Go运行时,它与来自C / C ++应用程序的调用相关(https://golang.org/src/cmd/cgo/out.go)。

工具

为了进行分析,我使用了IDA Pro和脚本Idagolanghelper.作者:乔治·扎伊采夫首先,Go可执行文件必须加载到IDA中。然后,我们可以从菜单(File - >脚本文件)运行脚本。然后我们看到下面的菜单,提供访问特定功能:

首先,我们需要确定Golang版本(脚本提供了一些有用的启发)。在本例中,它是Go 1.2。然后,我们可以重命名函数并添加标准的Go类型。完成这些操作后,代码看起来可读性更强了。下面,您可以看到使用脚本之前和之后的函数视图。

之前(仅命名导出的函数):

之后(大多数函数都有他们的名称自动解析和添加):

许多函数来自静态链接库。因此,我们需要主要关注函数作为main_ *- 特定于特定可执行文件。

代码概述

在“main_init”函数中,我们可以看到将在应用程序中使用的模块:

它与以下模块静态链接:

分析此功能可以帮助我们预测功能;即寻找上述图书馆,我们可以看到它们将通过网络进行通信,读取SQLite3数据库,并抛出异常。其他初始化者建议使用正则表达式,ZIP格式和读取环境变量。

这个函数还负责初始化和映射字符串。我们可以看到其中一些是先base64解码的:

在字符串中初始化,我们看到对加密货币钱包的引用。

Etreeum:

Monero:

Golang二进制文件的主要函数被标注为“main_main”。

在这里,我们可以看到应用程序正在创建一个新目录(使用函数os.mkdir.)。这是将复制找到的文件的目录。

之后,有几个已经开始使用的Goroutinesruntime.newproc..(Goroutines可以与线程类似地使用,但它们被不同地管理。可以找到更多细节这里)。这些例程负责搜索文件。同时,SQLite模块用于解析数据库以窃取数据。

然后,恶意软件将全部拉到一个包中,最后,包上载到C&C。

什么被盗?

要查看攻击者对哪些数据感兴趣的数据,我们可以在执行SQL查询的函数中更仔细地查看,并查看相关字符串。

Golang中的字符串以串接的形式批量存储:

稍后,将按需从该批量中检索单个块。因此,查看每个字符串是从代码中的哪个位置引用的并不容易。

下面是打开“sqlite3”数据库的代码片段(检索到长度为7的字符串):

另一个例子:这个查询是通过给定的偏移量和长度从完整的字符串块中检索的:

让我们看看这些查询试图获取哪些数据。通过获取调用引用的字符串,我们可以检索并列出所有的字符串:

select name_on_card, expiration_month, expiration_year, card_number_encrypted, billing_address_id FROM credit_cards select * FROM autofill_profiles select email FROM autofill_profile_emails select number FROM autofill_profile_phone select first_name, middle_name, last_name, full_name FROM autofill_profile_names

我们可以看到浏览器的cookie数据库在与在线交易相关的搜索数据中查询:信用卡号,到期日期以及名称和电子邮件地址等个人数据。

被搜索的所有文件的路径存储为Base64字符串。其中许多与加密货币钱包有关,但我们也可以找到对电报信使的引用。

软件\\ classes \\ tdesktop.tg \\ shell \\ open \\命令\\ appdata \\ local \\ yandex \\ yandexbrowser \\用户数据\\ \\ appdata \\ roaming \\ electum \\ wallets \\default_wallet.
\\ appdata \\ local \\ torch \\ user data \\ \\ appata \\ local \\ uran \\ \\ roming \\ oppata软件\\ \\ appdata \\ local \\Comodo \\用户数据\\ \\ appdata \\ local \\ chromium \\ user data \\ \\ appata \\ local \\ chromodo \\用户数据\\ \\ appdata \\ local \\ kometa \\用户数据\\ \\ appdata \\ local \\ k-melon \\用户数据\\ \\ appata \\ local \\ orbitum \\用户数据\\ \\ appata \\ local \\ maxthon3 \\用户数据\\ \\ appdata \\ local \\ nichrome \\用户数据\\ \\ appata \\ local \\ Vivaldi \\用户数据\\ \\ appdata \\ roaming \\ bbqcoin \\ wallet.dat \\ appdata \\ roaming \\ bitcoin \\ wallet.dat \\ appdata \\ roaming \\ Ethereum \\ keystore \\ appdata \\ roaming \\ exodus \\ seed.seco \\ appdata \\ roaming \\ franko \\ wallet.dat \\ appdata\\ roaming \\ iocoin \\ wallet.dat \\ appdata \\ roaming \\ ixcoin \\ wallet.dat \\ appdata \\ rooaming \\ mincoin \\ wallet.dat \\ appdata \\ rooaming \\ yacoin \\wallet.dat \\ appdata \\ roaming \\ zcash \\ wallet.dat \\ appdata \\ roming \\ devcoin \\ wallet.dat

大而不自定的恶意软件

这个恶意软件中使用的一些概念提醒我们其他窃贼,例如兴奋,预测,和维大.它具有相似的目标,并将被盗数据作为ZIP文件发送到C&C。但是,没有证据表明,这位偷窃师的作者是以某种方式与这些案件相关联。

当我们看看这个恶意软件的实现和功能时,它是相当简单的。它的大尺寸来自于许多静态编译的模块。这种恶意软件可能还处于开发的早期阶段——它的作者可能刚刚开始学习围棋,正在进行试验。我们将继续关注它的发展。

首先,分析golang编译的应用程序可能会让人感到难以承受,因为它有庞大的代码库和不熟悉的结构。但是在适当的工具的帮助下,安全研究人员可以很容易地通过这个迷宫,因为所有的功能都有标签。由于Golang是一种相对较新的编程语言,我们可以预期,分析它的工具将随着时间的推移而成熟。

是恶意软件在威胁发展的新兴趋势中写道吗?这有点太快了。但我们确实知道以新语言编写的恶意软件的认识对于我们的社区很重要。