程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 探測遠程主機操作系統指紋的全新技術

探測遠程主機操作系統指紋的全新技術

編輯:關於VC++

一、介紹

近年來,網絡安全評估軟件逐漸被網絡安全界所接收,而且在很大的范圍內快速地傳播起來。遠程操作系統探測作為評估軟件的一個部分,必須具備幾個條件:

- 精確性:避免錯誤的探測結果;

- 防火牆和入侵檢測系統的影響:避免影響(或被影響於)防火牆和入侵檢測系統;

- 文雅:低的網絡流通和無危險分段;

- 靈巧:易於擴展標識數據庫和自動探測函數;

- 速度:高速的指紋探測工具應該允許大范圍的網絡掃描。

我向大家介紹一個新的操作系統指紋探測工具-RING。在某些情況下其他的工具也許會失敗,但RING所具備的良好的特性和相當准確的結果一定會讓你滿意的。

RING是一個開放源代碼的軟件,它主要是面向試驗性的概念和測試的目的。

二、技術發展水平

2.1 操作系統探測技術的簡短歷史

- 獲取標識信息 在很多探測工具中都使用了此項技術來獲得某些服務的標識信息。它往往是通過對二進制文件的收集和分析來實現的。

- TCP分段(標准/非標准)響應分析 它是依靠不同操作系統對特定分段的不同反應來區分的。比較流行的工具有Savage的QueSO和Fyodor的NMAP,他們都使用了很多來自於這種技術的變種。

- ICMP響應分析 它是剛推出不久的一種技術。它通過發送UPD或ICMP的請求報文,然後分析各種ICMP應答。Ofir Arkin的X-Probe就是使用的這種技術,在通常情況下,X-Probe工作的比較好,但是在防火牆阻塞某些協議時,得到的結果就不那麼盡如人意了。

- 初始化序列號(ISN)分析 在TCP棧中不同的exploits隨機產生,通過鑒別足夠的測試結果來確定遠程主機的操作系統。(詳情請見 Zalewski,M.(Apr,2001),Strange Attractors and TCP/IP Sequence Number Analysis)

- 特殊的操作系統 拒絕服務同樣可以用在操作系統指紋的探測上,而不僅僅是被黑客所使用。在一些非常特殊的情況下,拒絕服務能探測到准確的結果。

2.2 堆棧查詢技術的細節

堆棧查詢技術通過測量遠程主機TCP/IP堆棧對不同請求的響應來探測系統。大多數操作系統將會以特別的方式來響應特別的分段請求。

NMAP和QueSO就是基於這種技術的。它們產生一組TCP和UDP請求發送到遠程目標主機的開放(未開放)端口。這時,遠程主機響應的有用信息就會被探測工具所接收到,然後對其進行分析。

這些技術通常使安全評估軟件在較小的延遲內,得到一些關於類型和版本之類的信息。

在好幾方面,這種技術是如此的准確:

- 每個操作系統(即使打過某個補丁)通常會使用它們自己的IP棧實現。

- TCP/IP規范並不是被嚴格的執行,每個不同的實現將會擁有它們自己的特性,這樣就為成功探測帶來了可能。

- 規范可能被打亂,一些選擇性的特性被使用,而其他的一些系統則可能沒有使用。

- 某些私自對IP協議的改進也可能被實現,這就成為了某些操作系統的特性。

2.3 典型工具的一些限制

NMAP可以識別500個不同的操作系統,但前提是網絡環境的穩定性,目標主機必須開放一個TCP端口,一個關閉的TCP端口和一個關閉的UDP端口。如果不滿足上面的條件,探測結果的精確度就會有很大程度的降低。

當前的網絡系統,為了安全起見,往往只向外打開一個可見的TCP端口,而其他的端口所接收到的數據報卻是被防火牆或包過濾裝置所過濾掉了。

在這樣的被防火牆保護的網絡環境下,基於ICMP協議,關閉的UDP端口和關閉的TCP端口的探測工具,如NMAP,Xprobe工作的效果就不那麼好了。

三、TCP/IP協議的使用

