由 TCP/IP 堆疊的指紋辨識技術偵測遠端作業系統
            
            by Fyodor <[email protected]> (insecure.org)
                           October 18, 1998


概述

這篇論文討論如何利用查詢 TCP/IP 堆疊來收集關於一台主機的珍貴資料. 首
先介紹一些 " 古典的 " 方法來辨識一台主機的作業系統, 這並不包含 TCP/IP
堆疊的 " 指紋 " 辨識 (註一 ). 然後我會說明目前最新式的指紋辨識工具.
接下來會解釋有許多技術能讓一台遠端主機洩漏關於他自己的資訊. 最後我會詳
細描述我關於這的實作 (nmap), 附上一個從 nmap 來的快照, 揭露了許多受歡
迎的網站所使用的作業系統.


原因

我想偵測執行中的作業系統的用處是顯而易見的, 所以這一段將會很短. 最明顯
的用處, 舉例來說, 就是有許多安全漏洞是跟作業系統版本相依的. 假定你做了
一個侵入式的測試, 然後發現了 port 53 是開啟的. 如果這是一個有弱點的
Bind, 你只有一次攻擊的機會, 如果失敗就會造成這個服務無法運作. 用一個好
的 TCP/IP 的指紋辨識工具, 你可以很快的發現這台機器正在執行 'Solaris
2.51' 或 'Linux 2.0.35' 然後你可以據此調整你使用的 shellcode.

比較糟糕的情況是, 如果有人掃描了 500,000 台主機, 去觀測它們執行何種作業
系統和開啟的通訊埠. 此時 (舉例來說) 有個可取得管理者權限的漏洞發生在
Sun 的 comsat 服務, 我們的小怪客就可以簡單的檢索列表中有 'UDP/512' 和
'Solaris 2.6' 的主機並立刻擁有一頁接著一頁可以取得管理者權限的機器了.
這是典型的 SCRIPT KIDDIE 行為. 你證明了不須要什麼技巧而且沒有幾個人記得
你能夠找出一些沒有及時更新漏洞的.edu 主機, 同樣的, 也很少有人記得你曾經
發現一個新的漏洞, 篡改系上網頁並自誇的叫著你有多強和管理者有多笨.

另外一個可能的用途是進行社會工程. 假設你掃描你的目標公司, nmap 回報了
'Datavoice TxPORT PRISM 3000 T1 CSU/DSU 6.22/2.06'. 那你現在可以假裝
'Datavoice support' 打電話給他討論關於他們的 PRISM 3000. " 我們很快的
將要公佈一個安全性漏洞, 但是我們想要先讓我們所有的顧客安裝修正程式 -- 
我已經將它寄給你了..." 有些天真的管理員也許會假設只有 Datavoice 確認的
工程師才會知道這麼多關於他們的 CSU/DSU.

另外一個可能的用途是用來評估你想跟他做生意的公司的實力. 在你選擇新的
ISP 之前, 掃描他們所使用的設備. 如果他們使用一些彆腳的路由器和一堆
Windows 機器提供 PPP 服務, 那 "$99/ 年 " 的交易可能就不大划算了.


經典技術

TCP/IP 堆疊的指紋辨識提供了一個獨一無二的方法解決作業系統辨識的問題. 
我想這個技術有很高的可信度. 但是現在有許多方法可以辨識作業系統. 不幸的
是,下面這仍然是其中一個最有效的方法:

playground~> telnet hpux.u-aizu.ac.jp
Trying 163.143.103.12...
Connected to hpux.u-aizu.ac.jp.
Escape character is '^]'.

HP-UX hpux B.10.01 A 9000/715 (ttyp2)

login: 

如果一台機器炫耀的向全世界宣告這台機器上跑的是什麼, 那在辨識上也是完全
毫無疑問的. 不幸的是, 許多廠商提供現行的系統伴隨著這些標誌, 而許多管理
員更沒有把它關掉. 不因為有其他的方法可以辨識作業系統 (像是指紋辨識 ),
我們就應該公佈我們的作業系統和架構給每一個想連上來的笨蛋.

