Zeppeli,一款采用Delphi编写的新生代勒索软件,被其开发者作为“勒索软件即服务”(Ransomware-as-a-Service,RaaS)在暗网出售。
鉴于代码和功能上的重合,Zeppeli一开始也被称为“Vega”(或“VegaLocker”),但Cylance威胁研究小组却在近日发文称,Zeppeli有很大可能并非出自Vega的开发者之手。
首个Vega样本于今年年初被发现,它在当时与一些金融恶意软件捆绑在一起,主要通过俄罗斯在线广告网站Yandex.Direct传播,而攻击目标则主要是俄语用户,且属于“广撒网”式攻击。
准确来说,Zeppeli的确是Vega的后续变种之一,但与之相关的活动却极具针对性(主要是一些欧洲及美洲的科技公司和医疗保健公司),且一旦检测到受感染计算机属于俄罗斯或其他前苏联国家/地区的用户,则会立即退出运行。
从主要攻击俄语用户到排除俄语用户,几乎已经说明Zeppeli和Vega的开发者并非同一伙人,而是这种勒索软件的源代码已经落入了其他黑客的手里。
Zeppeli样本分析混淆
Zeppelin二进制文件中的所有敏感字符串都使用了一个伪随机32字节RC4密钥进行混淆,而密钥就位于每个加密字符串之前。
图1.经混淆处理的字符串
此外,有一些Zeppelin可执行文件还经过了多层混淆处理:
使用一组随机API(通常与合法软件相关联)和几个停滞循环来改变大小的代码,以欺骗启发式算法并超出沙箱范围。
第一阶段shellcode,使用从硬编码DWORD值派生的静态1字节密钥进行简单的XOR编码。解码有效载荷二进制文件及其加载程序时,shellcode将再次使用1字节密钥进行XOR操作,但密钥在每一轮解密时都会发生变化。
第二阶段shellcode,将有效载荷二进制文件注入内存并执行:
图2.停滞循环示例
图3.有效载荷解码shellcode
配置
Zeppelin的配置如下:
需要说明的是,上图中的这些选项以及RSA公钥和其他可配置字符串,可在生成二进制文件期间从Zeppelin构建器的用户界面进行设置:
图4.配置示例
所有可配置的数据都存储在Zeppelin二进制文件的.itext节中,这其中包括:
- 硬编码的公钥
- GUID(不同的样本会有所不同)
- IPLogger登记URL地址
- 排除的文件夹列表
- 排除的文件列表
- 排除的扩展名列表
- 要杀死的进程列表
- 要运行的命令列表
- 自述文件名
- 自述文件内容
执行
Zeppelin二进制文件可以使用以下参数执行:
安装
初始执行时(不带参数),Zeppelin将检查计算机国家/地区代码,以确保其不会在以下国家的计算机上运行:
- 俄罗斯联邦
- 乌克兰
- 白俄罗斯
- 哈萨克斯坦
根据构建过程中设置的选项,它会检查计算机的默认语言和默认国家/地区代码,或者使用在线服务获取受害者的外部IP地址:
图5.检查受害者所在的国家
网络通讯
与Vega一样,Zeppelin允许攻击者通过IPLogger Web服务跟踪受害者的IP地址和位置。如果设置了相关选项,它将尝试将GET请求发送到使用IPLogger URL Shortener服务生成的硬编码URL来进行登记。
图6.带有自定义标头的GET请求
为了防止受害者重复登记,“HKCU\Software\Zeppelin”下编写有一个“Knock”值,Zeppelin可以通过检查该值来判断在后续运行中是否需要与该URL联系。
总而言之,攻击者可以使用IPLogger Web服务查看受害者列表,以及使用URL短链接将他们重定向到其他恶意内容。
密钥生成
与Vega的另一个变种Buran相比,Zeppelin的加密算法并没有实质性的改变。它采用对称文件加密和随机生成每个文件密钥(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.加密密钥示例:攻击者的公钥(蓝色)、为受害者生成的公钥(绿色)和私钥(红色),以及它们的加密版本
首先,Zeppelin会使用攻击者的2048位RSA公钥(硬编码在二进制文件的.itext部分中)加密私钥。然后,使用随机生成的32字节RC4密钥进一步混淆受害者的RSA加密私钥及其对应的公钥,并将其保存到“HKCU\Software\Zeppelin\Keys”下的注册表中。
图8.加密受害者私钥
最后,使用受害者的RSA公钥模数的前11个字节创建唯一的受害者ID,并将第三个和第七个字符替换为破折号“-”。
文件加密
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. 在加密文件内容之后附加如下信息:
图11.经加密的文件
8.重命名文件,附加受害者的唯一ID作为扩展名
9.将文件属性和访问时间设置回原来的值
10.继续加密下一个文件
如果Zeppelin以可执行文件的形式运行,那么它首先会对当前逻辑驱动器上的文件进行加密,并使用“-agent”参数生成后续进程,而这些进程则负责加密其他驱动器和网络共享上的文件,所有加密路径都存储在“HKCU\Software\Zeppelin\Paths”注册表项之下。
结论勒索软件曾一度淡出我们的视线,但事实证明网络黑客并没有放弃它们,相反是在努力创新。
从“广撒网”式攻击到针对科技公司和医疗保健公司的高针对性攻击,Zeppelin背后的操控者用他们的行动告诉我们,勒索软件攻击的趋势正在从个人转向企业。
此外,勒索软件攻击的演变也在再次提醒我们,网络防御绝不容松懈,而网络安全培训则需要长期持续进行。
,