EagleMonitorRAT通信模型剖析及通信解密尝试
字数 1603 2025-08-03 16:43:59

EagleMonitorRAT通信模型剖析及解密技术详解

1. 概述

EagleMonitorRAT是一款基于C#编写的开源远程控制工具,由HorusEyesRat项目升级而来。本文将从技术角度全面剖析其通信模型和解密方法,包括配置信息提取、功能分析、通信协议解析以及实现自动化解密程序。

2. EagleMonitorRAT基础分析

2.1 项目概况

  • GitHub项目地址:https://github.com/arsium/EagleMonitorRAT
  • 首次发布时间:2022年4月7日
  • 最新版本:3.2.4.0(2022年12月12日发布)
  • 项目特点:
    • 423个标星,144个fork
    • 单人维护
    • 基于Visual Basic .NET的HorusEyesRat升级版

2.2 主要功能

  • 文件管理
  • 进程管理
  • 键盘记录
  • 远程桌面
  • 远程网络摄像头控制

3. 配置信息解密

3.1 配置信息存储

配置信息存储在GClass0类中,采用Base64编码:

MTI3LjAuMC4xOjk4NzU= → 127.0.0.1:9875 (C2服务器地址)
MTI3LjAuMC4xOjc3ODg= → 127.0.0.1:7788 (备用C2地址)
MTIzNDU2Nzg5 → 123456789 (默认加密密钥)
JU1VVEVYJQ== → %MUTEX% (互斥量)

3.2 程序混淆

默认生成的木马程序经过混淆处理,需先进行去混淆才能有效分析。

4. 功能实现分析

4.1 动态加载模块

木马运行后动态加载两个关键DLL:

  • PacketLib.dll:负责通信数据包的封装及加解密
  • Offline.dll:提供反病毒软件绕过和部分离线功能

4.2 通信机制

采用两次send函数调用:

  1. 第一次发送5字节头部数据(4字节载荷大小 + 1字节标志)
  2. 第二次发送实际载荷数据

4.3 通信加解密流程

加密流程:

  1. 使用BinaryFormatter().Serialize序列化数据
  2. 应用QuickLZ压缩算法
  3. 通过PBKDF2算法生成AES密钥和IV
  4. 使用AES CBC模式加密数据

解密流程:

  1. 通过PBKDF2算法生成AES密钥和IV
  2. AES CBC模式解密数据
  3. QuickLZ解压数据
  4. BinaryFormatter().Deserialize反序列化数据

5. 通信模型深度剖析

5.1 通信数据结构

完整通信数据包格式:

[4字节载荷大小][1字节标志数据][AES加密数据]

解密后的数据结构:

[16字节GUID][QuickLZ压缩数据]

QuickLZ解压后得到BinaryFormatter序列化数据

5.2 序列化数据分析

BinaryFormatter序列化数据特征:

  • 包含通信数据结构体名称
  • 记录结构体成员名称及顺序(与源代码一致)
  • 字符串数据格式:[1字节长度][字符串内容]

6. 自动化解密实现

6.1 解密程序架构

使用Go语言实现,主要包含三个文件:

  1. main.go:主程序逻辑
  2. common.go:通用功能函数
  3. quicklz_z.go:QuickLZ解压实现

6.2 核心解密函数

func Decrypt(data []byte, key string) (output []byte) {
    key_hex := asciToUnicode(key)
    rfc2898DeriveBytes := pbkdf2_Rfc2898DeriveBytes(key_hex)
    aes_key := rfc2898DeriveBytes[:16]
    aes_iv := rfc2898DeriveBytes[16:]

    decryptd_text1, _ := Aes_z_Decrypt(data, aes_key, aes_iv)
    decryptd_text2 := quicklz.QuickLZ_Decompress(decryptd_text1[16:])
    output = append(output, decryptd_text2...)
    return
}

6.3 关键算法实现

PBKDF2密钥派生:

func pbkdf2_Rfc2898DeriveBytes(masterKey []byte) []byte {
    salt, _ := hex.DecodeString("0000000000000000")
    iterations := 1
    keyLength := 32
    derivedKey := pbkdf2.Key(masterKey, salt, iterations, keyLength, sha1.New)
    return derivedKey
}

AES CBC解密:

func aes_decrypt_cbc(data []byte, key []byte, iv []byte) ([]byte, error) {
    data_new := []byte{}
    data_new = append(data_new, iv...)
    data_new = append(data_new, data...)

    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    iv = data_new[:aes.BlockSize]
    data_new = data_new[aes.BlockSize:]

    mode := cipher.NewCBCDecrypter(block, iv)
    mode.CryptBlocks(data_new, data_new)
    data_new = pkcs5UnPadding(data_new)

    return data_new, nil
}

7. 实际解密案例

7.1 示例通信数据