一個關於這個方法的問題是, 有越來越多的人將標誌關掉, 許多系統並不給予那
麼多的資訊, 還有少數人在標誌中作假. 有總比沒有好, 從標誌讀取得到的作業
系統和版本檢查是你花了數千美元在商業版本的 ISS 掃描器上所有能得到的. 
下載 nmap 或 queso 取代它, 還可以省下你的鈔票.

即使你把標誌關掉了, 當你要求時, 許多應用軟體仍然會很高興的給予這類的資
訊讓我們看看這個 FTP 伺服器:

payfonez> telnet ftp.netscape.com 21
Trying 207.200.74.26...
Connected to ftp.netscape.com.
Escape character is '^]'.
220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
SYST
215 UNIX Type: L8 Version: SUNOS

首先, 從預設的標誌中給了我們一些系統的細節. 然後我們給了 'SYST' 指令, 它
很高興的回應我們更多的資訊.

如果支援匿名 FTP, 我們通常可以下載 /bin/ls 或其他二進位檔來判斷它是建立
在哪種架構上的.

許多其他的應用程式對資訊控制太過鬆散, 拿個 Web 伺服器為例:

playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:' 
Server: Microsoft-IIS/4.0
playground>

嗯... 我很驚訝這些廢人在跑什麼作業系統.

其他古典的技巧包括像是 DNS 主機資訊記錄 (很少奏效 )和社會工程. 如果有台
機器在聆聽 161/udp (snmp), 你幾乎可以保證可以你可以用 CMU SNMP 工具集中
的 'snmpwalk' 以 'public' 當 community 的名稱來得到一大堆的資訊


現在的辨識軟體

Nmap 不是第一個利用 TCP/IP 指紋辨識的作業系統辨識軟體. Johan 的通用 IRC
欺騙軟體 sirc 從第三版 (或更早 )包含了非常初步的指紋辨識技術. 它利用幾
個簡單的 TCP 旗標測試企圖將主機分類為 "Linux""4.4BSD", "Win95", 或
"Unknown".

另一個類似的程式是 checkos, 由 Shok 在今年一月於 Confidence Remains
High Issue #7 中公開發表. 它的指紋辨識技術跟 SIRC 完全相同, 甚至連部份
的程式碼都完全一樣. Checkos 在公開發表之前已經在私底下流傳很久了. 所以
我不知道誰偷了誰的程式碼. 但兩者都沒提到對方對方. 另一點, checkos 加入
了 telnet 標誌擷取這個有用的功能, 不過它有它的問題, 就像前面提到的. [
更新 : Shok 寫道: ckeckos 從來沒打算公開發表, 這就是為什麼他沒有要求
SIRC 標明某些程式碼的來源.]

Suld 也寫了一個作業系統辨識軟體. 他的稱為 SS, 版本是 3.11, 她能辨識 12
種不同的作業系統. 我多少有點偏愛它, 因為它為了一些網路作業程式碼讚揚了
我的 nmap 程式 .:)

接下來是 queso. 這支程式是最新的, 而且與先前的程式比較是一個長足的進步.
不僅是包含了一些新的測試, 它也是第一個 (就我所知 )將作業系統 TCP/IP 指
紋辨識資料移出程式碼的程式. 其他的程式碼包含了像這樣的程式碼:

/* from ss */
if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) && 
   (flagsthree & TH_ACK))
       reportos(argv[2],argv[3],"Livingston Portmaster ComOS");

取得代之的是, queso 將這些移到了設定檔中, 明顯的加強了可擴充性, 並使得
加入新的作業系統指紋就像在設定檔中增加幾行文字一般的簡單.

Queso是由Savage撰寫, 他是 Apostols.org 菁英之一.

