我們在判定遠程操作系統類型的時候,最熟悉的方法就是使用ICMP協議Ping同一局域網內的不同主機,屏幕上回顯的TTL值會因不同主機操作系統的不同而不同,甚至是由於系統版本、防火牆、補丁等細節不同,在不同的主機,即使相同的操作系統,回顯的TTL值也會有所不同。
下圖是ping同一局域網內的Windows XP主機,TTL值為128。選擇ping局域網中主機的原因是由於以太網中兩台主機進行通信中間沒有跳點,TTL是從發起端發出的原始值。
下圖是ping同一局域網內的Ubuntu主機,TTL值為64。
下圖是ping 百度網站的例子。通過地址解析我們ping的是61.135.169.125,TTL值為56。直接ping互聯網上的主機,雖然TTL值也有不同,但是不能直接顯示發送端的原始值。TTL是由發送主機設置的,可防止數據包在互聯網上無限循環。轉發IP數據包時,要求路由器至少將TTL減小1。不過這個值會接近2^n (1≤n≤8),所以可認為以下對端主機為Linux系統。
然而單純依賴TTL數值也是不准確的,還需要更加完整和系統性的識別技術,這就催生出操作系統識別技術的迅速發展。
其中最具代表性的就是基於各種操作系統TCP/IP協議棧指紋的識別。常用的網絡協議是標准的,因而從理論上講各種操作系統的協議棧應該是相同的。但在實際情況中,各種操作系統的協議棧的實現存在細微的差異,這些差異稱作網絡協議棧的指紋。由於每個操作系統對於網絡部分的實現不盡相同,雖然在一些核心功能上都是一樣的,但細節上可以區分,這樣就為識別操作系統提供了可行性。
TCP/IP規范並不是被嚴格地執行,每個不同的實現將會擁有自身的特性,規范可能被打亂,一些選擇性的特性被使用,而其他的一些系統則可能沒有使用。某些對IP協議的改進也可能被實現,這就成為了某些操作系統的特性。根據TCP數據包的響應來進行探測,它是依靠不同操作系統對特定TCP的不同反應來區分的。
對TCP協議族來說,這些差異通常表現在數據包頭的標志字段中,如窗口大小(Window Size)、ACK序號、TTL等的不同取值。通過對這些差別進行歸納總結,可以比較准確地識別出遠程系統的類型。TTL(Time To Live)是數據包的存活時間,表示一個數據包在被丟棄之前可以通過多少躍點。不同操作系統的默認TTL值往往是不同的。DF位表示不分段的標志,在IP協議中設定,不同操作系統對DF位有不同的處理方式,有些操作系統設置DF位,有些不設置DF位,還有一些操作系統在特定場合設置DF位,在其他場合不設置DF位。Window Size表示TCP接收或者發送窗口大小,它決定了接收信息的機器在收到多少數據包后發送ACK包,一個特定操作系統的默認Window Size基本是常數。ACK序號也可以用來判斷,不同的操作系統處理ACK序號時是不同的。如果發送一個含有FIN、PSH、URG的數據包到一個關閉的TCP端口,大多數操作系統會把回應ACK包的序號設置為發送的包的初始序號,而Windows系統則會發送序號為初始序號加1的ACK包。發送一個只有FIN標志位的TCP數據包給一個打開的端口,Linux等系統不響應,有些系統,例如Windows、HP-UX等,會返回一個RESET數據包。在SYN包的TCP頭里設置一個未定義的TCP標記,目標系統在響應時,有的會保持這個標記,有的不保持,還有一些系統在收到這樣的包的時候會復位連接。還可以利用初始化序列號ISN來識別,不同的操作系統在選擇TCP ISN時采用不同的方法。不同的操作系統有不同的默認MSS值,對不同的MSS值的回應也不同。
介紹一個多功能的遠程OS指紋被動識別工具——P0F,這是繼Nmap和Xprobe2之后又一款指紋識別軟件。
P0F的特色是探測:
- 是否運行於防火牆之后
- 是否運行於NAT模式
- 是否運行於負載均衡模式
- 遠程系統已啟動時間
- 遠程系統的DSL和ISP信息等
那現在就讓我們來體驗P0F的神奇魅力。實驗環境安裝在Ubuntu 12.04.1 LTS,同時要安裝大名鼎鼎的數據包捕獲數據庫LibPcap,Windows下的版本叫做WinPcap,Wireshark就是利用這個庫開發的。下載P0F並使用WinSCP軟件將安裝包和數據包上傳到實驗環境,通過tar進行解壓縮,並./build進行編譯后就可以使用了,如果還不放心可運行./build debug,正常情況出現提示信息如下圖。
那現在我們就可以對數據包進行系統識別了,運行./p0f –r [文件路徑],就可以識別出操作系統的類型。
以下兩張圖可針對數據包識別出Windows7和HP-UX系統。