Golang(Go)
Zebocry
MalwarebytesTrojan.CryptoStealer.Go

样本分析

Trojan.CryptoStealer.Go
  • 941330c6be0af1eb94741804ffa3522a68265f9ff6c8fd6bcf1efb063cb61196 – HyperCheats.rar (原始 程序包)
  • 3fcd17aa60f1a70ba53fa89860da3371a1f8de862855b4d1e5d0eb8411e19adf  – HyperCheats.exe (UPX packed)

行为分析

在对文件的分析中,我们发现Golang调用了WindowsAPI。这里我们可以使用典型工具进行跟踪调用,例如PIN跟踪器。 我们发现恶意软件会在以下路径中搜索文件:

"C:\Users\tester\AppData\Local\Uran\User Data\"
"C:\Users\tester\AppData\Local\Amigo\User\User Data\"
"C:\Users\tester\AppData\Local\Torch\User Data\"
"C:\Users\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\User Data\"
"C:\Users\tester\AppData\Local\Comodo\User Data\"
"C:\Users\tester\AppData\Local\CocCoc\Browser\User Data\"
"C:\Users\tester\AppData\Local\Vivaldi\User Data\"
"C:\Users\tester\AppData\Roaming\Opera Software\"
"C:\Users\tester\AppData\Local\Kometa\User Data\"
"C:\Users\tester\AppData\Local\Comodo\Dragon\User Data\"
"C:\Users\tester\AppData\Local\Sputnik\Sputnik\User Data\"
"C:\Users\tester\AppData\Local\Google (x86)\Chrome\User Data\"
"C:\Users\tester\AppData\Local\Orbitum\User Data\"
"C:\Users\tester\AppData\Local\Yandex\YandexBrowser\User Data\"
"C:\Users\tester\AppData\Local\K-Melon\User Data\"
Yandex

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

"C:\Users\tester\Desktop\*"
%APPDATA%

img

“桌面”文件夹包含从桌面及其子文件夹复制的所有TXT文件。 下面是我们的测试机器示例:

img

当搜索完成后,这个文件被压缩成为:

img

C&C (cu23880.tmweb.ru/landing.php)

img

内部过程

Golang编译的二进制文件通常很大,所以我们对这个大文件并没有感到奇怪。而这里的样本已经使用UPX打包以减小其大小。 我们可以使用标准UPX进行解压缩。 结果,我们得到了简单的Go二进制文件。 导出表显示了编译路径和一些其他的功能:

img

观察这些导出文件,我们可以了解应用程序内部使用的静态库。

其中的许多功能(与trampoline有关)可以在模块sqlite-3中找到:https://github.com/mattn/go-sqlite3/blob/master/callback.go。

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

工具

IDA ProGeorge ZaytsevIDAGolangHelper

img

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

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

img

之后(大多数函数都自动解析并添加了相关名称):

img

main_ *

img

代码审计

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

img

它与以下模块静态链接:

分析此功能可以帮助我们进行功能预测:即查看上述库函数的具体内容。我们可以看到它们通过网络进行通信,读取SQLite3数据库并抛出异常。 其他初始化器建议使用正则表达式、zip格式并读取环境变量。

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

img

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

以太坊:

img

门罗币:

img

main_main

img

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

Goroutineruntime.newproc

然后,恶意软件将其全部压缩到一个包中,最后,压缩包被上传到C&C服务器。

img

何时窃取?

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

Golang中的字符串以串联形式存储在一起:

img

之后,根据需要检索的内容进行操作。 因此,看看每个字符串被引用的代码中的具体位置并不容易。

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

img

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

img

我们来观察这些查询试图获取的具体数据。 获取引用的字符串,我们可以检索并列出所有字符串:

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字符串。 其中许多内容与加密货币钱包有关,但我们也可以找到对Telegram的引用。

Software\\Classes\\tdesktop.tg\\shell\\open\\command
\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\
\\AppData\\Roaming\\Electrum\\wallets\\default_wallet
\\AppData\\Local\\Torch\\User Data\\
\\AppData\\Local\\Uran\\User Data\\
\\AppData\\Roaming\\Opera Software\\
\\AppData\\Local\\Comodo\\User Data\\
\\AppData\\Local\\Chromium\\User Data\\
\\AppData\\Local\\Chromodo\\User Data\\
\\AppData\\Local\\Kometa\\User Data\\
\\AppData\\Local\\K-Melon\\User Data\\
\\AppData\\Local\\Orbitum\\User Data\\
\\AppData\\Local\\Maxthon3\\User Data\\
\\AppData\\Local\\Nichrome\\User Data\\
\\AppData\\Local\\Vivaldi\\User Data\\
\\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\\Roaming\\Mincoin\\wallet.dat
\\AppData\\Roaming\\YACoin\\wallet.dat
\\AppData\\Roaming\\Zcash\\wallet.dat
\\AppData\\Roaming\\devcoin\\wallet.dat

不成熟的恶意软件

此恶意软件中使用的一些设计模式提醒我们仍然存在类似的窃取软件,例如Evrial、PredatorTheThief和Vidar。它们有类似的目标,并将被盗数据作为ZIP文件发送给C&C。但是,没有证据证明这个窃取软件的作者与这些案件有联系。

当了解了这个恶意软件的实现和功能时,我们发现它相当简单。它占用空间大是因为其来自许多静态编译的模块。可能这个恶意软件还处于开发的早期阶段,作者可能刚刚开始学习Go并正在进行某些实验。我们将密切关注其发展。

起初,由于它具有庞大的代码库并且大部分人对其结构不熟悉,所以分析Golang编译的应用程序可能会相对困难。但是在适当的工具的帮助下,安全研究人员可以轻松地在这个“迷宫”中进行导航,因为所有的功能都被贴上标签。由于Golang是一种相对较新的编程语言,我们可以预期分析它的工具会随着时间的推移而成熟。

恶意软件是新的攻击趋势吗?现在下定义还有点太早了。但我们知道,拥有对待新语言编写恶意软件的安全意识对我们的非常的重要。

本文为翻译稿件,原文为:https://blog.malwarebytes.com/threat-analysis/2019/01/analyzing-new-stealer-written-golang/