Golang(Go)
是一种相对较新的编程语言,然而用这个语言编写的恶意软件却不常见。不过最近随着go语言的不断流行,用这门语言编写的软件慢慢的出现,这也给安全分析人员带来了挑战。在研究过程中,我们发现由于这种语言编写的应用程序体积庞大,在调试器下看起来与使用其他语言编译的应用程序(如C/C++)有很大不同。
最近,我们研究人员观察到一种新型用Go编写的Zebocry
恶意软件。详细内容查看:这里。
我们在实验室中捕获了一种用Go编写的恶意软件。 这一次,Malwarebytes
将Trojan.CryptoStealer.Go
文件归类为窃取用户信息的软件。这篇文章将详细介绍其功能,同时展示用于分析Go中编写的其他恶意软件的方法和工具。
Malwarebytes将此窃取程序命名为Trojan.CryptoStealer.Go
:
在对文件的分析中,我们发现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%
创建的文件夹中:
“桌面”文件夹包含从桌面及其子文件夹复制的所有TXT文件。 下面是我们的测试机器示例:
当搜索完成后,这个文件被压缩成为:
我们可以看到这个数据包被发送到 C&C (cu23880.tmweb.ru/landing.php)
:
Golang编译的二进制文件通常很大,所以我们对这个大文件并没有感到奇怪。而这里的样本已经使用UPX打包以减小其大小。 我们可以使用标准UPX进行解压缩。 结果,我们得到了简单的Go二进制文件。 导出表显示了编译路径和一些其他的功能:
观察这些导出文件,我们可以了解应用程序内部使用的静态库。
其中的许多功能(与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 Pro
以及George Zaytsev
编写的脚本IDAGolangHelper
。 首先,Go可执行文件必须加载到IDA中。 然后,我们可以从菜单(文件 ->脚本文件)运行脚本。 然后,我们会看到以下菜单,可以访问特定功能:
首先,我们需要确定Golang的版本(该脚本提供了一些有用的信息)。 我们得到了其版本是Go 1.2。 然后,我们重命名函数并添加标准的Go类型。 完成这些操作后,代码看起来更具可读性。 下面,我们可以看到使用脚本之前和之后的函数视图。
之前(仅导出的函数被命名):
之后(大多数函数都自动解析并添加了相关名称):
其中许多功能来自静态链接库。 因此,我们需要主要关注注释为main_ *
的函数,这些函数特定于可执行文件。
在函数“main_init”中,我们可以看到在应用程序中使用的模块:
它与以下模块静态链接:
分析此功能可以帮助我们进行功能预测:即查看上述库函数的具体内容。我们可以看到它们通过网络进行通信,读取SQLite3数据库并抛出异常。 其他初始化器建议使用正则表达式、zip格式并读取环境变量。
此函数还负责初始化字符串。 我们可以看到其中一些是base64解码的:
在字符串初始化中,我们看到对加密货币钱包的引用。
以太坊:
门罗币:
Golang二进制文件的主要功能是注释“main_main
”。
在这里,我们可以看到应用程序正在创建一个新目录(使用函数 os.Mkdir)。 这里显示将要复制文件的目录。
之后,有几个Goroutine
已经开始使用runtime.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字符串。 其中许多内容与加密货币钱包有关,但我们也可以找到对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/