木馬客戶端與服務端隱蔽通訊解析

2021-04-02 15:08:19 字數 2795 閱讀 4966

現代木馬的實現是建立在一種既可靠,又不易被宿主發現的通訊方案上的,本文就是對各種方案的實現方法,可靠性,安全性做了一些理論上的**。充分的理解木馬的客戶端和服務端是怎麼進行隱藏的,不但可以幫助您能深刻的理解網路通訊的原理,也可以更有效的做好安全防範。基於此我們編髮了此文,下面我們進入正題。

首先應該明確的是受害者的機器上執行的木馬程式我們稱之為服務端,控制者機器上執行的我們稱之為客戶端(其實對於現代的木馬,已經很難說誰是客戶,誰是服務了,不過我們還是繼續用這種叫法)。另外雖然windows9x仍然有巨大的使用者基礎,但是windows9x向windows xp遷徙只是早晚問題,所以這裡的討論主要是針對nt/2000/xp平台的。

1.使用tcp協議,服務端偵聽,客戶端連線。

這是最簡單,最早,最廣泛使用的一種通訊方案。使用過冰河或者被冰河客戶端掃過的對此一定不會陌生。這種通訊方案是服務端在宿主機器上開乙個tcp埠,然後等待客戶端的連線,在通過對客戶端的認證後,客戶端就可以控**務端了。由於是建立在tcp協議基礎上,所以通訊的可靠性是得到保證的。但是通訊的安全性卻很成問題。首先,使用像fport,tcpview pro這樣的工具可以很容易的發現在某一埠上偵聽的程序,以及程序對應的可執行檔案。其次,在安裝了防火牆的機器上,當客戶端連線到服務端時,很容易引起防火牆報警。

2.使用tcp協議。

客戶端偵聽,服務端連線。這就是所謂的反向連線技術了。為了克服服務端在某一埠上偵聽易被發現這一缺點,現在服務端不再偵聽埠,而是去連線客戶端在偵聽的某一埠。這樣用一般的port scanner或者fport就發現不了服務端了。而為了更好的麻痺宿主機,客戶端偵聽的埠一般是21,80,23這種任何人都要訪問的埠。雖然在安裝了防火牆的機器上,服務端去連線客戶端還是要引起防火牆報警,但是乙個粗心的使用者很可能會忽略「應用程式***xx試圖訪問***.***.***.***通過埠80」這樣的警告。

這種反向連線技術要解決的乙個問題是,服務端如何找到客戶端。由於一般客戶端都是撥號上網的,沒有乙個固定的ip,所以客戶端ip不可能硬編碼在服務端程式中。當然由於撥號上網使用者的ip一般都是處於乙個固定的ip位址範圍內,服務端也可以掃瞄這個範圍,然後根據被掃瞄主機的反饋來確定是否是自己的客戶端,但是服務端掃瞄乙個ip位址範圍也太。另乙個方法是客戶端通過乙個有固定ip或者固定網域名稱的第三方發布自己的ip,實現的方法就很多了,比如通過乙個公共的郵箱,通過乙個個人主頁,就看你有多大的想象力。

3.使用udp協議。

服務端偵聽,客戶端連線;客戶端偵聽,服務端連線。方法和安全性與使用tcp協議差不多。需要注意的是udp不是乙個可靠的協議,所以,必須在udp協議的基礎上設計乙個自己的可靠的報文傳遞協議。

4.解決防火牆問題。

5.服務端主動連線時客戶端ip的公布問題。

使用第三方公布客戶端ip不是一種可靠的方法。比如如果是通過乙個個人主頁發布客戶端ip的話,一旦由於種種原因,這個個人主頁被主頁提供商取消的話,服務端就找不到客戶端了。而這種個人主頁被主頁提供商取消的可能性是很大的。同時客戶端也要冒暴露自己的ip的風險。所以更好的方法是客戶端通過某種方法主動告訴服務端自己的ip和埠,然後服務端來連線。這樣可以保證最大的可靠性,安全性和靈活性。

服務端怎麼收到客戶端的通知呢?一種方法是我們截獲其他程序收到的tcp資料或者udp包,然後分析截獲的資料,從中確定是否客戶端發來了乙個報告其ip的資料片斷。另一種方法是使用raw socket來收聽echo reply型別的icmp包,在icmp資料報的資料去就包含了客戶端ip。而對於普通使用者來說,由於要上網瀏覽,這樣的icmp包是很少過濾掉的。

6.用icmp來通訊。

既然客戶端可以通過發乙個icmp(echo reply)來告訴服務端它的ip,那為什麼不把所有服務端和客戶端的通訊都建立在icmp的基礎上呢?服務端向客戶端發icmp(echo request),客戶端向服務端發icmp(echo reply),然後可以在icmp基礎上建立乙個自己的可靠資料報通訊協議。如果不怕煩的話,還可以建立乙個tcp over icmp。由於一般的使用者這兩類icmp包都是設為無警告放行的,這種方法的隱秘性還是很強的。

7. 用自定義的協議來通訊。

我們知道ip頭的協議字段指定了這個ip包承載得資料的協議,比如tcp,udp,icmp等等。我們完全可以把這個欄位設為我們自己定義的值(>80),定義自己的通訊協議。不過估計這種ip包將會被所有的防火牆過濾掉。

8.關於伺服器上的木馬的通訊隱藏。

前面所說都是針對個人使用者(大部分都是撥號使用者,包括modem,isdn,adsl,fttx+la,cable modem)。對這類機器來說,一般都沒有開什麼服務,而且一般都使用了個人防火牆,同時icmp echo reply/request都是放行的,所有才有我們上述的各種方案。而對於伺服器來說,至少要開http服務,同時,又一般位於專門的防火牆之後。這個專門的防火牆很可能過濾掉除型別為tcp,且目的埠為80的ip包之外的所有的ip包,更不要說各類icmp包了。向下的方案通不過,我們可以試試向上的方案。一種方法就是注射到iis服務的程序空間中,然後在iis接受到木馬客戶端的請求前來個預處理,在iis將資料發給木馬客戶端時來個後處理,不過我不知道怎麼實現,不知哪為高手知道。

另一種方法就是寫乙個isapi ap,這樣,木馬客戶端發個 "http://***.***.***.***/backdoor.dll?cmd=dir+c:/"請求來發命令了。當然,一切資訊都是加密得。rpc除了rpc over **b,rpc over tcp等等外,還有乙個rpc over http,事實上qq的http**就是他自己定義的乙個rpc over http,至少qq自己是這麼叫的。現在,我們也來了個rpc over http。

通訊隱藏技術只是木馬隱藏諸技術中得一部分,但也是最重要的一部分。因為他不但要保護木馬,還要保護木馬得控制者,所以不管是木馬編寫者,還是防火牆編寫者,都應該對這一部分給於足夠的重視。

TCP客戶端與服務端通訊

客戶端 include include include include include in.h include include include include define maxline 1024 int main int argc,char ar 建立socketfd socketfd soc...

TCP通訊,多客戶端通訊(客戶端 服務端)

客戶端和伺服器間的交流,客戶端傳送資訊,伺服器接收到,並返回資訊 長連線建立socket連線服務端 指定ip位址,埠號 通過ip位址找對應的伺服器 呼叫socket的getinputstream 和getoutputstream 方法獲取和服務端相連的io流 輸入流可以讀取服務端輸出流寫出的資料 輸...

服務端 客戶端Socket通訊

服務端 using system using system.collections.generic using system.net using system.net.sockets using system.text using system.text.regularexpressions usi...