汪彩梅 蔣薇薇 劉文杰
1合肥學院網絡與智能信息處理重點實驗室 安徽 230601
2合肥工業大學計算機與信息學院 安徽 230009
3科大恒星電子商務技術有限公司 安徽 230022
隨著互聯網技術的快速發展和普及,黑客攻擊已經成為全球信息安全影響最嚴重的危害之一,且攻擊方法是變化多端。軟件后門是軟件編程人員為了方便修改、維護程序而設置的,一般不為外人所知,但一旦被黑客所掌握,其后果將不堪設想,后門也因此常被黑客們作為攻擊目標的入口而研究。
在現有的TCP/IP網絡中IP協議提供的是不可靠、無連接、盡最大努力交付分組的服務,該協議自身沒有提供差錯報告和差錯糾正機制,為了提高分組交付成功的機會,以及方便對網絡進行調試,在網絡層通常使用ICMP來提供主機或路由報告差錯和異常情況。
ICMP報文的格式主要包括8B的首部和可變長度的數據,如表1所示,其中,在ICMP的首部前4B對所有的報文類型都是相同的,后4B(首部的其余部分)對每一種報文類型都是特定的。

表1 ICMP報文格式
由于ICMP報文是由系統內核直接處理而不通過端口,因此當后門將自己偽裝成一個類似Ping的進程,系統就會將ICMP_ECHOREPLY(Ping的應答包)的監聽、處理權交給后門程序,從而在不需要開放端口的情況下實現兩個端點之間的通信[2-3]。論文基于這樣原理設計并實現了 C/S(客戶機/服務器)模式下的無端口后門系統,系統由服務器端程序和客戶端程序組成。
客戶端程序的工作流程如圖1所示。
用戶啟動客戶端系統后,系統會調用int EnumerateFunc()函數實現對網絡中所有在線主機主機名和IP地址。啟動對網絡資源進行枚舉的過程WNetOpenEnum,參數中設置枚舉所有網絡資源 RESOURCE_GLOBALNET,資源類型為RESOURCETYPE_DISK指定句柄資源hEnum,然后將指定的內存塊清零 ZeroMemory(lpnrLocal, cbBuffer),并調用WNetEnumResource功能進行枚舉
dwResultEnum=WNetEnumResource(hEnum, &cEntries, lpnrLocal, &cbBuffer);調用應用程序定義的函數顯示NETRESOURCE 結構內容,判斷是否是一臺計算機if(lpnrLocal[i].dwDisplayType==RESOURCEDISPLAYTYPE_ SERVER)。
由于 IpRemoteNames 是形如 “\xxx” 這樣的主機名字,所以要從 xxx開始轉換 myhostent=gethostbyname (&(lpnrLocal[i].lpRemoteName[2]));
CopyMemory(&addr.S_un.S_addr, myhostent-> h_addr_list[0], myhostent-> h_length);然后輸出該計算機的主機名稱和 IP地址:
printf( "[%d]%s : %s ", nComputers, lpnrLocal[i].lpRemoteName, inet_ntoa(addr) ); 繼續調用枚舉EnumerateFunc(&lpnrLocal[i]);直到循環結束。

圖1 客戶端程序流程圖
服務端程序基本流程如圖2所示。
服務端需要設置Service控制程序,包括服務的啟動CmdStart (DWORD, LPTSTR *)、控制WINAPI CmdControl(DWORD);和服務的主函數WINAPI CmdService(LPVOID);另外,還有調用服務的安裝函數 InstallCmdService(void);和服務卸載函數RemoveCmdService(void);
服務控制函數WINAPI CmdControl(DWORD)中,利用switch選擇語句判斷調用相應的服務的暫停、繼續和停止。在服務的啟動函數中,以此填寫SERVICE_STATUS的結構,然后注冊服務控制函數并設置服務狀態,最后啟動后門線程:
hThread=CreateThread(NULL, 0, CmdService, NULL, 0, NULL)
在服務的主函數中,也就是服務程序的入口點,創建一個名稱為ntkrnl的服務,并根據cmd中的控制命令install(安裝服務)和 remove(卸載服務)分別調用安裝服務函數和卸載服務函數。在用戶的服務主函數中可以添加后門程序代碼。

圖2 服務端程序流程圖
后門攻擊的防范工作已不容忽視,除了常規防范工作外[4-5],論文通過創建日志文件記錄下攻擊主機的IP地址和攻擊的時間等信息以供該攻擊的取證工作。具體方法如下:
在服務端利用原始套接字對報文進行接收,首先創建套接字SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_ RAW);在接收報文recv()函數中,設置參數協議簇dest.sin_ family=AF_INET;主機 IP地址為 dest.sin_addr.s_addr=inet_addr (ICMP_DEST_IP);則存儲了遠程主機的 IP信息,與此同時調用系統時間函數:SYSTEMTIME time;獲得此刻的時間GetLocalTime(&time)。
然后執行文件操作,定義文件指針FILE *fp,調用文件打開函數fopen打開文件chenbo.log,如果電腦中還沒有此文件,程序將自動創建一個名為chenbo.log的日志文件,編寫文件的讀寫程序將信息寫到chenbo.log這個文件當中保存:
sprintf(fileTemp," 發現目標:%s 日期 %d-%d-%d 攻擊時間 %d:%d:%d ",ICMP_DEST_IP,time.wYear,time.wMonth, time.wDay,time.wHour,time.wMinute,time.wSecond);fwrite(file Temp,sizeof(char),strlen(fileTemp),fp);
系統在 Microsoft Visual C++編譯環境下完成,在Windows XP和Windows 7操作系統中都能編譯運行并實現功能。
測試環境:在同一個局域網內的兩個主機(客戶端為主機A,服務器端為主機B)之間進行測試,主機A的IP地址為:192.168.1.111,主機B的IP地址為:192.168.1.144。進程的控制以目標主機正在運行的千千靜聽軟件為例。運行客戶端程序后出現如圖3所示:

圖3 客戶端列出網內在線主機名單
在客戶端A上輸入命令pslist可查看遠程主機B的正在運行的進程列表及CPU標識符PID,如圖4所示:

圖4 客戶端顯示進程列表和進程號
進程列表的最后一個進程TTPlayer.exe,它的PID進程號為3408,它是播放音樂的軟件千千靜聽。等下我們將用到它進行測試關閉進程功能的實現。

圖5 客戶端顯示的進程列表尾部
接著輸入命令pskill 3408,來測試關閉主機B正在運行的千千靜聽,實現對遠程主機的控制。測試結果顯示在列表的結尾看不到TTPlayer.exe進程。
論文完成了一種基于無端口后門的編寫,能夠在不開放目標主機端口的情況下實現對其的連接功能,能夠竊取網絡中目標主機的信息,并對目標主機實現基本控制。
在無端口后門的防護方面,針對基于ICMP協議無端口攻擊,在服務器端子系統中利用WINSOCK技術捕獲報文,對接收到的報文進行解析,提取報文來源主機的IP地址等有關信息并寫進記錄日志中。
[1]楊延雙,張建標,王全民.TCP/IP協議分析及應用.北京:機械工業出版社.2008.
[2](美)Jeffrey Richter 編著.Windows 核心編程.清華大學出版社.2008.
[3]李凌.Winsock2網絡編程實用教程.北京:清華大學出版社.2003.
[4]曲鼎,王崗.PC實用之道:病毒與黑客攻防.清華大學出版社.2006.
[5]鄧吉.黑客攻防實戰入門.北京:電子工業出版社.2007.