勒索软件漏洞?在不支付赎金的情况下解密文件
字数 1315 2025-08-05 08:19:13

HomuWitch勒索软件漏洞分析与解密工具构建

概述

本文详细分析HomuWitch勒索软件的功能特点、加密机制以及其存在的设计缺陷,并指导如何利用这些缺陷构建解密工具,在不支付赎金的情况下恢复被加密文件。

HomuWitch勒索软件功能分析

互斥对象

  • 创建互斥对象名:ghfdujhuiGYGyftgfTshyhrshdemjutdgjndtgFUYfuyhFTU&FK
  • 目的:确保系统中只运行一个实例

外联行为

  1. 收集并发送系统信息:
    • 设备ID
    • 系统语言
    • 国家/地区信息(通过ipapi.co/country_code/获取)
    • 用户名
  2. 外联获取勒索信内容

加密目标

待加密目录

  • 桌面
  • 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
  • 修改桌面壁纸
  • 弹出勒索信窗口

加密算法

采用双层加密机制:

  1. DEFLATE压缩算法:首先压缩文件内容
  2. AES-CBC加密:对压缩后的数据进行加密
    • 使用Rfc2898DeriveBytes生成AES密钥和IV
    • 内置密码(password):oralcumshot1998
    • 随机生成16字节salt值,写入加密文件头部

其他行为

  • 隐藏自身进程
  • 清空回收站
  • 生成配置文件标记加密状态

设计缺陷分析

关键漏洞点

  1. 内置解密功能:软件包含DecryptFile函数
  2. 对称加密:使用AES而非非对称加密
  3. 硬编码密钥:所有样本使用相同密码oralcumshot1998

漏洞利用方法

  1. 直接使用勒索软件内置的解密功能:

    • 在勒索软件界面输入已知密码oralcumshot1998
    • 调用DecryptFile函数解密文件
  2. 手动解密流程:

    • 从加密文件头部提取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);
            }
        }
    }
}

使用说明

  1. 使用文件搜索工具(如Everything)生成加密文件列表
  2. 将列表保存为encrypted_files.txt
  3. 运行解密工具
  4. 解密后的文件将恢复原始名称,加密文件被重命名为.bak后缀

技术要点总结

  1. 加密流程

    • 随机salt → Rfc2898DeriveBytes → AES密钥/IV
    • DEFLATE压缩 → AES-CBC加密
  2. 解密关键

    • 已知password参数(oralcumshot1998)
    • 从加密文件头部读取salt值
    • 逆向加密流程
  3. 设计缺陷本质

    • 将本应服务器端保存的解密密钥硬编码在客户端
    • 使用对称加密而非非对称加密
    • 内置解密功能未做权限控制

防御建议

  1. 对于企业用户:

    • 定期备份重要数据
    • 使用行为监控软件检测异常加密行为
    • 限制用户安装不明软件
  2. 对于开发者:

    • 避免在客户端存储敏感信息
    • 使用非对称加密实现勒索软件加密机制
    • 对关键功能进行混淆和保护
  3. 对于安全研究人员:

    • 分析勒索软件时注意查找硬编码密钥
    • 检查是否存在未受保护的内置解密功能
    • 关注加密算法的实现细节
HomuWitch勒索软件漏洞分析与解密工具构建 概述 本文详细分析HomuWitch勒索软件的功能特点、加密机制以及其存在的设计缺陷,并指导如何利用这些缺陷构建解密工具,在不支付赎金的情况下恢复被加密文件。 HomuWitch勒索软件功能分析 互斥对象 创建互斥对象名: ghfdujhuiGYGyftgfTshyhrshdemjutdgjndtgFUYfuyhFTU&FK 目的:确保系统中只运行一个实例 外联行为 收集并发送系统信息: 设备ID 系统语言 国家/地区信息(通过ipapi.co/country_ code/获取) 用户名 外联获取勒索信内容 加密目标 待加密目录 : 桌面 Downloads文件夹 用户目录 磁盘使用空间小于3GB的USB外置设备目录 待加密文件类型 : 文件大小限制 :小于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#实现代码 使用说明 使用文件搜索工具(如Everything)生成加密文件列表 将列表保存为 encrypted_files.txt 运行解密工具 解密后的文件将恢复原始名称,加密文件被重命名为 .bak 后缀 技术要点总结 加密流程 : 随机salt → Rfc2898DeriveBytes → AES密钥/IV DEFLATE压缩 → AES-CBC加密 解密关键 : 已知password参数( oralcumshot1998 ) 从加密文件头部读取salt值 逆向加密流程 设计缺陷本质 : 将本应服务器端保存的解密密钥硬编码在客户端 使用对称加密而非非对称加密 内置解密功能未做权限控制 防御建议 对于企业用户: 定期备份重要数据 使用行为监控软件检测异常加密行为 限制用户安装不明软件 对于开发者: 避免在客户端存储敏感信息 使用非对称加密实现勒索软件加密机制 对关键功能进行混淆和保护 对于安全研究人员: 分析勒索软件时注意查找硬编码密钥 检查是否存在未受保护的内置解密功能 关注加密算法的实现细节