上述的軟體都有一個問題, 對 TCP/IP 堆疊的指紋測試數量太少以致於對於得到
的回答太過粗略. 我想要知道的就像是 ' 這台機器究竟是 OpenBSD, FreeBSD 或
是 NetBSD', 我希望可以精確的知道它是那一種, 甚至知道它的版本編號. 同樣
的, 我比較想看到 'Solaris 2.6' 而不是簡單的 'Solaris'. 為了完成這樣的精
確度 , 我使用了幾種 TCP/IP 堆疊指紋辨識技術, 會在下一節描述.


指紋辨識技術

有很多很多的方法可以辨識網路作業堆疊. 基本上你只要找尋在不同作業系統之
間的不同點, 然後寫程式去探測這些不同之處. 如果你結合了夠多的不同點. 你
就可以將作業系統緊緊的限制在很窄的範圍內. 舉例來說, nmap 能夠可靠的區別
Solaris 2.4, Solaris 2.5-2.51 和 Solaris 2.6. 它也可以告訴你 Linux 的核
心版本 2.0.30, 2.0.31-34 或是 2.0.35. 以下是用到的一些技術.

The FIN probe -- 我們送出一個 FIN 封包 (或是任何封包不包含 ACK 或 SYN
    旗標 )到一個開放的通訊埠, 然後等待一個回應. RFC793 規範的正確反應是
    不予回應. 但是許多亂七八糟的實作像是 MS Windows, BSDI, CISCO,
    HP/UX, MVS, 和 IRIX 會回應一個 RESET. 大多數現行的工具都使用這個技
    術.

The BOGUS flag probe -- Queso 是我見到的第一個使用這個聰明的測試的掃描
    器. 這個想法是在 SYN 封包的 TCP 標頭中設定一個未定義的 TCP " 旗標 "
    (64 或 128). Linux 直到 2.0.35 會在回應中保持這個旗標. 我沒有發現任
    何其他作業系統有這個臭蟲. 不論如何, 部份作業系統在收到 SYN+BOGUS 封
    包時似乎會重置連線. 這個行為對辨識它們是相當有用的.

TCP ISN Sampling -- 這個想法是當系統回應連線需求時找出選擇初始序號的模
    式. 這可以分為幾個分類像是傳統的 64K (很多老的 UNIX 機台 ), 隨機遞
    增 (新版的 Solaris, IRIX, FreeBSD, Digital UNIX, Cray 及其他很多種
    作業系統 )完全隨機 (Linux 2.0.*, OpenVMS, 新的 AIX 等等 ). Windows
    機台 (和其他少數 )使用 ' 依時間遞增 ' 的方式, ISN 會在每個時間週期
    中固定遞增. 不用說, 這跟幾乎跟古老的 64K 模式一樣容易打敗. 當然, 我
    最愛的技術是 " 常數 ". 這些機器 " 永遠 " 使用固定的 ISN:). 我在一些
    3Com 集線器 (使用 0x083) 和 Apple LaserWrite( 使用 0xC7001) 印表機
    上看到過.

    你也可以再做更細的子分類, 像是計算隨機增量, 最大公因數, 和其他能作
    用在設定序號上的數字以及這些數字的不同.

    在此必須提醒你 ISN 的產生隱含了重要的安全性. 要取得更多資訊, 在
    SDSC 找 " 安全專家 " Tsutomu "Shimmy" Shimomura, 問他如何得到這個結
    果. Nmap 是我所見到第一個使用這個技術在作業系統辨識上的軟體.
    
Don't Fragment bit -- 許多作業系統開始會在他們傳送的某些封包中設定
    "Don't Fragment" 位元. 這能獲得一些不同的效率上的好處 (這也可以是一
    個困擾 -- 這也就是為什麼 nmap 的 IP 封包分割掃描在 Solaris 機器上沒
    有作用的原因 ). 在任何狀況, 不是所有的作業系統都會這樣, 有些作業系
    統在其他的狀況下會有這種狀況 , 所以注意這個位元我們可以收集更多關於
    目標系統的資訊. 這個技術我以前也沒看過.