TCP作為一個數據傳輸協議是建立在IP協議之上的,它的定義可以在RFC793上找到。而TCP/IP協議則是在Internet上主要使用的網絡協議。

TCP的成功在於它的可靠性:對錯誤的探測和管理,數據流動和阻塞的控制,重傳機制等。

為了達到這樣的要求,TCP就成為了面向連接的協議。它的運行機制如下:

1. 建立連接

2. 數據傳輸

3. 終止連接

TCP是建立在IP協議之上的,在發生網絡阻塞或路由問題時,IP協議不能夠提供可靠的端到端數據傳送。而且,IP是一個非連接的協議,所以連接的控制都是建立在TCP層上的。

TCP協議在其頭部提供了對連接的多方面控制。序號和確認號是為了更好的管理數據報的重發並能很好的控制各種特別的錯誤狀況。TCP數據報頭部碼元字段的URG,ACK,PSH,RST,SYN和FIN是為了管理TCP連接狀態而設置的。詳情請見RFC793。

為了以後更好的理解RING的原理,以下列出TCP建立連接的三次握手:(Client主動向Server發起連接)

Client Server

│--------SYN--------->│

│<------SYN-ACK-------│

│--------ACK--------->│

數據報在網絡上傳輸的過程中,某些分段可能在傳輸時丟失了,而理論上每一個數據報都必須被接收方所確認。TCP自己就維持了一張已被確認數據報的列表。

注:如果某個數據報沒有在期望的時間內被接收到,那麼它將被看作丟失處理。

而且,TCP會自動處理各種先後收到的數據報的真實順序,然後它將會以正確的順序發送到上層系統。

網絡系統的阻塞將會導致數據報的丟失。任何網絡容納能力的大小都歸因於物理底層的傳輸能力或路由的能力。

注:如果網絡阻塞發生了,那麼可能會有一些數據報被丟失了。而TCP又重發了那些被丟失的數據報,這樣網絡的阻塞狀況將會變的越來越嚴重。因此,如果網絡阻塞發生了,數據報的重傳速度將會降低。

雖然TCP強調了這種機制,但在RFC793中並沒有利用什麼規則去計算確認數據報之間延遲的大小。

四、臨時的分析

4.1 原理

數據報的重傳為我們提供了另一種分析遠程主機操作系統的方式。我們將通過分析目標主機在各次重傳數據報之間的延遲來判斷遠程主機操作系統的指紋。

這種方式已經在RFC793中被定義了,但是卻留下了一些利用的余地。而且,一些實現並沒有完全遵循目前的標准。

為了讓我們了解這種方式,也就是體會超時機制的作用,我們必須強調遠程主機的IP棧要處在非標准的狀態下。

而這種狀況可以容易地被模仿,只須簡單的放棄對遠程主機SYN-ACK數據報的確認就可以達到。

通過測量重傳的兩個相鄰數據報之間的延遲,或觀察一些其他的信息,比如TCP的標記,序號,確認號,這些都可以得到一些關於遠程主機操作系統的有用信息。

如果每個操作系統都有其自己的特點,那麼建立一個典型的系統標識數據庫將會成為一種可能。不管測試的主機或網絡狀況如何,操作系統將是唯一影響測試結果的因素。因此,探測那些建立在不同主機上卻使用相同操作系統而得到的結果,將會是一樣的(前提是網絡狀況比較穩定)

通過將目標主機指紋與操作系統指紋數據庫裡的相比較,將有可能知道遠程主機所運行的操作系統。

新的操作系統的標識將會被很容易的紀錄下來,它們將會和操作系統的名字聯系起來。

4.2 DIY

這種操作系統指紋探測技術將會使用探測儀器的兩個部分。一個數據報過濾裝置,比如個人防火牆,另一個就是數據報監聽裝置。

探測儀器的配制:一種簡單的模仿網絡阻塞的方法就是在掃描主機上安裝一個個人防火牆,並設置一些過濾規則來禁止接收所有來自目標主機的數據報。這時,數據報監聽裝置將會接收到所有的來自目標主機的數據報,由於防火牆的存在,掃描主機不會發送任何確認信息,這樣就無法建立起完整的TCP連接。在某個時間段之後,遠程主機就會終止與掃描主機的任何關系。

