Encryption 101系列:勒索软件ShiOne案例分析
字数 1372 2025-08-25 22:59:03
勒索软件ShiOne加密机制深度分析
0x00 简介
本文是对勒索软件ShiOne加密机制的详细技术分析,该样本采用C#编写,结合了RSA和AES加密算法。我们将逐层剖析其加密流程,帮助安全研究人员深入理解勒索软件的运作机制。
0x01 加密方式概述
ShiOne采用典型的混合加密策略:
- 密钥分发方式:离线预生成密钥并嵌入恶意软件(非对称密钥)
- 加密算法组合:
- RSA:用于加密AES密钥(非对称加密)
- AES:用于实际文件加密(对称加密)
- 密钥管理:
- RSA公钥嵌入恶意软件
- AES密钥动态生成并存储在加密文件中
0x02 加密主函数分析
样本MD5:408a97ac8fb82398187ffe6d4c5937d7
核心加密函数:crtp(string path),该函数为每个文件单独调用,包含完整的加密流程。
关键函数调用链:
CreateSalt(32)- 生成AES密钥GenerateRandomSalt()- 生成加密saltEncryption(text)- 使用RSA加密AES密钥AES_()- 实际文件加密函数
0x03 随机数生成机制
ShiOne使用安全的随机数生成器:
RNGCryptoServiceProvider rNGCryptoServiceProvider = new RNGCryptoServiceProvider();
byte[] array = new byte[size];
rNGCryptoServiceProvider.GetBytes(array);
return Convert.ToBase64String(array);
安全考量:
- 使用
RNGCryptoServiceProvider而非System.Random - 符合密码学安全随机数标准
- 每个文件使用独立随机数作为AES密钥基础
0x04 加密流程详解
1. AES密钥生成
string text = Program.CreateSalt(32); // 生成32字节随机数作为AES密钥基础
2. RSA加密AES密钥
string s = Program.Encryption(text); // 使用RSA公钥加密AES密钥
RSA公钥硬编码在恶意软件中,加密后的AES密钥将附加到文件末尾。
3. 文件加密过程
采用AES-CBC模式加密文件:
for (i = 0; i < num; i += array3.Length) {
int len = fileStream.Read(array2, 0, array2.Length);
array3 = Program.AES_(array2, bytes, array, len); // 实际加密操作
fileStream.Seek((long)i, SeekOrigin.Begin);
fileStream.Write(array3, 0, array3.Length);
}
AES加密参数:
array2:原始文件数据bytes:CreateSalt生成的随机数(AES密钥基础)array:GenerateRandomSalt生成的saltlen:待加密数据长度
4. 文件结构重组
加密完成后,文件按以下顺序写入:
- salt值(文件起始位置)
- RSA加密的AES密钥
- 实际加密数据(包含每个块的IV)
0x05 技术要点总结
-
混合加密架构:
- RSA保护AES密钥
- AES加密实际文件数据
-
密钥管理特点:
- RSA密钥对预先生成
- 仅公钥嵌入恶意软件
- 私钥由攻击者持有
-
加密安全措施:
- 使用密码学安全随机数生成器
- 每个文件独立AES密钥
- CBC模式配合动态IV
-
文件结构特征:
- 加密文件包含salt、加密密钥和密文
- 块加密结构保留IV信息
0x06 解密可能性分析
由于ShiOne采用强加密实现:
- 没有已知的加密算法漏洞
- RSA私钥不可推导
- 暴力破解AES密钥不可行
唯一可行解密途径:
- 获取攻击者持有的RSA私钥
- 使用私钥解密文件中的AES密钥
- 用AES密钥解密文件内容
0x07 防御建议
-
预防措施:
- 定期备份重要数据(3-2-1原则)
- 禁用不必要的RDP访问
- 保持系统和软件更新
-
检测方法:
- 监控异常的文件加密行为
- 检测RNGCryptoServiceProvider的异常调用
- 识别大量文件的修改模式
-
应急响应:
- 立即隔离感染主机
- 保留加密样本用于分析
- 不要支付赎金(不能保证解密)
本分析为安全研究人员提供了勒索软件加密机制的详细视角,有助于开发更有效的检测和防御方案。