AsyncRAT通信模型剖析及自动化解密脚本实现
字数 1389 2025-08-10 08:28:52
AsyncRAT通信模型剖析及自动化解密脚本实现
概述
本文是AsyncRAT远控工具剖析系列的第二篇,重点分析AsyncRAT的通信模型和数据结构,并提供自动化解密脚本实现。第一篇为《AsyncRAT加解密技术剖析》。
整体通信流程
AsyncRAT的通信模型采用分层会话机制:
- 主会话通信:用于心跳连接和传输功能插件
- 子会话通信:当执行特定功能时启动,用于功能插件的专用通信
功能插件对应关系
| 功能插件DLL文件名 | 对应菜单功能 | 备注 |
|---|---|---|
| Chat.dll | Extra->Chat | |
| Extra.dll | Extra->Visit Website | |
| FileManager.dll | Monitoring->File Manager | |
| FileSearcher.dll | Miscellaneous->Files Searcher | |
| LimeLogger.dll | Monitoring->Keylogger | |
| Miscellaneous.dll | ||
| Options.dll | Extra->Get Admin Privileges | |
| ProcessManager.dll | Monitoring->Process Manager | |
| Recovery.dll | Monitoring->Password Recovery | |
| RemoteCamera.dll | Monitoring->Webcam | |
| RemoteDesktop.dll | Monitoring->Remote Desktop | |
| SendFile.dll | Send File->To Disk | |
| SendMemory.dll | Send File->To Memory |
通信数据结构分析
外层通信数据结构
TLS解密后的外层通信数据结构:
08010000 // 后续载荷数据大小(0x108)
05010000 // 解压后载荷数据大小(0x105)
1f8b0800... // GZIP压缩数据(0x104字节)
解压后的数据结构示例:
8d // 键值对数量(0x8d-0x80=13)
a6 // 键长度(0xa6-0xa0=6)
5061636b6574 // "Packet"
aa // 值长度(0xaa-0xaa=10)
436c69656e74496e666f // "ClientInfo"
... // 其他键值对
通信数据结构分类
根据源码分析,AsyncRAT针对不同数据类型采用不同的处理函数:
- WriteNull
- WriteString
- WriteBinary
- WriteFloat
- WriteSingle
- WriteBoolean
- WriteUInt64
- WriteInteger
内层通信数据结构
Msgpack数据结构
类型1:
81 // 键值对数量(1)
A65061636B6574 // "Packet"
A57368656C6C // "shell"
类型2(图片数据):
83 // 键值对数量(3)
A65061636B6574 // "Packet"
A977616C6C7061706572 // "wallpaper"
A5496D616765 // "Image"
C6 // 二进制标志
000D6B22 // 数据大小
... // 图片数据
A3457865 // "Exe"
A42E6A7067 // ".jpg"
savePlugin数据结构
用于传输插件DLL文件:
83 // 键值对数量(3)
a65061636b6574 // "Packet"
aa73617665506c7567696e // "savePlugin"
a3446c6c // "Dll"
c6 // 二进制标志
0003d39e // 数据大小
00c20800 // 解压后大小
... // DLL文件数据
a448617368 // "Hash"
... // 哈希值
自动化解密脚本实现
代码结构
- main.go - 主程序逻辑
- common.go - 公共函数库
核心功能
- GZIP解压:
func Gzip_Uncompress(gzippedBytes []byte) []byte {
buf := bytes.NewBuffer(gzippedBytes)
reader, err := gzip.NewReader(buf)
defer reader.Close()
uncompressedBytes, err := ioutil.ReadAll(reader)
return uncompressedBytes
}
- MsgPack解析:
func parseMsgPack(data []byte) (string, int) {
// 解析键值对数量和数据内容
// 处理嵌套的MsgPack和二进制数据
}
- 二进制数据处理:
func readbinary(buf []byte) (output string, num int) {
// 处理c4/c6标志的二进制数据
// 自动保存DLL和图片文件
}
使用示例
输入:从Wireshark导出的原始通信数据
输出:
- 解密后的通信指令
- 自动提取的DLL/图片文件
- 数据结构分析结果
总结
本文详细剖析了AsyncRAT的通信模型和数据结构,并提供了自动化解密脚本的实现。关键点包括:
- 分层会话通信机制
- 多种数据结构处理方式
- 自动化解密和文件提取功能
- 完整的Go语言实现代码
该脚本可有效辅助安全研究人员分析AsyncRAT的通信行为,提取关键攻击载荷。