TCP Initial Window -- 這簡單的檢查返回的封包中設定的窗口大小. 在一些舊
    的掃描器使用非零的窗口大小來代表 " 源自 BSD 4.4". 新的掃描器像是
    queso 和 nmap 持續追蹤精確的窗口大小, 因為它實際上在不同的作業系統
    上是相當固定的. 這個測試實際上給予相當多的資訊, 因為有些作業系統可
    以只從窗口大小單獨的辨識出來 (舉例來說, AIX 是我看過唯一使用 0x3F25
    的作業系統 ). 在為 NT5 他們 " 完全重寫 " 的 TCP 堆疊中, 微軟使用
    0x402E. 有趣的是, 那是跟 OpenBSD 和 FreeBSD 所用的完全一樣.

ACK Value -- 即使你會想道這是一個完全的標準, 在某些狀況實作間的不同會讓
    ACK 欄位值不同. 舉例來說, 我們送出 FIN|PSH|URG 去關閉一個 TCP 通訊
    埠. 絕大多數的實作會將 ACK 設定跟你的初始序號相同, 可是 Windows 和
    一些愚蠢的印表機會送給你序號 +1. 如果你送 SYN|FIN|URG|PSH 去開啟一
    個通訊埠, Windows 是十分矛盾的 . 有時候會送回你的序號, 其他的時候會
    送給你序號 +1, 還有時候會送回看起來像是隨機的數值. 有人十分訝於微軟
    寫了什麼樣善變的程式碼.

ICMP Error Message Quenching -- 有些 (聰明的 )作業系統遵循 RFC 1812 的
    建議限制了不同的錯誤訊息的傳送率. 例如 Linux 核心 (在
    net/ipv4/icmp.h) 限制了 4 秒內只能有 80 個目的地無法抵達的訊息產生,
    當它超過了上限就會停止 1/4 秒. 有個方法可以測試這個, 就是送出一堆封
    包到隨機高位置的 UDP 通訊埠, 並計算有多少無法抵達的回應. 我沒有看過
    以前有誰用過這個技巧. 事實上我沒有將這個技術加到 nmap 裡 (除了使用
    UDP 埠掃描外 ). 這個測試會使得作業系統偵測多花一些時間, 因為你必須
    送出一堆封包並等待封包返回. 而且有可能會讓封包在網路上被丟棄 , 那是
    十分痛苦的.

ICMP Message Quoting -- RFC 文件規範了一個 ICMP 錯誤訊息包含幾個 ICMP
    錯誤訊息的原因. 對於一個通訊埠無法到達的訊息, 幾乎所有的實作都只傳
    回必要的 IP 標頭 +8 位元組. 然而 Solaris 傳回的多了一些, 而 Linux
    則傳回更多. 這能讓 nmap 優雅的辨識出 Linux 和 Solaris, 即使他們沒有
    開啟任何通訊埠.

ICMP Error message echoing integrity -- 我從 Theo De Raadt(OpenBSD 發展
   者的領袖 )在 comp.security.unix 新聞群組發表的一些東西得到這個想法.
   就像前面提到的, 機器必須送回你部份的原始訊息和通訊埠無法到達的錯誤訊
   息有些機器傾向在開始處理的時候使用你的標頭作為 ' 分割空間 ', 所以當
   取回的時候會有點被扭曲. 例如 AIX 和 BSDI 送回 IP' 總長 ' 欄位高出 20
   位元組. 有些 BSDI, FreeBSD, OpenBSD, ULTRIX 和 VAXen 會毀掉你送給它
   的 IP ID. 當總和檢查值因 TTL 的變化而改變時, 有些機器 (AIX, FreeBSD
   等等 )傳回了不一致或 0 總和檢查值. 相同的狀況發生在 UDP 的總和檢查.
   總的來說, nmap 在 ICMP 錯誤訊息上有九種不同的測試以監看像這樣細微的
   差別.

