Nmap支援的TCP / IP 系統指紋識別方法
譯者(google翻譯+人工校對):@戲言戲名
Nmap初學者,發現官網這篇文件竟然沒有翻譯,就自己來翻了,這裡說的各種測試的結果,對應nmap裡面自帶的一個系統指紋資料庫nmap-os-db中的每一項,裝好nmap後可以自己去找找看。這裡英語很渣,翻譯內容正確性完全不負責,不過發現問題歡迎聯絡我修改(估計我也理解錯了),本翻譯僅做個人學習使用,隨便看看就好: )
Nmap OS指紋識別的工作原理是向目標機器的已知開啟或關閉埠傳送最多16個TCP,UDP和ICMP探測報文。這些探測報文專門利用了標準協議RFC中的各種模糊地帶,然後根據Nmap偵聽到的目標機器響應結果,分析並組合這些響應回來的報文中的特徵屬性以生成指紋。如果沒有得到響應,則每個探測包都會被跟蹤並重新發送一次。所有這些資料包都是具有隨機IP ID值的IPv4資料報文。如果未找到開放的埠,Nmap會跳過對開放的TCP埠的探測。而後Nmap會先檢查是否找到了一個確認關閉的TCP或UDP埠。如果還沒有,Nmap將隨機選擇一個埠並希望獲得最佳效果。
以下部分介紹技術性很高,揭示了Nmap OS檢測隱藏在內部的工作方式。Nmap工具本身可以在不理解這一點的情況下有效使用,不過該材料可以幫助您更好地理解遠端網路,還有今後檢測和解釋某些異常情況。此外,這裡有些技術非常巧妙,比較好奇的讀者可以跳到“處理錯誤識別和不明身份的主機”那一節(https://nmap.org/book/osdetect-unidentified.html) 。但是對於那些準備好來系統的瞭解一下TCP顯式擁塞通知,UDP頭部保留的位元,初始序列號,偽造標誌和聖誕樹包的人來說,請繼續閱讀下去!
即使我們中厲害的人,有時也會忘記資料包頭部中欄位和標誌的位元組偏移量。 有關這些的快速查閱,可在“TCP / IP參考”一節中找到IPv4、TCP、UDP和ICMP的頭部佈局(
一、 傳送的探測報文
本節介紹Nmap向每個所探測的IP傳送的一系列探測報文,作為構建TCP / IP系統指紋識別的一部分。它具體來說指的是Nmap做的響應測試和TCP選項測試,這些將在下一節中介紹。
1. 序列生成測試(SEQ,OPS,WIN和T1)
Nmap會發送一系列六個TCP探測報文以生成這四個測試的響應結果。探測報文的時間間隔為精確的100ms,因此傳送的總時間為500ms。這裡確切的時序是非常重要的,因為我們檢測中用到的一些序列演算法(初始序列號,IP ID和TCP時間戳)都是與時間密切相關的。 這裡總時間被選擇為500ms,以便我們可靠地檢測常見的2 Hz TCP時間戳序列。
每個探測都是傳送TCP SYN資料包到遠端計算機上已檢測到的開放埠的。序列和確認號是隨機的(但每一個的情況都會被保留,因此Nmap可以區分每一個的響應)。檢測的精度要求探測報文的一致性,因此即使使用者主動使用–data-length請求,資料報文中也不會有有效的資料負載。
這些資料包在TCP選項中有很多不同的使用方式,還有不同的TCP視窗大小值。 以下列表提供了六個資料包的具體選項和值。 列出的視窗大小的值並不會反映視窗縮放的值。EOL是TCP選項結束符,預設情況下許多嗅探工具都不會顯示。
包#1:視窗縮放(10),NOP,MSS(1460),時間戳(TSval:0xFFFFFFFF; TSecr:0),允許SACK。 視窗大小為1。
包#2: MSS(1400),視窗縮放(0),允許SACK,時間戳(TSval:0xFFFFFFFF; TSecr:0),EOL。 視窗大小為63。
包#3:時間戳(TSval:0xFFFFFFFF; TSecr:0),NOP,NOP,視窗縮放(5),NOP,MSS(640)。 視窗大小為4。
包#4:允許SACK,時間戳(TSval:0xFFFFFFFF; TSecr:0),視窗縮放(10),EOL。 視窗大小為4。
包#5: MSS(536),允許SACK,時間戳(TSval:0xFFFFFFFF; TSecr:0),視窗縮放(10),EOL。 視窗大小是16。
包#6: MSS(265),允許SACK,時間戳(TSval:0xFFFFFFFF; TSecr:0)。 視窗大小是512。
這些測試的結果包括四個類別。 第一個SEQ探測包含基於探測包的序列分析的結果,測試結果表現為GCD,SP,ISR,TI,II,TS和SS的數值。下一個OPS測試包含每個探測報文對應響應結果的TCP選項(測試名稱為O1到06)。同理,WIN測試包含響應的視窗大小(名為W1到W6)。與這些探測報文相關的最後一項T1,包含對資料包#1的響應的各種測試值,這些結果決定R,DF,T,TG,W,S,A,F,O,RD和Q的測試值。而這項T1測試僅針對第一個探測報文報告,因為它們對於接下來每個探測報文的反應總是幾乎完全相同的。
2. ICMP響應測試(IE)
IE測試會發送兩個ICMP響應請求資料包到目標。 第一個的IP DF位會置位,服務型別(TOS) 位元組值為0,程式碼為9(即使它應該為0),序列號為295, IP ID和ICMP請求識別符號隨機,以及120位元組的0x00用於資料有效載荷。
第二個ping詢問也類似,除了使用四個TOS( IP_TOS_RELIABILITY ),程式碼為零,傳送150個位元組的資料,並且ICMP請求識別符號和序列號也從先前的值加1。
將這兩種探測報文的響應,組合為R,DFI,T,TG和CD的測試結果。只有兩個探測報文都引出響應,R值才為真(Y)。 T和CD值僅來自第一個探測的響應結果,因為兩次的結果會完全一致。 DFI是針對特殊的雙探測報文ICMP外殼的定製測試。
3. TCP顯式擁塞通知測試(ECN)
此探測是測試目標TCP棧中是否支援顯式擁塞通知(ECN)的。 ECN是一種通過允許路由器在開始丟棄資料包之前發出擁塞問題,來提高網際網路效能的方法。 它記錄在RFC 3168(http://www.rfc-editor.org/rfc/rfc3168.txt) 中。Nmap通過傳送一個SYN資料包對此進行測試,該資料包設定了ECN、CWR和ECE擁塞控制標誌。對於不相關(到ECN)測試,即使未設定緊急標誌,也使用0xF7F5的緊急欄位值,確認號為0,序列號隨機,視窗大小為3,並且緊接在CWR位之前的保留位被置位。 TCP選項是:視窗縮放(10),NOP,MSS(1460),允許SACK,NOP,NOP,探測報文被髮送到開放埠。
如果收到響應,則記錄R,DF,T,TG,W,O,CC和Q的測試值。
4. TCP測試(T2 - T7)
T2到T7測試每個會發送一個TCP探測包。除了有一個例外,其他包的TCP選項資料都是(十六進位制) 03030A0102040109080AFFFFFFFF000000000402。這20個位元組對應於:視窗縮放(10),NOP,MSS(265),時間戳(TSval:0xFFFFFFFF; TSecr:0),然後允許SACK。 這裡例外的情況是指T7使用的視窗縮放為15而不是10。每個探測報文的變數特徵如下所述:
T2傳送一個TCP空(無標誌設定< NONE>)資料包,其中IP DF置位,視窗大小為128,傳送到開放埠。
T3傳送一個TCP SYN,FIN,URG和PSH標誌置位資料包,其中IP DF未置位,視窗大小為256,傳送到開放埠。
T4傳送一個TCP ACK資料包,其中IP DF置位,視窗大小為1024,傳送到開放埠。
T5傳送一個TCP SYN資料包,其中IP DF未置位,視窗大小為31337,傳送到關閉埠。
T6傳送一個TCP ACK資料包,其中IP DF置位,視窗大小為32768,傳送到關閉埠。
T7傳送一個TCP FIN,URG和PSH標誌置位資料包,其中IP DF未置位,視窗大小為65535,傳送到關閉埠。
在每種情況下,將每一次的結果新增到指紋中,其結果為R,DF,T,TG,W,S,A,F,O,RD和Q的測試值。
5. UDP測試(U1)
此探測傳送一個UDP資料包到關閉埠。 其中的資料欄位,是字元“C”(0x43)重複300次。 對於允許我們設定此操作的作業系統,IP ID值會被設定為0x1042。 如果埠真的關閉了並且沒有防火牆,則Nmap期望收到ICMP埠不可達訊息作為回覆。然後該響應結果為R,DF,T,TG,IPL,UN,RIPL,RID,RIPCK,RUCK和RUD的測試值。
二、響應結果的測試值
上一節描述了Nmap傳送的探測報文,而這一部分將描述這些探測報文響應的結果相關的引數,來完成接下來部分的分析。簡寫符號(例如DF,R和RIPCK)是nmap-os-db 指紋資料庫使用的符號,用以節省空間。除非另有說明,否則所有數值測試值均以十六進位制表示法給出,不帶前面的0x。介紹測試的值的順序大致按照它們在指紋中出現的順序。
1. TCP ISN最大公約數(GCD)
SEQ測試會將六個TCP SYN資料包傳送到目標機器的開放埠,並回收應答的SYN / ACK資料包。 這些SYN / ACK分組中的每一個包含32位初始序列號(ISN)。 此測試目的是嘗試確定目標主機增加這些值的最小增量。例如,許多主機(尤其是舊主機)總是以64000的倍數遞增ISN。
計算此問題的第一步是在探測響應之間建立一系列差異。 第一個差值是第一和第二探測響應ISN之間的差異。 第二個差值是第二個和第三個響應之間的差異。 如果Nmap回收到對所有六個探測的響應,則會有五個差值構成一個數組。由於接下來的幾個測試的值也使用了這個陣列,我們接下來將其稱為diff1。如果後來的報文的ISN低於它的前一個,則Nmap會記算從第一個值中減去第二個值的大小,或第二個值減去第一個值,對比這兩個值中較小的一個儲存在diff1陣列中(譯者:這裡翻譯的有點不清楚…意思大概是可以迴圈計算差值,實際計算的方法自己看接下來的例子)。因此0x20000後跟0x15000之間的差值是0xB000。 0xFFFFFF00和0xC000之間的差值是0xC0FF。 最後,該測試值記錄所有這些差值的最大公約數。該GCD值也用於計算接下來的SP的結果。
2. TCP ISN計數率(ISR)
此值反應返回的報文中TCP初始序列號的平均增長率。 回想一下,每兩個連續的探測響應之間存在差異,這差值儲存在先前討論的diff1陣列中。 這些差異除以傳送產生它們的兩個探測報文之間經過的時間之差(以秒為單位 - 通常約為0.1)。 結果也將是一個數組,我們稱之為seq_rates,其中就含有每秒ISN計數器增加的速率資訊。該陣列對diff1陣列中每個值都有一個對應值。我們接下來取該陣列值的平均值,如果該平均值小於1(例如,系統使用恆定的ISN),則記錄ISR為0。否則,ISR是計算該平均值的二進位制對數再乘以8的值,這裡要四捨五入到最接近的整數。
3. TCP ISN序列可預測性指數(SP)
前面ISR測試測量的是初始序列號增量的平均速率,而SP值測量的是ISN的可變性。它會粗略估計從六個探測響應的已知序列,來分析預測下一個ISN值的困難程度。計算時要使用上一小節中討論的差異陣列(seq_rates)和GCD值。並且我們只有在看到至少四個響應時才執行此測試。 如果先前計算的GCD值大於9,則用先前計算的seq_rates陣列的每個值除以該GCD值。我們不用較小的GCD值進行除法,因為這些值通常是偶然引起的。 然後獲得所得值的陣列的標準偏差。如果結果為1或更小,則SP取0。否則,計算結果的二進位制對數,然後將其乘以8,四捨五入到最接近的整數,儲存為SP的值 。
請記住,此測試僅用於OS檢測目的,並不能作為對目標ISN生成器的全面稽核分析。即使SP值很高,也有會許多演算法缺陷導致ISN易於預測。
4. IP ID序列生成演算法(TI,CI,II)
這三個測試會檢查響應的IP頭ID欄位。TI基於對TCP SEQ探測的響應。CI基於對傳送到關閉埠的三個TCP探測的響應:T5,T6和T7。(譯者:前面出現了這三個探測報文,自己去翻一下)II基於ICMP對兩個IE ping探測報文的響應。對於TI ,必須至少收到三個響應才能有測試結果。對於CI,至少需要兩個響應。對於II,必須收到對應的ICMP響應。
對於這其中每一個測試,目標的IP ID生成演算法會基於以下規則進行分類。需要注意這些測試值之間的細微差別。請注意,該差值假定計數器可以迴圈。因此,如果IP ID為65,100後面跟著的IP ID值是700的話,它們之間的差值為1136。 如果2000之後跟的是1100的話,之間的差值是64636。以下是測試值規則:
如果所有IP ID號都為零,則測試值為Z。
如果IP ID序列增量大於等於20000,則測試值為RD(隨機)。II不可能是這個結果,因為沒有足夠的樣本來支援它。
如果所有IP ID都相同,則將測試值設定為十六進位制的該值。
如果任何兩個連續響應之間的ID差值超過1000,且不能被256整除,則測試的值為RI(隨機正增量)。如果差值可以被256整除,則必須至少為256000才能產生此RI結果。
如果所有差值都可以被256整除並且不大於5120,則將測試設定為BI(遞增增量)。 這種情況會發生在Microsoft Windows等系統上,其中IP ID以主機位元組順序而不是網路位元組順序傳送。它能夠正常工作並且沒有違反任何型別的RFC規則,儘管它確實洩露了對攻擊者有用的主機架構細節。
如果所有差值都小於10,則值為I(增量)。我們允許這裡差值大小達到10(而不是需要所有的都完全按順序增量排序),因為可能有來自其他主機的流量導致序列間隙。
如果前面的規則都沒有識別生成演算法的測試結果,則從指紋中省略該測試。
5. 共享IP ID序列布爾值(SS)
此布林值記錄目標是否在TCP和ICMP協議之間共享其IP ID序列。 如果我們的六個TCP IP ID值是117,118,119,120,121和122,而我們的ICMP結果是123和124,很明顯,這兩個序列不僅是遞增的,而且它們都是相同序列的一部分。 另一方面,如果TCP IP ID值是117-122但ICMP值是32917和32918,則說明使用了兩個不同的序列。
這裡僅當II和TI為RI,BI或I且二者相同時才進行此測試。如果進行SS測試,則如果序列被共享則結果為S,如果不共享則結果為O(其他)。該測試以以下規則進行:
令avg為最後一個TCP序列測試報文響應的IP ID減去第一個TCP序列測試報文響應的IP ID,再除以之間探測報文數的差值。 如果探測報文#1的響應的IP ID為10,000而探測器#6的響應為20,000,則avg為(20,000 - 10,000)/(6 - 1),等於2,000。
如果第一個ICMP迴應響應的IP ID小於最後一個TCP序列響應的IP ID加上該avg的三倍,則SS測試結果為S,否則就是O。
6. TCP時間戳選項演算法(TS)
TS是另一個測試,根據生成一系列數字的方式確定目標作業系統特徵。 這個測試檢視TCP SEQ探測的響應中的TCP時間戳選項(如果有的話)。它檢查的是TSval(選項的前四個位元組)而不是回顯的TSecr(最後四個位元組)值。取每個連續TSval之間的差值,併除以Nmap傳送兩個探測報文之間,響應經過的時間。 其結果值給出了每秒時間戳增量的速率。Nmap會計算所有連續探測報文的時間戳每秒平均增量,然後按如下方式計算TS :
如果任何響應都沒有時間戳選項,則TS設定為U(不支援)。
如果任何時間戳值為0,則TS設定為0。
如果每秒的平均增量落在0-5.66或150-350的範圍內,則TS設定為1,7或8。 這三個範圍會被特殊處理,是因為它們對應於許多主機使用的2 Hz,100 Hz和200 Hz頻率。
在所有其他情況下,Nmap記錄每秒平均增量的二進位制對數,四捨五入到最接近的整數。由於大多數主機使用1,000 Hz頻率,因此A也是常見結果。
7. TCP選項(O,O1–O6)
此測試記錄資料包中的TCP頭部選項欄位(TCP option)的情況。它保留了其中的原始順序,並提供了有關選項值的一些資訊。 由於RFC 793中不需要我們有任何特定的排序,因此不同系統對這裡的實現通常會提供獨特的順序。 有些平臺沒有實現所有選項(沒問題,它們本來就是可選的)。 當您將所有這些不同的實現順序,與對不同選項值使用的數量都組合在一起時,此測試就提供了一個真實有效的資訊庫。此測試的值是表示正在使用選項的字元。有幾個選項會在其後面立即生成相關引數。這裡支援的選項和引數都顯示在表8.1中。
表8.1 O的測試值 選項名稱 字元 引數(如果有的話) 選項部分結束符(EOL) L 無操作(NOP) N 最大段大小(MSS) M 附加引數值,許多系統會回顯相應探測中使用的值。 視窗縮放(WS) W 附加實際引數值。 時間戳(TS) T 後面跟著兩個二進位制字元,分別代表TSval和TSecr值。 如果欄位為零,則字元為0,否則為1。 允許選擇性ACK(SACK) S
例如,字串M5B4NW3NNT11表示該資料包包含MSS選項(值0x5B4),後跟一個NOP。接下來是一個視窗縮放選項,其值為3,然後是兩個NOP。 最後一個選項是時間戳,它的兩個欄位都不為零。 如果響應中沒有TCP選項,則測試仍然存在,但值字串將為空。如果未響應探測報文,則省略該測試。
雖然此測試通常命名為O,但會發送六個探測報文生成一個序列,這只是一種特殊的處理方式。(譯者:這裡需要多說一句,這句話的意思就是隻是因為ops可以和seq一起測試,不用自己在單獨發包,所以…就記錄六個了(因為seq發了六個包),下面的w測試同理,這三個測試都用的是同樣的六個包的響應)這些測試被插入到特殊的OPS測試組中,並採用名稱O1到O6來區分它們所涉及的探測包。“O”代表“選項”。儘管名稱序號不同,但每個測試O1到O6的處理方式都完全相同。
8. TCP初始視窗大小(W,W1 - W6)
此測試僅記錄接收資料包的16位TCP視窗大小。它非常有效,因為有超過80個值已知至少會由某一個OS傳送。但不利的一面是,某些OS本身就具有十幾種可能的值。在我們完全收集作業系統使用的所有可能的視窗大小之前,這可能會導致錯誤的判斷結果。
雖然此測試通常命名為W ,但會發送六個探測報文生成一個序列,這只是一種特殊的處理方式。 這些測試被插到特殊的WIN測試組中,並取名為W1到W6。 所有序列號探測報文的響應都會有記錄的視窗大小,因為它們在TCP MSS選項值上有所不同,這會導致有些作業系統回顯不同的視窗大小。儘管名稱序號不同,但每個測試W1到W6的處理方式都完全相同。
9. 響應能力(R)
此測試僅記錄目標是否響應我們給定的探測報文。 可能的值為Y和N 如果沒有響應(N),則省略測試的其他欄位。(譯者:響應都沒有就不用提接下來的分析了。)
此測試的風險是探測報文可能被防火牆丟棄,這必然導致在指紋中的R=N。然而,如果目標OS對該項測試能夠正常回復,則nmap-os-db中該系統的參考指紋是有R=Y的。這裡說明了防火牆可能會阻止正確的OS檢測結果。為了減少這個問題,參考用的指紋通常省略了IE和U1探測報文的R=Y測試,因為這些探測報文是最可能被丟棄的。此外,如果Nmap對目標缺少確定的關閉TCP埠,即使它去嘗試的埠沒有任何響應,它也不會將T5,T6或T7測試的結果設定為R=N,畢竟缺少一個確定關閉的埠可能是因為它們都被過濾掉了。
10. IP不分段(DF)
IP報頭包含一個可以禁止路由器將資料包分段的位。這表示如果資料包對於路由器來說太大而無法處理,則只需要丟棄它(理想情況下會返回“目標無法到達,需要分段”響應)。如果該位置位,則該測試記錄Y,否則則記錄N。
11. ICMP不分段(DFI)
這只是用於特殊IE探測報文的DF測試修改版。它比較了傳送的兩個ICMP回送請求探測報文的do not fragment(不分段)位的結果。它有四個可能的值,在表8.2中列舉了。
表8.2 DFI測試值 值 描述 N 兩個ping響應都沒有設定DF位。 S 兩個響應都回顯探測報文的DF值。 Y 兩個響應DF位都已置位。 O 兩個響應都有DF位切換。(和S的情況相反)
12. IP初始生存時間(T)
IP資料包包含一個名為生存時間(TTL)的欄位,該欄位在每次遍歷路由器時遞減。 如果欄位達到零,則必須丟棄該資料包。 這可以防止資料包無休止地在網路中迴圈。由於作業系統的起始TTL值不同,因此該值可用於OS檢測。Nmap通過檢查對U1探測報文對應的ICMP埠不可達響應來確定它與目標的跳數。 該響應包含目標接收的原始IP報文,還有已經減少的TTL欄位。通過從我們傳送的TTL中減去該值,我們可以瞭解機器到達的位置的跳數。 Nmap然後不斷新增距離去探測能有響應時的TTL值,以確定對方傳送ICMP探測響應資料包時的初始TTL。(譯者:這裡有點迷糊,我的理解是接近於traceroute的方式?)該初始TTL值作為T結果儲存在指紋中。
儘管像TTL這樣的8位欄位永遠不會產生大於0xFF的值,但此測試偶爾會使值為0x100或更高。當系統(可能是源,目標或其間的系統)損壞或以其他方式無法正確遞減TTL時,就會發生這種情況。它也可能由於不對稱的路線而發生。
當跳數距離為0(本地主機掃描)或為1(在同一網段上)時,Nmap還可以從系統介面和路由表中直接學習。這裡當Nmap顯示使用者的跳距時會使用此值,但不用於T結果計算。
13. IP初始生存時間猜測(TG)
Nmap沒有接收到對U1探測報文的響應的情況並不罕見,這會阻止Nmap瞭解到目標的跳數。防火牆和NAT裝置傾向於阻止未經請求的UDP資料包。但是由於常見的TTL值分散得很遠,目標很少和某個對應的值差距超過20跳,所以無論如何Nmap都可以做出相當不錯的猜測。大多數系統會發送初始TTL為32,60,64,128或255的資料包。因此,會將響應中收到的TTL值向上取為32,64,128或255。60不在這個清單裡因為它無法明顯地與64區分開來…總而言之它很少見。結果猜測會儲存在TG欄位中。不過如果能獲得實際TTL(T)值,則不會在系統指紋中顯示此TTL猜測欄位。
14. 顯式擁塞通知(CC)
該測試僅用於ECN探測報文。該探測是一個SYN資料包,含有CWR和ECE擁塞控制標誌。當接收到響應SYN / ACK時,會檢查那些標誌以得到CC(擁塞控制)的測試值,如表8.3所述。
表8.3 CC測試值 值 描述 Y 僅置位ECE(沒有置位CWR),該主機支援ECN。 N 這兩個位都沒有置位,目標不支援ECN。 S 兩個位都已置位,目標不支援ECN,但它迴應了它認為是保留位的內容。 O 這兩個位的其餘組合(其他)。
15. TCP雜項傾向(Q)
該項測試檢查在TCP棧中的一些實現的兩個可能傾向。 第一個是TCP頭部中的保留欄位(在頭部長度項之後)非零。 這很有可能發生在ECN測試中,因為它在探測中設定了保留位。 如果在資料包中看到這種情況,則在Q測試值中記錄“R”。
當未設定URG標誌時,另一個是對於非零緊急指標欄位值。這也是很有可能在ECN探測報文響應中看到的,該探測報文設定非零緊急場。當看到這一點時,在Q字串上附加“U”。
必須始終按字母順序生成Q字串。 如果沒有傾向,則Q測試為空但仍然顯示。
16. TCP序列號(S)
此測試檢查TCP頭部中的32位序列號欄位。 它不是像其他測試那樣記錄欄位值,而是檢查它與引發響應的探測報文的TCP確認號的比較情況。然後它根據結果記錄適當的值,如表8.4所示。
表8.4 S測試值 值 描述 Z 序列號為0。 A 序列號與探測報文中的確認號相同。 A+ 序列號是探測報文中的確認號加1。 O 序列號是別的(其他)。
17. TCP確認號(A)
此測試與S相同,不同之處在於它測試響應中的確認號與相應探測報文中的序列號的比較情況。表8.5給出了四個可能的值。
表8.5 A測試值 值 描述 Z 確認號為0。 S 確認號與探測報文中的序列號相同。 S+ 確認號是探測報文中的序列號加1。 O 確認號是別的(其他)。
18. TCP標誌( F )
該欄位記錄響應中的TCP標誌位。每個字母代表一個標誌,它們的出現順序需要與TCP資料包中的順序相同(從左側的高位到低位)。例如,值AS表示ACK和SYN位置位,而值SA是非法的(錯誤的順序)。可能的標誌如表8.6所示。
表8.6 F測試值 字元 標誌名稱 標誌位元組值 E 阻塞標誌(ECE) 64 U 緊急標誌(URG) 32 A 確認標誌(ACK) 16 P 推標誌(PSH) 8 R 重置標誌(RST) 4 S 同步標誌(SYN) 2 F 結束標誌(FIN) 1
19. TCP RST資料校驗和(RD)
某些作業系統會返回ASCII碼資料,例如重置(RST)資料包中的錯誤訊息。RFC 1122中的4.2.2.12節明確允許這樣做。而當Nmap遇到此類資料時,它會執行CRC32校驗和並報告結果。 當這裡沒有資料時,RD設定為0。可能在其重置資料包中返回資料的少數幾個作業系統是HP-UX和Mac OS X之前的Mac OS版本。
20. IP總長度(IPL)
此測試記錄IP資料包的總長度(以8位位元組為單位)。它僅使用U1測試引發的埠不可達響應。 該長度因實際實現情況而不同,因為只要它們最低滿足RFC 1122的要求,就可以選擇原始探測報文中包含的資料量。這個要求是包括原始IP頭部和至少8個位元組長的資料。
21. 未使用的埠不可達欄位非零(UN)
ICMP埠不可達訊息頭長度為8個位元組,但僅使用前4個。RFC 792規定最後4個位元組必須為0。 一些機器對它的實現(主要是乙太網交換機和一些專門的嵌入式裝置)無論如何設定,最後4個位元組的值都會記錄在該欄位中。
22. 返回的探測報文中的IP總長度值(RIPL)
ICMP埠不可達訊息(為響應U1探測報文而傳送)需要包含使它們生成的報文的IP頭部。 此頭部應該在收到它時返回,但是由於在對IP處理期間所做的更改,某些情況會發回一個損壞的版本。 此測試僅記錄返回的IP總長度值。 如果返回正確的值0x148(328),則儲存值G(表明頭部是好的)而不是實際值。
23. 返回的探測報文中的IP ID值(RID)
U1探測報文的靜態IP ID值為0x1042。如果在埠不可達訊息中返回該值,則為該測試值為G。否則,該測試值將為返回的確切值。某些系統(如Solaris)會處理Nmap傳送的原始IP資料包的IP ID值。在這種情況下,將跳過此測試。我們發現某些系統,特別是HP和Xerox印表機,會翻轉位元組並返回0x4210。
24. 返回的探測報文中的IP校驗和值的完整性(RIPCK)
IP校驗和是我們不期望在埠無法訪問的訊息返回時保持不變的一個值。 畢竟,傳輸過程中的每一跳都會隨著TTL的減少而改變校驗和。但是,我們收到的校驗和應與封閉的IP資料包內容匹配。如果是,則該測試值G為(良好)。如果返回值為0,則為Z,否則結果是I(無效)。
25. 返回的探測報文中的UDP校驗和值的完整性(RUCK)
UDP報頭校驗和的值應該與傳送時完全一樣。如果是,則記錄該測試值為G,否則記錄實際返回的值。
26. 返回的UDP資料的完整性(RUD)
此測試檢查(可能是截斷的)返回的UDP有效負載的完整性。如果所有有效載荷位元組都是預期的’C’(0x43),或者如果有效載荷被截斷為零長度,則記錄G ; 否則,I(無效)將被記錄下來。
27. ICMP響應程式碼(CD)
ICMP迴應答覆(型別0)資料包的程式碼值應該為0。但是一些實現錯誤地傳送了其他值,特別是如果應答請求具有非0程式碼(如IE測試之一那樣)。兩個探測報文的響應程式碼值會組合得成一個CD值,如表8.7所示。
表8.7 CD測試值 值 描述 Z 兩個程式碼值均為零。 S 兩個程式碼值都與相應的探測報文中的相同。 < NN> 當它們都使用相同的非零數字時,會顯示在這裡。 O 任何其他組合。