4002000002cc11fb92bf6f4fd0b86878eac16d1b16e725a7c087f0d035f761ac79d934dc0bf4e7e5e46ef955d8784cd02170df8c6dc659de0eed23ef8c5e4fc46d44ea1f27c09f1fa5e27c93b0dc0126b87a4980ad26c8de0142e8b52f1e21adf4d54816779de694cfb6e2778e8e33be1375f1eb0dd987e931c0c8aef625a5cc2f69639e970e1f516c0d2bdbc10bd05539842f15d38a7716994569cab77e4d5ad6b5839b2305ace821647e49fb20ef8976017052bba3c774326f819cbda8a2874fedf097a915f8d91bf0f698ecdc145a5f78835ccac3f31a530a5054143824442b758183c75536c374b3d9ecdae5713fd52b64164ca07cb471b8c80a9e612c7534a88a3729844fb9da9554ccfa703fdf0bd352994013747266a6a6aec632d8919fe4b0aa7b9722f9e5b898929e3549b1b8963e5e65ff89d028b884c7283b26e61c4ac18c91ca44896e9759bbfb140a26c5e76e4a85448409f3a3a6a9522cb00f5be8e5e6eb6de8c58b76007f19a7df75ca0d2626e17a0943afaec02207449a42d679b66190e0b90e4c0e4fcc73d4040d961114c1c1ca6f38ac7e1b5dba2f5881941773b67b5de215acb69e1588aaf8aa13135b654893c69fdcad04c83194f7b744d06cb48cb40026a1c0882e5cb650a31d89e0c05372d0b77878b3e71ca716f53c25f5f36adb14366861785fa9487c5619bec61f29284cccbefe24b26517fa8ff1e3be42671ddb2e8f4aecc29d6830f3fcb986cc986fd9b63ec6e0b4a16d26b321df146e81aadb632894d65e7de63085b7865e377c485ce62f274152411cddfd602a0bbdb9

7.2 解密步骤

  1. 解析数据结构

    • 40020000:载荷大小(0x000240 = 576字节)
    • 02:PacketType标志
    • 剩余部分:AES加密数据
  2. AES解密

    • 使用PBKDF2从密码"123456789"派生密钥
    • AES CBC模式解密得到:
      573c55f68426994aa17609a155317c9f (GUID)
      472b0200008c0300... (QuickLZ压缩数据)
      
  3. QuickLZ解压

    • 解压后得到BinaryFormatter序列化数据
  4. 反序列化

    • 根据PacketLib.dll中的结构体定义解析二进制数据

8. 防御建议

  1. 网络层检测

    • 监控异常的小数据包通信模式(5字节头部+载荷)
    • 检测AES CBC加密流量特征
  2. 主机层检测

    • 检查%MUTEX%互斥量
    • 监控PacketLib.dll和Offline.dll的加载行为
    • 检测QuickLZ压缩算法的使用
  3. 解密密钥

    • 默认使用"123456789"作为加密密钥,可作为检测特征

附录:完整解密代码

[完整代码请参考原文中的Go语言实现,包含main.go、common.go和quicklz_z.go三个文件]

EagleMonitorRAT通信模型剖析及解密技术详解 1. 概述 EagleMonitorRAT是一款基于C#编写的开源远程控制工具,由HorusEyesRat项目升级而来。本文将从技术角度全面剖析其通信模型和解密方法,包括配置信息提取、功能分析、通信协议解析以及实现自动化解密程序。 2. EagleMonitorRAT基础分析 2.1 项目概况 GitHub项目地址:https://github.com/arsium/EagleMonitorRAT 首次发布时间:2022年4月7日 最新版本:3.2.4.0(2022年12月12日发布) 项目特点: 423个标星,144个fork 单人维护 基于Visual Basic .NET的HorusEyesRat升级版 2.2 主要功能 文件管理 进程管理 键盘记录 远程桌面 远程网络摄像头控制 3. 配置信息解密 3.1 配置信息存储 配置信息存储在GClass0类中,采用Base64编码: 3.2 程序混淆 默认生成的木马程序经过混淆处理,需先进行去混淆才能有效分析。 4. 功能实现分析 4.1 动态加载模块 木马运行后动态加载两个关键DLL: PacketLib.dll :负责通信数据包的封装及加解密 Offline.dll :提供反病毒软件绕过和部分离线功能 4.2 通信机制 采用两次send函数调用: 第一次发送5字节头部数据(4字节载荷大小 + 1字节标志) 第二次发送实际载荷数据 4.3 通信加解密流程 加密流程: 使用 BinaryFormatter().Serialize 序列化数据 应用QuickLZ压缩算法 通过PBKDF2算法生成AES密钥和IV 使用AES CBC模式加密数据 解密流程: 通过PBKDF2算法生成AES密钥和IV AES CBC模式解密数据 QuickLZ解压数据 BinaryFormatter().Deserialize 反序列化数据 5. 通信模型深度剖析 5.1 通信数据结构 完整通信数据包格式: 解密后的数据结构: QuickLZ解压后得到BinaryFormatter序列化数据 5.2 序列化数据分析 BinaryFormatter序列化数据特征: 包含通信数据结构体名称 记录结构体成员名称及顺序(与源代码一致) 字符串数据格式: [1字节长度][字符串内容] 6. 自动化解密实现 6.1 解密程序架构 使用Go语言实现,主要包含三个文件: main.go :主程序逻辑 common.go :通用功能函数 quicklz_z.go :QuickLZ解压实现 6.2 核心解密函数 6.3 关键算法实现 PBKDF2密钥派生: AES CBC解密: 7. 实际解密案例 7.1 示例通信数据 7.2 解密步骤 解析数据结构 : 40020000 :载荷大小(0x000240 = 576字节) 02 :PacketType标志 剩余部分:AES加密数据 AES解密 : 使用PBKDF2从密码"123456789"派生密钥 AES CBC模式解密得到: QuickLZ解压 : 解压后得到BinaryFormatter序列化数据 反序列化 : 根据PacketLib.dll中的结构体定义解析二进制数据 8. 防御建议 网络层检测 : 监控异常的小数据包通信模式(5字节头部+载荷) 检测AES CBC加密流量特征 主机层检测 : 检查%MUTEX%互斥量 监控PacketLib.dll和Offline.dll的加载行为 检测QuickLZ压缩算法的使用 解密密钥 : 默认使用"123456789"作为加密密钥,可作为检测特征 附录:完整解密代码 [ 完整代码请参考原文中的Go语言实现,包含main.go、common.go和quicklz_ z.go三个文件 ]