Type of Service -- 就 ICMP 通訊埠無法到達的訊息, 我觀察返回封包中服務形
   態 (TOS) 值. 在這個錯誤訊息中幾乎所有的實作都是使用 0, 但是 Linux 使
   用 0xC0. 這不代表一個標準的 TOS 值, 但是一個未使用 (就我所知 )的優先
   權欄位. 我不知道為什麼這個欄位被設定, 但是如果它被改成 0 我們就可以
   持續辨識舊版本, 而且我們就可以據此分辨新舊版本的不同.

Fragmentation Handling -- 這是 Secure Networks (現在變成有一堆 Windows
   使用者的 NAI) 公司的 Thomas H. Ptacek 最愛的技術. 這個方法從不同的實
   作對於處理重疊的 IP 片段不盡相同而得到好處. 有些會用新的將舊的覆蓋掉
   , 有些則是以舊的為優先. 有很多不同的探測方式可以知道封包如何重組. 我
   沒有將這個功能加入 namp, 自從我知道沒有可攜的方法去傳送 IP 片段 (特
   別是在可惡的 Solaris 上 )如果需要更多關於重疊片段的資訊, 你可以去讀
   IDS 的論文. (www.secnet.com).

TCP Options -- 這對洩漏資訊的探查來說是一個真正的金礦. 這些選項的漂亮之
    處:
    1)它們是很普遍的選項(duh!) :)所以所有的主機都會實作它們.
    2) 你可以傳送一個查詢去了解一台主機是否實作它們. 一般來說, 目標主機
      會在回覆中設定有支援的選項.
    3)你可以將一整堆的選項放在一個封包裡, 一次測試所有的項目.
   
    Nmap 在幾乎所有的探測封包中傳送這些選項.

    Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;

    當你得到回覆, 你再看看哪些選項被回覆, 那些就是有支援的選項. 有些作
    業系統像是最近的 FreeBSD 支援上述所有的選項, 有些像是 Linux 只支援
    很少數的幾種. 最新的 Linux 2.1.x 則支援上述所有的選項. 換句話說, 在
    TCP 序號預測上有更多的弱點. 去計算出來吧.

    即使只有幾種作業系統支援相同的選項集合. 你有時候還是可以藉由選項的
    _ 數值 _ 來分辨. 例如你傳送一個小的 MSS 數值給 Linux 機台, 它通常會
    傳送相同的 MSS 回來給你. 其他的主機會給你不同的數值.

    即使你得到相同的支援選項集合 _ 以及 _ 相同的數值, 你仍然可以經由選
    項的 _ 順序 _ 以及空位的填充來分辨. 例如 Solaris 返回 'NNTNWME' 表
    示:

    <no op><no op><timestamp><no op><window scale><echoed MSS>

    Linux 2.1.122 傳回 MENNTNW. 相同的選項, 相同的數值, 但是順序不同!

    我沒有看過其他的作業系統偵測工具利用 TCP 選項, 但它真的相當有用.

    還有一些有用的選項我可能會用在一些地方, 像是那些支援 T/TCP 和選擇性
    回應的系統.

Exploit Chronology -- 即使用上了所有上述的測試, nmap 仍然無法區別
    Win95, WinNT, Win98 的 TCP 堆疊. 這令人相當驚訝, 特別是 Win98 是在
    Win95 四年後才問世的. 你也許會想至少會有一些在 TCP 堆疊上的改進 (像
    是支援更多的 TCP 選項 )讓我們可以偵測到一些改變來判別作業系統. 不幸
    的是, 狀況並非如此. NT 的 TCP 堆疊顯然是跟放在 Win95 裡面那個丟人現
    眼的堆疊一樣. 而在 Win98 裡也沒有什麼改進.

    但不要放棄希望, 這裡有個解決方案. 你可以簡單的執行早期的 Windows 阻
    斷服務攻擊 (Ping of Death, Winnuke 等等 )然後再改用晚一點的攻擊方式
    , 像是 Teardrop 和 Land. 再每次攻擊之後用 ping 看看哪個讓他們系統崩
    潰. 當你終於使它崩潰時, 你就可以將範圍縮小到他們在跑什麼, 甚至精確
    到哪個 service pack 或 hotfix.

    我沒有將這個功能加到 nmap, 雖然我承認那是十分吸引人的. :)

