勒索软件漏洞?在不支付赎金的情况下解密文件
字数 1315 2025-08-05 08:19:13
HomuWitch勒索软件漏洞分析与解密工具构建
概述
本文详细分析HomuWitch勒索软件的功能特点、加密机制以及其存在的设计缺陷,并指导如何利用这些缺陷构建解密工具,在不支付赎金的情况下恢复被加密文件。
HomuWitch勒索软件功能分析
互斥对象
- 创建互斥对象名:
ghfdujhuiGYGyftgfTshyhrshdemjutdgjndtgFUYfuyhFTU&FK - 目的:确保系统中只运行一个实例
外联行为
- 收集并发送系统信息:
- 设备ID
- 系统语言
- 国家/地区信息(通过ipapi.co/country_code/获取)
- 用户名
- 外联获取勒索信内容
加密目标
待加密目录:
- 桌面
- Downloads文件夹
- 用户目录
- 磁盘使用空间小于3GB的USB外置设备目录
待加密文件类型:
.pdf, .doc, .docx, .ppt, .pptx, .xls, .xlsx, .py, .rar, .zip, .7z, .txt,
.mp4, .JPG, .jpeg, .PNG, .HEIC, .csv, .rtf, .bbbbbbbbb
文件大小限制:小于55MB的文件
加密后特征
- 文件后缀修改为:
.homuencrypted - 修改桌面壁纸
- 弹出勒索信窗口
加密算法
采用双层加密机制:
- DEFLATE压缩算法:首先压缩文件内容
- AES-CBC加密:对压缩后的数据进行加密
- 使用Rfc2898DeriveBytes生成AES密钥和IV
- 内置密码(password):
oralcumshot1998 - 随机生成16字节salt值,写入加密文件头部
其他行为
- 隐藏自身进程
- 清空回收站
- 生成配置文件标记加密状态
设计缺陷分析
关键漏洞点
- 内置解密功能:软件包含
DecryptFile函数 - 对称加密:使用AES而非非对称加密
- 硬编码密钥:所有样本使用相同密码
oralcumshot1998
漏洞利用方法
-
直接使用勒索软件内置的解密功能:
- 在勒索软件界面输入已知密码
oralcumshot1998 - 调用
DecryptFile函数解密文件
- 在勒索软件界面输入已知密码
-
手动解密流程:
- 从加密文件头部提取16字节salt
- 使用Rfc2898DeriveBytes生成AES密钥和IV
- 使用AES-CBC解密数据
- 使用DEFLATE解压缩还原原始文件
解密工具构建
C#实现代码
using System;
using System.IO;
using System.IO.Compression;
using System.Security.Cryptography;
using System.Text;
namespace HomuWitchDecryptor
{
class Program
{
public static void DecryptFile(string inputFilePath, string outputFilePath)
{
string password = "oralcumshot1998";
using (FileStream fileStream = new FileStream(inputFilePath, FileMode.Open))
{
using (FileStream fileStream2 = new FileStream(outputFilePath, FileMode.Create))
{
using (Aes aes = Aes.Create())
{
byte[] bytes = Encoding.UTF8.GetBytes(password);
byte[] array = new byte[16];
fileStream.Read(array, 0, array.Length);
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, array, 10000);
byte[] bytes2 = rfc2898DeriveBytes.GetBytes(32);
byte[] bytes3 = rfc2898DeriveBytes.GetBytes(16);
using (ICryptoTransform cryptoTransform = aes.CreateDecryptor(bytes2, bytes3))
{
using (CryptoStream cryptoStream = new CryptoStream(fileStream, cryptoTransform, CryptoStreamMode.Read))
{
using (DeflateStream deflateStream = new DeflateStream(cryptoStream, CompressionMode.Decompress))
{
deflateStream.CopyTo(fileStream2);
}
}
}
}
}
}
}
static void Main(string[] args)
{
string fileListPath = "encrypted_files.txt"; // 包含加密文件路径的列表
try
{
using (StreamReader sr = new StreamReader(fileListPath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line.EndsWith(".homuencrypted"))
{
string originalName = line.Substring(0, line.Length - ".homuencrypted".Length);
DecryptFile(line, originalName);
File.Move(line, line + ".bak"); // 重命名加密文件
}
}
}
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
}
}
}
使用说明
- 使用文件搜索工具(如Everything)生成加密文件列表
- 将列表保存为
encrypted_files.txt - 运行解密工具
- 解密后的文件将恢复原始名称,加密文件被重命名为
.bak后缀
技术要点总结
-
加密流程:
- 随机salt → Rfc2898DeriveBytes → AES密钥/IV
- DEFLATE压缩 → AES-CBC加密
-
解密关键:
- 已知password参数(
oralcumshot1998) - 从加密文件头部读取salt值
- 逆向加密流程
- 已知password参数(
-
设计缺陷本质:
- 将本应服务器端保存的解密密钥硬编码在客户端
- 使用对称加密而非非对称加密
- 内置解密功能未做权限控制
防御建议
-
对于企业用户:
- 定期备份重要数据
- 使用行为监控软件检测异常加密行为
- 限制用户安装不明软件
-
对于开发者:
- 避免在客户端存储敏感信息
- 使用非对称加密实现勒索软件加密机制
- 对关键功能进行混淆和保护
-
对于安全研究人员:
- 分析勒索软件时注意查找硬编码密钥
- 检查是否存在未受保护的内置解密功能
- 关注加密算法的实现细节