測試過程:測試過程將由三個不同的步驟組成。

- 防火牆的設置

- 試圖與目標主機建立標准的連接

- 目標主機發送確認數據報

下面將詳細的描述實現的過程:

- 選擇一台主機,並確認某個存在的打開的端口。比如遠程主機為192.168.0.10,它的TCP 80端口是打開的(系統開啟的Web服務);

- 配置防火牆使其阻塞掉所有的來自目標主機;(192.168.0.10)的數據報。

- 監聽來自目標主機TCP80端口的所有數據報;

- 向目標主機發送一個SYN數據報,試圖與之建立連接;

- 分析所有來自目標主機的相鄰數據報之間的延遲 。

實際上,我們測量的並不是目標主機發送連續數據報之間的時間間隔,而是我們收到的來自目標主機連續數據報之間的時間間隔。如果這些時間間隔幾乎是固定的,那麼我們可以大膽的假設他們是相等的。

下面是探測時數據報的流動情況(A表示掃描主機,B表示被探測的目標主機,A與B之間的無箭頭直線表示沒有數據傳輸):

A B

│--------SYN--------->│

│<------SYN-ACK-------│--------------

│---------------------│ 時間間隔為 t1

│<------SYN-ACK-------│--------------

│---------------------│ 時間間隔為 t2

│---------------------│

│<------SYN-ACK-------│--------------

│---------------------│

│---------------------│ 時間間隔為 t3

│---------------------│

│---------------------│

│<------SYN-ACK-------│--------------

4.3 靜態分析

因為數據報可能通過了一些不穩定的網絡,比如Internet,這樣很可能接收到的連續數據報之間的延遲(r_i)和它們被發送時的延遲(s_i)就不再相同了。

假如我們收到來自目標主機的兩個連續的數據報時,測量到的延遲為3.01秒,但是很有可能他們在發送時相互間的延遲為3.0秒。問題在於某些系統實現時將3.2秒作為發送兩個連續數據報的時間延遲。而介於3.0秒和3.2秒之間的區間因為太小,以至於無法區分接收到的數據報究竟是來自哪種系統的。

為了避免這個問題,我們可以使用TCP的時間截選項,這樣就可以更好的得到何時發送數據報的信息了。在每個數據報裡都設置時間截選項將會提高探測結果的准確度。不過,使用時間截選項也許會增加我們判斷的難度,因為時間截選項可能會返回一些不准確的時間數據。

這種方法就是建立在指紋的獲取以及與現有指紋數據庫比較的基礎之上的。通常的測量“距離”的方式為求得對應延遲之間的差值:

Distance=∑│ r_i - s_i │

其中r_i為與接收到的第i個數據報相關的時間延遲,s_i為指紋數據庫中的相應順序數據報的時間延遲。

因此,探測到的最可能的操作系統將是求得“距離”最短時的指紋數據庫中對應的操作系統。而“距離”的求得並沒有考慮TCP數據報頭部的一些重要標記(如SYN,ACK,RST,FIN……)的影響。而這些標記往往又能探測到目標主機的運行狀態。序號和確認號,這些信息卻可以用來區分不同的系統實現方式。

五、RING的執行和現實結果

5.1 庫

為了開發的簡便,RING使用了標准的C語言和UNIX下的一些庫文件。比如Dug Song''s Libdnet library,Mike D. Schiffman Libnet library,Lawrence Berkeley national liboratory Libpcap library。

Libdnet庫被用來對防火牆進行控制,它提供了一個API允許控制某些UNIX的防火牆(比如ipchains,ipfilters,ipf……)

Libpcap通常被用來進行網絡的監聽,以及數據報的分析。

5.2 運行過程

RING對遠程主機的探測需要一些初始化參數,目標主機的IP地址,目標主機上一個開放的TCP端口,掃描主機的IP地址以及用於監聽數據報的網絡接口。