SYN Flood Resistance -- 有些作業系統會停止接受新的連線, 如果你送了太多
    偽造的 SYN 封包到那裡. (偽造封包可以避免麻煩你的核心去重設連線 )許
    多作業系統只能處理八個封包. 最近的 Linux 核心 (及其他的作業系統 )允
    許不同的方法, 像是 SYN cookies 去避免這成為嚴重的問題. 這樣你可從目
    標作業系統那裡學到一些東西 , 從偽造的來源傳送八個封包到一個開放的通
    訊埠, 然後測試你能不能從自己的機器連線到那個通訊埠. 這也沒有在 nmap
    中實作, 因為當你用 SYN 封包淹沒他們的時候有些人會不高興. 即是你向他
    們解釋你只是想知道他們在跑什麼作業系統, 也不能安撫他們.


NMAP 的實作和成果

我製作了這份參考文件, 並在 nmap 中實作了所有上面提到的技術 (除了我說明
未加入的部份 ), nmap 還有個好處, 它能利用掃描時已知開啟和關閉的通訊埠去
做偵測, 所以你不需要告訴它. 而且它可以移植到大部分的 Linux 和 *BSD, 以
及 Solaris 2.51 和 2.6, 和一些其他的作業系統.

新版的 nmap 從檔案中讀取由簡單的語法寫成的鑑定用樣板, 下面是一個範例:

FingerPrint  IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
TSeq(Class=i800)
T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

我們來看第一行 (我加了 '>' 作為引用符號):

> FingerPrint  IRIX 6.2 - 6.3 # Thanks to Lamont Granquist

這簡單的說就是這個樣板包含了 IRIX 6.2 版到 6.3 版, 註解表示感謝 Lamont
Granquist 給我受測的 IRIX 機器的 IP 或 " 指紋 ".

> TSeq(Class=i800)

這表示 ISN 取樣是屬於 "i800 class" 中. 意思是每個新的序號以 800 的倍數
增加.

> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)

這個測試命名為 T1 (表示測試一, 聰明吧?). 在這個測試中我們送一個包含很多
TCP 選項的 SYN 封包到一個開啟的通訊埠. DN=N 表示在回應中 ' 不分割 ' 位
元一定是不設定的. W=C000|EF2A 表示窗口宣告必定是 0xC000 或 EF2A,
ACK=S++ 表示我們收到的 ACK 欄位值一定是我們的初始序號加一. Flags=AS 表
示 ACK 和 SYN 會在回應中被送回來. Ops=MNWNNT 表示 TCP 選項會是 (像這樣
的順序 ):

<MSS (not echoed)><NOP><Window scale><NOP><NOP><Timestamp>

> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)

測試二包括一個 NULL 和相同的選項到一個開啟的通訊埠. Resp=Y 表示一定要有
回應. Ops= 表示沒有任何選項包含在回應的封包中. 如果把 '%Ops=' 整個拿掉,
那任何選項都會符合.

> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)

測試三是送一個 SYN|FIN|URG|PSH 和其他 TCP 選項到一個開啟的通訊埠.

> T4(DF=N%W=0%ACK=O%Flags=R%Ops=)

這是送一個 ACK 到一個開啟的通訊埠. 請注意, 這裡沒有標明 Resp=. 這表示沒
有回應 (像是封包在網路上被丟棄或是一個邪惡的防火牆 )並不會使得它在符合
其他測試而沒有通過這個測試的狀況下被判為不符合條件. 我們這樣做是因為事
實上所有的作業系統都會回應這樣的封包, 所以沒有收到回應通常都是其他網路
的原因而非作業系統本身. 我們把 Resp 敘述放在測試二和三是因為有些作業系
統的確會將那種封包丟棄.

> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
> T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)

