以Linux系统为目标:分析新型Golang语言勒索软件
导语:在本文中,我将分析一个新发现的Golang勒索软件,该软件主要针对Linux系统发动攻击。
0x00 概述
在过去的两个月中,我一直在研究使用Golang编写的逆向软件,并对其进行逆向工程。Go语言,也成为Golang,是Google设计的一种静态类型的、已编译的编程语言,目前在恶意软件开发社区中正在变得越来越流行。在本文中,我将分析一个新发现的Golang勒索软件,该软件主要针对Linux系统发动攻击。
0x01 Go二进制样本分析
我们所分析的样本是已经stripped的ELF可执行文件。Stripped后的可执行文件会使逆向工作变得更加困难,因为我们还需要做一些额外的工作,来还原stripped后的二进制文件中的符号。但幸运的是,有一个redress工具可以为我们提供帮助。Redress软件是用于分析使用Go编译器编译的、stripped后的Go二进制文件的工具,该软件从二进制文件中提取数据,然后将其用于重建符号,并进行分析。
下面是使用参数“-src”分析此样本的输出:
如上图所示,我们可以看到该恶意软件的源代码包含三个Go文件,可以找到所有已经实现的功能和对应的代码行号。通过某些功能的名称,我们可以猜测该恶意软件应该属于勒索软件。但是,根据源代码的行数仅仅在300左右,我们判断这种勒索软件并不复杂,可能处于刚刚开发的阶段。
接下来,我们在调试器中进行动态调试。在这里,我使用Radare2作为调试器。Radare2能够通过发出分析命令来分析stripped后的Go二进制文件,并还原符号。这也就是我之所以选择Radare2作为该项目的调试器,而没有选择Linux中GDB的原因。
0x02 Go二进制文件的动态分析
我们在Radare2中发出命令“aaa”,以执行自动分析,在下图中,我们可以看到Radare2很好地还原并识别了函数名和符号名。使用该工具,确实能有效帮助我们调试了Go二进制文件。
使用Radare2还原的函数名称和符号:
如我们所见,函数init()在主函数之前执行。函数check()在函数init()中调用。在函数check()中,恶意软件首先通过向hxxps://ipapi.co/json/发送一个HTTP请求,来获取受感染主机的位置信息。然后,检查该恶意软件是否在特定国家运行,如果在特定国家范围内,则会自动停止运行。这些国家包括:白俄罗斯(BY)、俄罗斯(RU)和乌克兰(UA)。
过滤白俄罗斯(BY)、俄罗斯(RU)和乌克兰(UA):
在main()函数中,首先删除Go二进制文件。随后,调用函数randSeq()生成一个随机AES密钥,其大小为0x20字节,如下图所示。
生成随机AES密钥:
接下来,将调用函数makesecret(),该函数用于使用以二进制形式硬编码的RSA公钥来加密AES密钥。在该函数中,会调用函数EncryptPKCS1v15,使用RSA加密和PKCS#1 v1.5中的填充方案(Padding Scheme)对特定的AES密钥进行加密。
Go二进制文件中的硬编码RSA公钥:
下面是RSA加密后的数据。
使用RSA加密后的加密AES密钥:
接下来,它在Golang包encoding/base64中调用函数EncodeToString,以使用Base64算法对先前加密的数据进行编码。
使用Base64编码的加密AES密钥:
然后,它将为解密的README文件形成一个缓冲区,如下图所示。
解密的README文件的缓冲区:
我们可以看到,加密的AES密钥已经使用Base64编码写入解密的自述文件(readme)中。
在勒索软件加密文件之前,它会通过发出命令“service stop [pname]”或“systemctl stop [pname]”来关闭以下进程列表。
要停止的服务列表:
在该程序尝试停止apache2.service时,会弹出一个标题为“需要身份验证”(Authentication Requird)的对话框,提示用户输入系统密码以完成此操作。
apache2.service身份验证对话框提示:
最后,通过在Golang包“path/filepath”中调用函数Walk(root string, walkFn WalkFunc),恶意软件开始遍历根目录“/”,并开始对文件进行加密。
遍历根目录并加密文件:
该恶意软件还包含用于加密的目录黑名单,具体如下。
用于加密的目录黑名单:
该恶意软件使用AES-256-CFB算法对文件进行加密,加密文件的命名规则是原始文件名+“.encrypted”后缀扩展名。用于解密的自述文件(README)如下图所示。
用于解密的README文件:
函数EncFile()用于加密文件。它首先获取需要加密的文件的大小,如果文件大小小于0x986880(1000000)字节,则会使用AES-256-CFB算法加密所有文件数据。否则,将会读取数据的前0x986880(1000000)字节并将其加密,然后将原始文件的剩余数据复制到加密文件的末尾。
检查要加密的文件的大小:
如果文件大于0x989680(以字节为单位),经过加密后的数据如下所示:
0x03 总结
根据我们的分析,可以看到这种勒索软件并不复杂,可能处于初始开发阶段。我们应该意识到,越来越多的攻击者正在使用Golang语言开发恶意软件,我们也将不断监测并分析这类以新型编程语言编写的恶意软件。
0x04 防御方案
FortiGuard AntiVirus服务已经将该恶意ELF文件检测为“ELF/Cryptor.B!tr”。
0x05 参考信息
SHA-256:50470f94e7d65b50bf00d7416a9634d9e4141c5109a78f5769e4204906ab5f0b
IoC:fullofdeep<at>protonmail.com
REDRESS:https://go-re.tk/redress/
Radare2:https://rada.re/r/
发表评论