然後,RING將會執行下面的步驟:

- 源端口的選擇;

- 使用libdnet,建立起本地過濾設施,阻擋來自目標主機的數據報;

- 使用libpcap監聽收到的數據報;

- 使用libnet,發送一個TCP SYN數據報到探測目標主機;

- 在默認/調整過的延遲內監聽回送的數據報

- 將收到的回送數據報與以知的簽名相比較

5.3 實際的結果

在其他工具無法區分遠程主機系統時,RING仍然能提供非常准確的結果。例如,一台Win2k主機,一台FreeBSD主機,即使它們是隱藏在通常配制的防火牆後面,RING也是有可能區分出他們來的。

Win2k和FreeBSD的實現有一個非常相似的地方,因為他們共享了相同的IP棧技術。如果他們這兩個操作系統上只有一個開放的端口,NMAP在通常情況下是無法區分兩者的。

如果實現的技術非常的相識,我們將會探測另外的Reset數據報做來進一步的分析,這對RING來說應該是足以區分遠程主機的操作系統。

如下是Win2k和FreeBSD的比較:

(以下各表中,各個系統對應的數據為重傳數據報的時間延遲,以秒為單位。如下圖第一行數據: 1st表示遠程主機的第一次重傳,而後Windows 2k下面的3表示window 2k系統的第一次重傳延遲為3秒,再後的FreeBSD 4.4下面的3也表示FreeBSD 4.4系統第一次重傳的延遲為3秒。)

____________________________________________

│Retries│===Windows 2k====│=FreeBSD 4.4=│

│==1st==│========3========│======3======│

│==2nd==│========6========│======6======│

│==3rd==│=no more retries=│=====12======│

│==4th==│=================│=====24======│

----------------------------------------------------

│=Reset=│==no reset sent==│=reset after 30 sec.=│

----------------------------------------------------

RING同樣可以區分出相同操作系統的不同版本:

-------------------------------------------------

│Retries│===Linux2.2.14===│====Linux 2.4====│

│==1st==│=======3,5=======│======4,26=======│

│==2nd==│=======6,5=======│========6========│

│==3rd==│======12,5=======│=======12========│

│==4th==│======24,5=======│=======24========│

│==5th==│======48,5=======│======48,2=======│

│==6th==│======96,5=======│=no more retries=│

│==7th==│======120,5======│=================│

│==8th==│=no more retries=│=================│

-------------------------------------------------

│=Reset=│====no reset====│====no reset====│

-------------------------------------------------

-------------------------------------------------

│Retries│===Windows 98====│===Windows 2k===│

│==1st==│========3========│========3========│

│==2nd==│========6========│========6========│

│==3rd==│=======12========│=no more retries=│

│==4th==│=no more retries=│=================│

-------------------------------------------------

│=Reset=│=====no reset====│=====no reset====│

-------------------------------------------------

以下是在不同的設備上現實的區別:

---------------------------------------------------------

│Retries│minolta printer│ cisco router │3com switch│

│==1st==│======4,5======│======2========│====3,5====│

│==2nd==│======4,5======│======3,9======│====4,4====│

│==3rd==│=======9=======│======5,9======│====4,4====│

│==4th==│=======18======│no more retries│====4,4====│

│==5th==│=======36======│===============│====4,4====│

│==6th==│=======72======│===============│====4,4====│

│==7th==│======144======│===============│====4,4====│

│==8th==│======285======│===============│====4,4====│

│==9th==│======576======│===============│====4,4====│

│==10th=│======169======│===============│====4,4====│

│==11th=│======169======│===============│====4,4====│

│==12th=│======169======│===============│====4,4====│

---------------------------------------------------------

│=Reset=│=====Reset=====│===no reset====│==no reset=│

---------------------------------------------------------

注意,經過一系列的重傳後,一些系統會發送一個RST數據報警告掃描主機終止傳輸,進而停止重傳數據報。

六、討論與擴充

6.1 優勢