這些測試是 SYN, ACK 和 FIN|PSH|URG 各自送往關閉的通訊埠. 前述的 TCP 選
項總是被設定的. 當然, 他們很明顯的命名為 'T5', 'T6', 和 'T7':).

> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

這可以從 ' 通訊埠無法到達 ' 的訊息中得到很多資訊. 你現在應該可以確定
DF=N. TOS=0 表示 IP 服務形態欄位值為 0. 下兩個欄位是訊息的 IP 標頭中 IP
總長欄位的十六進位值和回應封包中 IP 標頭中 IP 的總長欄位值. RID=E 表示
預期在回應中得我們原始 UDP 封包的副本的 RID 值 (例如和我們送出去的一樣
). RIPCK=E 表示沒有毀掉總和檢查值 (如果它這樣做了, 那我們會標示
RIPCK=F). UCK=E 表示 UDP 總和檢查值也是正確的. 下一個是 UDP 長度是
0x134 和 DAT=E 表示它正確的回應我們的 UDP 資料. 大部分的實作 (包含這一
個 )不會送任何我們的 UDP 資料. 它們預設是 DAT=E.

Nmap 非公開的第六個測試版可以正確的執行這個功能. 也許你在 Phrack 讀到時
已經發行了. 當然, 也可能還沒. 到 http://nmap.org/ 找最新的
版本.


受歡迎網站的快照

這裡有一些我們努力過後的有趣結果. 我們現在可以隨機找一些網際網路上的站
台, 並找出他們在使用什麼作業系統. 有許多人移除 telnet 的標誌來保持這個
資訊的隱私. 但這對我們新的指紋辨識器是沒有用的! 這也暴露了一些 < 爛作業
系統的擁護者 > 是多麼的白癡!:)

這個範例的指令如下: nmap -sS -p 80 -O -v <host>

附帶說明, 大部分的測試在 10/18/98 完成. 有些人可能會在那之後升級或更換
他們的伺服器.

注意, 我並不是喜歡這裡所有列出來的站台.

# "駭客"站台或(有些)他們自認為是駭客站台
www.l0pht.com        => OpenBSD 2.2 - 2.4
insecure.org     => Linux 2.0.31-34
www.rhino9.ml.org    => Windows 95/NT     # 無話可說 :)
www.technotronic.com => Linux 2.0.31-34
www.nmrc.org         => FreeBSD 2.2.6 - 3.0
www.cultdeadcow.com  => OpenBSD 2.2 - 2.4
www.kevinmitnick.com => Linux 2.0.31-34  # 解救 Kevin!
www.2600.com         => FreeBSD 2.2.6 - 3.0 Beta
www.antionline.com   => FreeBSD 2.2.6 - 3.0 Beta
www.rootshell.com    => Linux 2.0.35  # 在被破台後換成 OpenBSD 了.

# 網路安全廠商, 顧問等等
www.repsec.com       => Linux 2.0.35
www.iss.net          => Linux 2.0.31-34
www.checkpoint.com   => Solaris 2.5 - 2.51
www.infowar.com      => Win95/NT

# 對他們販售的作業系統盡忠的廠商
www.li.org           => Linux 2.0.35 # Linux 國際
www.redhat.com       => Linux 2.0.31-34 # 我想知道是哪個發行版本 :)
www.debian.org       => Linux 2.0.35
www.linux.org        => Linux 2.1.122 - 2.1.126
www.sgi.com          => IRIX 6.2 - 6.4
www.netbsd.org       => NetBSD 1.3X
www.openbsd.org      => Solaris 2.6     # 哈 :)
www.freebsd.org      => FreeBSD 2.2.6-3.0 Beta

# 長春滕盟校
www.harvard.edu      => Solaris 2.6
www.yale.edu         => Solaris 2.5 - 2.51
www.caltech.edu      => SunOS 4.1.2-4.1.4  # 哈囉! 這是九零年代 :)   
www.stanford.edu     => Solaris 2.6
www.mit.edu          => Solaris 2.5 - 2.51 # 很巧的這麼多好學校喜歡Sun
                                           # schools seem to like Sun?
                                           # 的機器? 也許是因為 40% 的
                                           # 教育單位優惠 :)
www.berkeley.edu     => UNIX OSF1 V 4.0,4.0B,4.0D  
www.oxford.edu       => Linux 2.0.33-34  # 繼續加油!

# 廢物網站
www.aol.com          => IRIX 6.2 - 6.4  # 他們如此不安全並不值得驚訝:)
www.happyhacker.org  => OpenBSD 2.2-2.4 # 被破台很令人難過吧, Carolyn?
                                        # 最安全的系統在無能的管理者手
                                        # 上也是沒用的.

# 其他
www.lwn.net          => Linux 2.0.31-34 # 這是 Linux 新聞網站的巨擘.
www.slashdot.org     => Linux 2.1.122 - 2.1.126
www.whitehouse.gov   => IRIX 5.3
sunsite.unc.edu      => Solaris 2.6

注意: 微軟在他們的安全白皮書中解釋他們寬鬆的安全性: " 近年來 Windows 大
受歡迎是因為它的安全性 ". 嗯, 從這裡看來 Windows 在安全性社群中似乎並不
普遍. 在整個群組中我只看到兩台 Windows 機台, 而且 Windows 是 " 非常容易
" 被 nmap 辨識出來, 因為他們是如此的糟糕 (標準的方法 ).

當然, 還有一個站我們必須去檢查. 就是究極安全的全美達公司網站. 有趣的是,
這家公司從微軟的 Paul Allen 挹注很多資金, 但是卻雇用了 Linus Torvalds.
所以他們是順從 Paul 而執行 NT? 還是背叛他而參加 Linux 革命? 讓我們看看吧 :

我們使用這樣的指令:
nmap -sS -F -o transmeta.log -v -O www.transmeta.com/24

這表示使用 SYN 掃描已知的通訊埠 (從 /etc/services 來的 ), 將結果記錄在
'transmeta.log' 這個檔案, 使用詳細的報告, 要做作業系統辨識, 掃描
www.transmeta.com 所在網路的整個 Class C. 以下是結果的摘要:

neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34
www.transmeta.com (206.184.214.11) => Linux 2.0.30
neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34
ssl.transmeta.com (206.184.214.15) => Linux unknown version
linux.kernel.org (206.184.214.34) => Linux 2.0.35
www.linuxbase.org (206.184.214.35) => Linux 2.0.35 ( possibly the same
                                      machine as above )

很好, 我想這很清楚的回答了我們的問題. :)


感謝

Nmap 現在可以辨識這麼多種作業系統的唯一原因, 是有許多在未公開的測試團隊
中很努力的找出新的和令人興奮的機台來辨識! 特別是 Jan Koum, van Hauser,
Dmess0r, David O'Brien, James W. Abendschan, Solar Designer, Chris
Wilson, Stuart Stock, Mea Culpa, Lamont Granquist, Dr. Who, Jordan
Ritter, Brett Eldridge, and Pluvius 送來成噸的古怪機器的 IP 位置, 和 /
或一些無法在網際網路上接觸到的機器的指紋.

感謝 Richard Stallman 撰寫了 GNU Emacs. 這篇文章可能沒有辦法把段落排列
的那麼好 , 如果我使用了 vi 或 cat 和 ^D.

問題和建議可以送到 [email protected] (如果因為某些緣故無法運作, 寄給
[email protected]). Nmap 可以從 http://insecure.org/nmap 取得.

----------------------------------------------------------------------
譯注:

原文網址 http://nmap.org/nmap-fingerprinting-article.txt

註一: TCP/IP 堆疊的實作在每個作業系統多少有些不同, 這可以作為辨識一個作
      業系統的 " 指紋 ".

如果對翻譯上有任何意見請來信指教 [email protected] . 
(如果他沒有把我的免費帳號取消的話, 應該收的到信 :)  )