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函数调用:
- 第一次发送5字节头部数据(4字节载荷大小 + 1字节标志)
- 第二次发送实际载荷数据
4.3 通信加解密流程
加密流程:
- 使用
BinaryFormatter().Serialize序列化数据 - 应用QuickLZ压缩算法
- 通过PBKDF2算法生成AES密钥和IV
- 使用AES CBC模式加密数据
解密流程:
- 通过PBKDF2算法生成AES密钥和IV
- AES CBC模式解密数据
- QuickLZ解压数据
BinaryFormatter().Deserialize反序列化数据
5. 通信模型深度剖析
5.1 通信数据结构
完整通信数据包格式:
[4字节载荷大小][1字节标志数据][AES加密数据]
解密后的数据结构:
[16字节GUID][QuickLZ压缩数据]
QuickLZ解压后得到BinaryFormatter序列化数据
5.2 序列化数据分析
BinaryFormatter序列化数据特征:
- 包含通信数据结构体名称
- 记录结构体成员名称及顺序(与源代码一致)
- 字符串数据格式:
[1字节长度][字符串内容]
6. 自动化解密实现
6.1 解密程序架构
使用Go语言实现,主要包含三个文件:
main.go:主程序逻辑common.go:通用功能函数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 解密步骤
-
解析数据结构:
40020000:载荷大小(0x000240 = 576字节)02:PacketType标志- 剩余部分:AES加密数据
-
AES解密:
- 使用PBKDF2从密码"123456789"派生密钥
- AES CBC模式解密得到:
573c55f68426994aa17609a155317c9f (GUID) 472b0200008c0300... (QuickLZ压缩数据)
-
QuickLZ解压:
- 解压后得到BinaryFormatter序列化数据
-
反序列化:
- 根据PacketLib.dll中的结构体定义解析二进制数据
8. 防御建议
-
网络层检测:
- 监控异常的小数据包通信模式(5字节头部+载荷)
- 检测AES CBC加密流量特征
-
主机层检测:
- 检查%MUTEX%互斥量
- 监控PacketLib.dll和Offline.dll的加载行为
- 检测QuickLZ压缩算法的使用
-
解密密钥:
- 默认使用"123456789"作为加密密钥,可作为检测特征
附录:完整解密代码
[完整代码请参考原文中的Go语言实现,包含main.go、common.go和quicklz_z.go三个文件]