RING使用的技術的最大優勢就是它只需要一個打開的端口。如果目標主機是被防火牆所保護的,那麼很可能就只開了一個端口,其他的端口則是被過濾了的。

在相同的防火牆配置情況下,NMAP就不會那麼有效了,因為它是基於一些關閉端口了,而這些關閉的端口往往是被過濾了。

而且,RING的技術是使用了一個標准的TCP數據報,它將不會對目標主機造成任何的不利影響。

另一方面,這種探測方式需要花比NMAP或Xprobe更多的時間。這是測量連續數據報時間延遲的一個固有的缺點。

6.2 保護

有什麼辦法可以阻止RING對操作系統指紋的探測呢?因為傳送的是標准的數據報,因此目標主機不可能將之從通常的數據傳輸中區分開來。

數據報的重傳是顯而易見的,但是數據報的丟失和重傳在網絡上又是時常發生的事情。

如果一個入侵檢測系統為了防止網絡上過多的垃圾信息而中止了某個連接,這樣將會降低TCP的錯誤率並恢復網絡的流通容量。

在某些操作系統中,可以通過修改TCP/IP棧某些成員的數據進而達到避開RING探測的作用。但是我並不推薦這種方法,因為它會嚴重威脅到TCP/IP棧的穩定性。

另一個可能的方法是將主機隱藏於代理之後,或是使用防火牆技術來實現SYN轉發或SYN網關技術。SYN轉發或SYN保護技術是專門用來對付SYN洪水攻擊的。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SYN轉發原理:

(注:以下各圖中,相同名稱的為同一台主機,無箭頭的直線沒有任何意義。如下圖:三個client均指同一客戶端,三個firewall均指同一個防火牆)

client ------SYN ------> firewall ---------------- target

client <--- SYN-ACK----- firewall ---------------- target

如果在某個時間段內防火牆沒有收到等待的ACK數據報,那麼這個連接將會被中止:

client <------RST------- firewall ---------------- target

相反,傳輸將會繼續進行:

client ---------------- firewall -------SYN------> target

client ------ACK------> firewall <--- SYN-ACK----- target

client ---------------- firewall -------ACK------> target

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SYN網關原理:

client ------SYN------> firewall -------SYN------> target

client <----SYN-ACK---- firewall <-----SYN-ACK---- target

如果在某個時間段內防火牆沒有收到等待的ACK數據報,那麼它將會中斷本次連接:

client ---------------- firewall ------RST------> target

相反,連接將會繼續進行:

client ------ACK------> firewall ------ACK------> target

6.3 將來的改進

在TCP的傳輸流中另一種狀態也有相同的功能,試圖重發那些被假裝丟棄的數據報,這就是FIN_WAIT_1狀態。它可以和前面的探測技術結合使用,也可以用在對進行了SYN保護系統的探測之中。這種有趣的技術可以通過實施了SYN網關保護機制的網絡,進而實現對真正目標主機的系統指紋探測。

---------------------------------------------

│Retries│===Linux2/4====│==Windows 2k===│

│==1st==│======0,8======│=======3=======│

│==2nd==│======1,3======│=======6=======│

│==3rd==│======2,6======│======12=======│

│==4th==│======5,2======│======24=======│

│==5th==│=====10,5======│======48=======│

│==6th==│=====20,8======│no more retries│

│==7th==│=====41,6======│===============│

│==8th==│no more retries│===============│

---------------------------------------------

│=Reset=│===no reset===│====no reset===│

---------------------------------------------

七、結論

RING 使用了一個建立在常規,無危險TCP傳輸上的新的操作系統探測技術。它通過分析目標主機在各次重傳數據報之間的延遲來判斷遠程主機操作系統的指紋。如果將其和其他的操作系統探測技術相結合,應該會收到更好的效果。

Reference:

1 ) << Ring-full-paper >> by Intranode Research Team

2 ) << Remote OS detection via TCP/IP Stack FingerPrinting >> by Fyodor

3 ) << ICMP based remote OS TCP/IP stack fingerprinting techniques >> by Ofir Arkin & Fyodor Yarochkin

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved