Ryuk勒索软件技术分析
字数 1485 2025-08-20 18:17:53
Ryuk勒索软件技术分析与防御指南
1. Ryuk勒索软件概述
Ryuk是一种高度定制化的勒索软件,与传统大规模传播的勒索软件不同,它专门针对特定目标进行攻击,主要加密受害网络中的重要资产和资源。
1.1 历史背景与关联
- 与HERMES勒索软件有显著相似性,可能是同一开发者或代码重用
- HERMES首次出现在2017年10月,曾用于攻击台湾远东国际银行
- 可能与Lazarus组织有关联
2. 技术分析
2.1 传播方式
- 使用专门的Dropper程序进行传播
- Dropper包含32位和64位模块,根据系统版本选择释放
- 文件释放路径:
- Windows XP/2000:
\Documents and Settings\Default User\ - 其他系统:
\users\Public - 失败时尝试写入当前目录
- Windows XP/2000:
2.2 执行流程
- 初始休眠几秒钟
- 检查执行参数(用于自删除)
- 终止关键进程和服务(超过40个进程和180个服务)
- 建立持久化机制
2.3 持久化机制
- 通过注册表实现自启动:
reg add /C REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "svchos" /t REG_SZ /d [恶意软件路径]
2.4 进程注入技术
- 提升到SeDebugPrivilege权限
- 枚举系统进程
- 使用基本注入技术:
- OpenProcess获取句柄
- VirtualAllocEx分配内存
- 写入恶意代码镜像
- 创建远程线程执行
注意:存在地址分配失败风险,可能导致注入失败
2.5 加密机制
采用三层可信模型:
- 全局RSA密钥对(攻击者持有私钥)
- 每个受害者的RSA密钥对(嵌入在样本中)
- 公钥硬编码在样本中
- 私钥用全局公钥加密后嵌入
- 文件级AES对称加密
- 使用CryptGenKey为每个文件生成唯一AES密钥
- 用受害者RSA公钥加密AES密钥
- 将加密结果附加到加密文件中
2.6 文件加密策略
- 递归扫描本地驱动和网络共享
- 白名单目录(不加密):
- Windows
- Mozilla
- Chrome
- RecycleBin
- Ahnlab(韩国安全产品)
2.7 网络资源加密
- 调用WNetOpenEnum开始枚举
- 分配缓存区
- 通过WNetEnumResource填充缓存
- 递归处理容器资源
- 将资源名加入加密列表(用分号分隔)
2.8 清理操作
执行批处理命令删除:
- 影子备份
- 系统备份文件
- 其他恢复相关文件
3. 与HERMES的相似性
3.1 代码相似点
- 加密逻辑几乎相同
- 加密文件标记(marker)生成和检查代码相同
- 相同的白名单文件夹
- 相同路径下写入batch脚本(window.bat)
- 相同的影子目录和备份删除脚本
- 都释放PUBLIC和UNIQUE_ID_DO_NOT_REMOVE文件
3.2 功能相似点
- 相同的注入技术
- 相似的进程终止列表
- 相同的加密模型
4. 防御措施
4.1 预防措施
- 限制PowerShell和WMI的使用
- 禁用不必要的SMBv1协议
- 限制RDP访问,使用强认证
- 保持系统和软件更新
4.2 检测措施
- 监控以下异常行为:
- 大量文件被快速加密
- vssadmin.exe删除卷影副本
- 异常进程终止行为
- 注册表自启动项修改
- 部署EDR解决方案
4.3 响应措施
- 立即隔离受感染系统
- 检查网络共享是否受影响
- 从备份恢复数据
- 全面检查系统残留
5. 附录:字符串解密脚本
"""
Ryuk strings decrypter
IDA Python脚本用于解密Ryuk勒索软件中的加密API字符串
解密后会自动重命名变量以便分析
"""
import idc
from idaapi import *
def decryptStrings(verbose=True):
encrypted_strings_array = 0x1400280D0
lengths_array = 0x1400208B0
num_of_encrypted_strings = 68
key = 'bZIiQ'
if verbose:
print("[!] Starting to decrypt the strings\n\n")
# 遍历加密字符串数组
for i in range(num_of_encrypted_strings):
# 获取加密字符串长度
string_length = idc.Dword(lengths_array + i * 4)
# 获取加密字符串偏移量
string_offset = encrypted_strings_array + i * 50
# 读取加密字节
encrypted_buffer = get_bytes(string_offset, string_length)
decrypted_string = ''
# 解密字节
for idx, val in enumerate(encrypted_buffer):
decrypted_string += chr(ord(val) ^ ord(key[idx % len(key)]))
# 在IDA中为字符串变量设置名称
idc.MakeName(string_offset, "dec_" + decrypted_string)
# 输出到窗口
if verbose:
print("0x%x: %s" % (string_offset, decrypted_string,))
if verbose:
print("\n[!] Done.")
# 执行解密函数
decryptStrings()
6. 总结
Ryuk勒索软件代表了一类高度定向的勒索攻击,其技术复杂性和与APT组织的潜在关联使其成为严重威胁。组织应实施深度防御策略,重点关注:
- 限制横向移动能力
- 保护备份系统
- 监控异常加密行为
- 建立有效的事件响应流程
通过了解Ryuk的技术细节,安全团队可以更好地防御此类针对性勒索软件攻击。