导语:Zeppelin是一款基于Delphi的“恶意软件即服务”(RaaS),其前身为勒索软件Vega(VegaLocker),两者在代码和功能上多有重合,但Zeppelin所涉及的攻击场景则与Vega明显不同。
介绍
Zeppelin是一款基于Delphi的“恶意软件即服务”(RaaS),其前身为勒索软件Vega(VegaLocker),两者在代码和功能上多有重合,但Zeppelin所涉及的攻击场景则与Vega明显不同。
Vega样本于2019年初首次发现,曾在俄罗斯在线广告网站Yandex.Direct上与其他金融恶意软件捆绑分发,主要针对俄语用户,目标广泛没有强针对性。在这一年中,Vega也出现了几个新变种,每个版本都有不同的名称(Jamper,Storm,Buran等),其中一些有在地下论坛上出售。
Zeppelin是Vega的最新变种,首批观测到的Zeppelin样本编译时间戳在2019年11月6日之后,其目标是欧洲和美国的少数科技及医疗公司。所有Zeppelin样本在检测到机器为俄罗斯或其他前苏联国家/地区后都会退出运行。
Zeppelin具有高度适配性,可以部署为EXE、DLL,或封装在PowerShell加载程序中。样本托管在水坑攻击过的网站,PowerShell则托管在Pastebin上。有一些攻击是通过mssp(安全管理服务提供商)进行的,这与最近另一场Sodinokibi勒索软件的攻击事件具有很高的相似性。
攻击目标从俄语国家到西方国家的重大转变,以及受害者选择和恶意软件部署方法的差异,表明这种新的Vega勒索软件变种最终落到了不同黑客的手中,并被他们重新开发加以利用。
混淆
Zeppelin二进制文件中的所有敏感字符串都使用一个不同的伪随机32字节RC4密钥进行混淆,密钥在每个加密字符串之前:
图1:混淆后的字符串
字符串混淆是一种粗糙的多态性机制,因为每个生成样本都使用不同的RC4密钥。此举是帮助Zeppelin逃避检测并使分析复杂化。
尽管大多数样本都没有加壳,但研究人员也发现了具有额外多层混淆处理的Zeppelin可执行文件,混淆有三层:
使用一组随机API(通常与良性软件相关联)和卡住循环来改变代码大小,以欺骗启发式算法并超出沙箱范围。
第一阶段Shellcode,使用从硬编码DWORD值派生的静态1字节密钥进行简单的XOR编码。解码有效负载二进制文件和加载程序时,shellcode再使用1字节密钥进行XOR操作,但密钥在每一轮解密时都会发生变化。
第二阶段shellcode将有效负载二进制文件注入内存并执行:
图2:第一阶段混淆中的卡住循环示例
图3:解码有效负载
配置
勒索软件配置功能如下:
ID | 名称 | 描述 |
1 | (none) | 作为DLL运行时:对所有驱动器和共享进行加密(与EXE相对); 与“Startup”选项不兼容。 |
2 | IP Logger | 使用IPLogger服务(iplogger [.] ru或iplogger [.] org)跟踪受害者的IP地址和国家/地区代码。 |
3 | Startup | 将自身复制到另一个位置,设置持久性,并使用“ -start”参数启动。 |
4 | Delete backups | 执行指定的命令; 用于停止某些服务,禁用恢复,删除备份和卷影副本等。 |
5 | Task-killer | 杀死指定的进程。 |
6 | Auto-unlock busy files | 尝试解锁在加密过程中似乎已锁定的文件。 |
7 | Melt | 退出之前,将自删除线程注入notepad.exe(删除可执行文件以及所有添加的注册表值)。使用0xDEADFACE代码退出。 |
8 | UAC prompt | 重新运行时,尝试提权(仅在设置为“Startup”时使用)。 |
上表这些功能选项,连同RSA公钥及其他可配置字符串,可在生成勒索软件二进制代码期间从Zeppelin builder的用户界面进行设置:
图4:配置示例
所有可配置的数据都存储在Zeppelin二进制文件的.itext节中,包括:
· 硬编码的公钥(模数和指数分开)
· GUID(每个样本有所不同)
· IPLogger签入的URL地址
· 排除的文件夹列表
· 排除文件列表
· 排除的扩展名列表
· 杀死进程列表
· 要运行的命令列表
· 自述文件名
· 自述文件内容
执行
勒索软件二进制文件可以使用以下参数执行:
参数 | 描述 |
<path to an existing file> | 加密一个文件 |
<path to an existing directory> | 加密指定目录中的文件 |
-start | 跳过安装并执行恶意代码的第二阶段(即文件加密) |
-agent <int> | 作为代理运行; 在HKCU / Software / Zeppelin / Paths密钥下的值中指定的路径中加密文件,其中<int>是值的名称(连续数字以0开头) |
(no parameters) | 默认加密例程 |
安装
初始执行时(不带参数),恶意软件将检查机器国家/地区代码,以确保其不在以下国家运行:
· 俄罗斯联邦
· 乌克兰
· 白俄罗斯
· 哈萨克斯坦
根据构建过程中设置的选项,它将检查机器的默认语言和默认的国家调用代码,或者使用在线服务获取受害者的外部IP地址:
图5:检查受害者的国家
恶意软件在%TEMP%目录中创建一个空文件,扩展名为“ .zeppelin”,其名称为恶意软件路径的CRC32哈希。
如果设置了“Startup”选项,恶意软件将使用从活动进程列表中随机选择的名称将自身复制到%APPDATA%\Roaming\Microsoft\Windows目录中(忽略使用“install”或“setup”命令行参数)。
然后,使用随机生成的32字节RC4密钥对选定的名称进行加密,并对其进行base64编码(连同前缀密钥),将其保存到HKCU\Software\Zeppelin下的注册表值“ Process”。
通过注册表中的HKCU\Software\Microsoft\Windows\CurrentVersion\Run项设置持久性后,勒索软件将使用“ -start”参数从新路径重新执行自身。如果设置了“ UAC prompt”选项,它将尝试提权运行。
如果设置了“Melt”选项,则将自删除线程注入到新生成的notepad.exe进程中,并且该恶意软件将以代码0xDEADFACE退出。否则,它将仅以代码0退出。
网络通讯
像其前身一样,Zeppelin允许攻击者通过IPLogger Web服务跟踪受害者的IP地址和位置。如果设置了相关选项,则它将尝试将GET请求发送到硬编码URL(由IPLogger URL Shortener服务生成)进行签入。User-Agent字段id设置为“ZEPPELIN”,而referrer字段包含唯一受害者id,是在密钥生成阶段创建的:
图6:带有自定义标头的GET请求
为了防止受害者多次签入,HKCU\Software\Zeppelin下编写了一个“Knock”值0x29A(666),恶意软件通过检查该值是否存在来判断是否需要联系URL。
攻击者可以使用IPLogger Web服务查看受害者列表,并使用URL短链接将用户重定向到其他恶意内容。
密钥生成
与先前版本的Buran相比,加密算法没有实质性改变。它采用了对称文件加密和随机生成每个文件密钥的标准组合(CBC模式下为AES-256),以及用于保护会话密钥的非对称加密(使用自定义RSA实现,可能是内部开发的)。
首先,恶意软件将为受害者生成一对512位RSA密钥,并将它们以以下格式保存到内存中:
<N>{privatekey_modulus_hexstr}</N><D>{privatekey_exponent_hexstr}</D> <N>{publickey_modulus_hexstr}</N><E>{publickey_exponent_hexstr}</E>
图7:加密密钥示例:攻击者的公共密钥(蓝色),生成的受害者的公共密钥(绿色)和私钥(红色),其加密版本和base64编码版本(黄色)
密码对中的私钥将使用攻击者的2048位RSA公钥进行加密,RSA硬编码在二进制文件的.itext部分中。然后使用随机生成的32字节RC4密钥(使用base64编码,连同前置的RC4密钥)进一步混淆受害人的RSA加密私钥及其对应的公共密钥,并将其保存到HKCU \ Software \ Zeppelin \ Keys下的注册表中。分别作为“Public Key”和“Encrypted Private Key”:
图8:受害者的私钥加密
然后使用受害者的RSA公钥模数的前11个字节创建唯一的受害者ID,并将第三个和第七个字符替换为破折号“-”。上面显示的密钥的示例ID为389-04C-3D7。
文件加密
Zeppelin将枚举所有驱动器和网络共享上的文件,以建立目录列表。根据二进制类型,它将使用WNetEnumResource API(如果以EXE形式运行)或以下命令(如果以DLL形式运行):
chcp 1250 && net view
对于排除文件/扩展名列表不匹配的每个文件,恶意软件将执行以下操作:
1. 将原始文件属性和访问时间保存到内存,并设置FILE_ATTRIBUTE_ARCHIVE
2. 在纯文本文件前添加“ 666”字符串
3. 生成随机的32字节AES对称密钥和16字节的初始化矢量(IV)
4. 在CBC模式下使用AES-256加密文件(仅前0x10000字节,其余文件内容保持未加密状态)
5. 使用受害者的公共RSA密钥对AES密钥进行加密,然后使用随机生成的32字节RC4密钥进一步对其进行混淆:
图9:AES密钥加密
6. 在加密文件前加上硬编码标记字符串,以及8字节长度的加密数据和8字节长度的原始数据(包括先前添加的3字节“ 666”字符串):
图10:加密的文件头;标记字符串(绿色)和文件大小(红色),后跟加密内容
7. 在加密文件内容之后附加以下信息:
长度 | 描述 |
4 | 下一个字段的长度 |
0x28 (40) | 32字节RC4密钥,后跟8个加密的零字节 |
4 | 下一个字段的长度 |
0xBB (187) | RC4混淆,RSA加密的AES密钥 |
4 | 下一个字段的长度 |
0x4F4 (1268) | 受害者的私钥与攻击者的公钥不对称加密 |
4 | 要加密的数据的大小 |
8 | 原始文件大小 |
4 | 所有附加数据的大小 |
图11:加密的文件页脚
8. 重命名文件,附加受害者的唯一ID作为扩展名
9. 将文件属性和访问时间设置回原来的值
10. 继续下一个文件
如果Zeppelin作为可执行文件运行,则勒索软件首先将对当前逻辑驱动器上的文件进行加密,并使用“ -agent”参数生成许多后续进程。这些进程负责加密其他驱动器和网络共享上的文件。所有加密路径都存储在HKCU \ Software \ Zeppelin \ Paths注册表项下。
有趣的是,某些样本将仅加密前0x1000字节(4KB),而不是0x10000(65KB),这可能是个意外错误,或者是攻击者故意为之,加快加密过程的同时使大多数文件无法使用。
加密所有文件后,Zeppelin将植入赎金通知文件并将其显示在记事本中。文件名和内容可由攻击者配置。研究人员发现了几种不同的版本,从简短的通用消息到量身定制的都有。所有消息均指示受害者通过提供的电子邮件地址与攻击者联系。攻击者使用了几个与勒索软件有关联的安全电子邮件提供商,例如firemail [.] cc,Protonmail和Tutanota。此外,也有赎金票据提供了与.onion域相关联的电子邮件地址,该电子邮件地址只能通过Tor进行访问。
结论
勒索软件曾经一度衰落,但由于威胁行为者的创新努力,现在又重新崛起。Zeppelin背后的行动者通过对IT和医疗部门的目标进行高调打击,也在说明当前勒索软件的流行趋势是从个人转向组织。此外。勒索软件攻击的不断发生也在提醒我们,有效的网络安全解决方案应该是主动的、预测的、自适应的和半自治的。
本文翻译自:https://threatvector.cylance.com/en_us/home/zeppelin-russian-ransomware-targets-high-profile-users-in-the-us-and-europe.html如若转载,请注明原文地址: https://www.4hou.com/web/22218.html