您好,登錄后才能下訂單哦!
這篇文章給大家介紹Nmap是如何識別主機指紋的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
0x01
Nmap維護一個nmap-os-db數據庫,存儲了上千種操作系統信息,簡單一點來說,Nmap通過TCP/IP協議棧的指紋信息來識別目標主機的操作系統信息,這主要是利用了RFC標準中,沒有強制規范了TCP/IP的某些實現,于是不同的系統中TCP/IP的實現方案可能都有其特定的方式,這些細節上的差異,給nmap識別操作系統信息提供了方案,具體一點說,Nmap分別挑選一個close和open的端口,分別發送給一個經過精心設計的TCP/UDP數據包,當然這個數據包也可能是ICMP數據包。然后根據收到返回報文,生成一份系統指紋。通過對比檢測生成的指紋和nmap-os-db數據庫中的指紋,來查找匹配的系統。最壞的情況下,沒有辦法匹配的時候,則用概率的形式枚舉出所有可能的信息。
所謂的指紋,即由特定的回復包提取出的數據特征
0x02
Nmap-os-db在kali中路徑如下
我把他下在到win上方便查看
這是指紋庫的版本
以這條為例
最前面幾行為注釋行,說明此指紋對應的操作系統與版本。
Fingerprint關鍵字定義一個新的指紋,緊隨其后的是指紋名字。
Class行用于指定該指紋所屬的類別,依次指定該系統的vendor(生產廠家),OS family(系統類別),OS generation(第幾代操作系統),and device type(設備類型)。
接下來是CPE行,此行非常重要,使用CPE(CommonPlatformEnumeration,通用平臺枚舉)格式描述該系統的信息。以標準的CPE格式來描述操作系統類型,便于Nmap與外界信息的交換,比如可以很快從網上開源數據庫查找到CPE描述的操作系統具體信息。
此處作為指紋描述字段的CPE格式如下:
cpe:/<part>:<vendor>:<product>:<version>:<update>:<edition>:<language>
接下來從SEQ到IE的13行都是具體指紋數據描述行,在對比指紋時,就是對比這13行里面的具體數據,如果匹配則目標機為指紋所描述的系統類型。
SEQ描述順序產生方式;OPS描述TCP包中可選字段的值;WIN描述TCP包的初始窗口大小;ECN(ExplicitCongestionNotification)描述TCP明確指定擁塞通知時的特征;T1-T7描述TCP回復包的字段特征;U1描述向關閉的UDP發包產生的回復的特征;IE描述向目標機發送ICMP包產生的特征。
0x03
在系統探測過程中,會執行五種不同的測試,每種測試由一個或者多個數據包組成,目標系統對每個數據包作出的響應有助于確定操作系統的類型。
五種不同的測試是:
1.sequencegeneration
2.ICMPecho
3.tcp explicit congestion notification
4.TCP
5.UDP
分別看看
序列生成(sequencegeneration):
序列生成測試由六個數據包組成,這六個包是每隔100 毫秒分開發送的,且都是TCP SYN 包。每個TCP SYN 包的結果將有助于NMAP 確定操作系統的類型。
ICMP回顯(ICMPecho):
兩個有著不同設置的ICMP請求包被送到目標系統,由此產生的反應將有助于實現驗證操作系統類型。
TCP顯式擁塞通知(explicitcongestion notification):
當生成許多包通過路由器時會導致其負載變大,這稱之為擁塞。其結果就是系統會變慢以降低擁堵,以便路由器不會發生丟包。這個包僅為了得到目標系統的響應而發送。因為不同的操作系統以不同的方式處理這個包,所以返回的特定值可以用來判斷操作系統。
TCP:在這個測試中會發送六個數據包。一些帶有特定的包設置的包被發送用來到打開的或關閉的端口。結果也將會因為操作系統的不同而不同。
所有TCP 包都是以如下不同的標志被發送:
無標志
SYN、FIN、URG和PSH
ACK
SYN
ACK
FIN、PSH和URG
UDP:這個測試由一個被發送給一個關閉的端口的數據包組成。如果目標系統上的這個端口是關閉的,而且返回一條ICMP 端口不可達的信息,那么就說明沒有防火墻。
0x04
以kali為例,如果關閉全部端口,則會顯示
開放一個80端口,此時就可以檢測出這是linux系統
0x05
接下來通過抓包分析
144為被掃描的機器,138為運行nmap的機器
我在前面提到,在kali上開發的唯一端口是80,所以在wireshark可以看到這一系列包是在發往80端口的
Sequence generation (SEQ, OPS, WIN, and T1)
會發送一系列共6個tcp探測來生成4個響應行,每一個都是tcpsyn數據包,連接到遠程機器上檢測到的開放的端口。
這些數據包的序列(sequence)和確認號(acknowledgementnumbers)是隨機的,tcp選項和tcp窗口字段值也是不同的。
具體而言如下所示:
Packet #1: window scale (10), NOP, MSS (1460),timestamp (TSval: 0xFFFFFFFF; TSecr: 0), SACK permitted. The windowfield is 1.
如2006所示
Packet #2: MSS (1400), window scale (0), SACKpermitted, timestamp (TSval: 0xFFFFFFFF; TSecr: 0), EOL. The windowfield is 63.
如2009所示
Packet #3: Timestamp (TSval: 0xFFFFFFFF; TSecr:0), NOP, NOP, window scale (5), NOP, MSS (640). The window field is4.
如2012所示
Packet #4: SACK permitted, Timestamp (TSval:0xFFFFFFFF; TSecr: 0), window scale (10), EOL. The window field is 4.
如2015所示
Packet #5: MSS (536), SACK permitted, Timestamp(TSval: 0xFFFFFFFF; TSecr: 0), window scale (10), EOL. The windowfield is 16.
如2018所示
Packet #6: MSS (265), SACK permitted, Timestamp(TSval: 0xFFFFFFFF; TSecr: 0). The window field is 512.
如2021所示
上圖中2006-2007是一對syn,及對應返回的synack;
2006-2007,2009-2010,2012-2013,2015-2016,2018-2019,2021-2022一共6對
這些測試的結果包括四個結果類別行。
第一個SEQ包含基于探測包的序列分析的結果。這些測試結果是GCD,SP,ISR,TI,II,TS和SS。
SEQ測試將六個TCPSYN數據包發送到目標機器的開放端口,并收回SYN/ ACK數據包。這些SYN /ACK分組中的每一個包含32位初始序列號(ISN)。GCD,SP,ISR的計算比較麻煩。GCD根據ISN計算。ISR,SP都根據GCD計算。
下面的截圖是6個tcpsyn包中的ISN
TI會檢查響應的IP頭ID字段,必須至少收到三個響應才能包含測試,如果ID字段值都是0的話,則為Z在2007,2010,2013,2016,2019,2022數據包中的IP頭部ID字段均為0
所以在TI的值為Z
TS是根據SEQ探測的響應中的TCP時間戳選項,它檢查TSval(選項的前四個字節)
如果時間戳選項值不為0,還需計算,比較麻煩,根據計算結果再賦TS值為1或7或8
從數據包中,以2007為例,可以知道TS值為1或7或8
下一行OPS包含為每個探測器接收的TCPoption(測試名稱為O1到O6)。
按照順序來,即2007為O1,2010位O2...
以2007為例來分析
它對應的字符串是M5B4ST11NW7:
M代表Maximumsegment size,1460的16進制為5B4;
S代表SackPermitted
T代表Timestamp,如果TSval,TSecr都不是0,則為11
N代表NOP
W代表Windowscale,大小為7
O2-O6以此類推
WIN行包含response的windowsize(名為W1到W6)。
以2013為例
Windowsize為28960
與這些探測器相關的最后一行T1包含packet#1的各種測試值。這些結果用于R,DF,T,TG,W,S,A,F,O,RD和Q測試。這些測試僅針對第一個探針報告,因為它們對于每個探針幾乎總是相同的
R表示目標是否有響應,有響應則為Y
DF表示禁止路由器分段數據包的位是否置位,若置位則為Y,從下圖可以看出已置位
T表示初始TTL,下圖可以看到T應為39
TG為猜測的初始TTL值,如果發現實際TTL值,則不會打印該字段
S檢查TCP報頭中的32位序列號字段,與引發響應的探測中的TCP確認號進行比較。然后它記錄適當的值。下圖可以看到sequencenumber為0,所以S的值為Z
A測試響應中的確認號acknowledgementnumber與相應探測中的序列號的比較
下圖中可以看到2017的acknowledgementnumber為1,2016中的sequencenumber 為0,0+1=1,即2017的acknowledgementnumber等于2016的sequencenumber+1
所以A的值為S+
F記錄響應中的tcpflag
下圖以2017為例,flags中A和S置位,所以F的值為AS
RD是針對reset包的數據做校驗和的結果,如果沒數據或沒校驗或校驗和無效,則為0
下圖可以看出是沒校驗,RD值為0
Q主要針對兩處:一處是tcpheader的保留字段非0,如果出現則Q中記錄“R”
另一處是沒設置URGflag時,存在非零的URG指針字段
上圖可以看出都不存在,所以Q為空
Emm,好累啊,抓包分析就是這么個情況,照著懟就完事了
直接下結論吧:
Nmap是開源世界里主動識別遠程主機指紋最強的大佬。
關于Nmap是如何識別主機指紋的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。