1. 程式人生 > >Nmap原理02 - 版本探測介紹(上)

Nmap原理02 - 版本探測介紹(上)

掃描 mat pos running style 用戶 tcp連接建立 tin cnblogs

Nmap原理02 - 版本探測介紹(上)

1.介紹

  本文將介紹如何通過修改或添加nmap-service-probes文件來實現對nmap中未知服務的探測,首先介紹服務和版本探測的相關信息,然後介紹服務和版本探測的原理以及nmap-service-probes的文件格式,最後通過一個例子演示修改nmap-service-probes文件識別自己的服務,本節介紹前半部分介紹+技術摘要。

  轉載請註明出處:http://www.cnblogs.com/liun1994/

2. Service and Application Version Detection

  在對應的官方文檔中https://nmap.org/book/vscan.html#vscan-intro屬於這一節的內容,使用nmap-services文件可以識別知名的2200個服務,nmap-services

文件主要基於端口識別。但是這種識別是不可靠的,即使是正確的這些信息也不可靠,了解運行在端口上的服務版本更重要,這有助於確定服務易受攻擊的類型。這就需要服務和版本探測,來探測具體的信息,Nmap通過特定的探針來了解更多的數據,Nmap通過讀取socket中的數據進行匹配。Nmap目前可以識別超過1000個服務。

  下面是服務和版本探測的輸出:

# nmap -A -T4 localhost 

Starting Nmap ( http://nmap.org )
Nmap scan report for felix (127.0.0.1)
(The 1640 ports scanned but not shown below are in state: closed)
PORT     STATE SERVICE    VERSION
21/tcp   open  ftp        WU-FTPD wu-2.6.1-20
22/tcp   open  ssh        OpenSSH 3.1p1 (protocol 1.99)
53/tcp   open  domain     ISC BIND 9.2.1
79/tcp   open  finger     Linux fingerd
111/tcp  open  rpcbind    2 (rpc #100000)
443/tcp  open  ssl/http   Apache httpd 2.0.39 ((Unix) mod_perl/1.99_04-dev)
515/tcp  open  printer
631/tcp  open  ipp        CUPS 1.1
953/tcp  open  rndc?
5000/tcp open  ssl/ftp    WU-FTPD wu-2.6.1-20
5001/tcp open  ssl/ssh    OpenSSH 3.1p1 (protocol 1.99)
5002/tcp open  ssl/domain ISC BIND 9.2.1
5003/tcp open  ssl/finger Linux fingerd
6000/tcp open  X11        (access denied)
8000/tcp open  http-proxy Junkbuster webproxy
8080/tcp open  http       Apache httpd 2.0.39 ((Unix) mod_perl/1.99_04-dev)
8081/tcp open  http       Apache httpd 2.0.39 ((Unix) mod_perl/1.99_04-dev)
Device type: general purpose
Running: Linux 2.4.X|2.5.X
OS details: Linux Kernel 2.4.0 - 2.5.20

Nmap finished: 1 IP address (1 host up) scanned in 42.494 seconds
解釋:
  1. 端口515將服務作為打印機提供,但該版本字段為空。 Nmap通過探測確定服務名稱,但無法確定其他任何內容。
  2. 端口953將服務提供為“rndc?”,問號告訴我們,Nmap甚至無法通過探測來確定服務名稱。
    顯示rndc,因為它已經在nmap-services中註冊了端口953。不幸的是,Nmap的任何一個探測器都沒有引起任何rndc的響應。
    如果他們有,Nmap將打印一個服務指紋和提交的URL,以便它可以在下一個版本被識別。
  3. 從上面的輸出可以看出,服務和版本探測輸出的不只是版本號,這取決於探針探測所返回的結果以及我們所寫的匹配語句

3. 技術摘要

  Nmap首先根據選項執行端口掃描,然後將所有open 或者 open|filtered的TCP and/or UDP端口傳遞到服務掃描模塊,然後這些端口被並行探測;根據什麽來探測?貢獻者貢獻的Nmap探針來探測。

  1)Nmap檢查上述端口列表有哪些是Exclude排除在外的,Exclude指令在nmap-service-probes文件中會介紹。如果排除在外,不進行探測。

  2)如果端口是TCP,Nmap嘗試連接它,如果連接成功,那麽端口狀態會由open|filtered轉換成open。這很少出現,因為端口檢測既然沒檢測出來,試圖與它連接應該連接不上。

  3)一旦TCP連接建立,Nmap會監聽5秒鐘(NULL Probes),通過歡迎信息確定他們的服務類型,如果數據收到,Nmap會將其與保存的3000多NULL探針指紋進行匹配,如果服務被完全確定,那麽該端口的服務掃描完成。如果服務沒有被探測出來,Nmap有“soft match”的機制,Nmap會繼續選擇探針進行探測,這些探針被限制到與該服務相匹配的探針上。

  4)每個探針都有被認為最有效的探測端口列表,例如GetRequest的探針識別Web服務器,其列出的端口80-85,88-80-80和8080-8085, Nmap順序執行與正在掃描的端口號匹配的探針。每個探針包括一個探測字符串,它被發送到端口;將返回的響應與上面的NULL探針描述中討論的的簽名正則表達式進行比較。與NULL探測一樣,這些測試可能導致完全匹配(結束探測)和軟匹配(將未來探測限制到與某個服務相匹配的探測)或者根本不匹配。Nmap用於測試匹配的正則表達式的確切列表取決於探針後面配置。從X11Probe返回的數據不太可能匹配為GetRequest探針制作的任何正則表達式。另一方面,像RTSPRequest這樣的探測器返回的結果很可能與為GetRequest制作的正則表達式匹配,因為正在測試的兩個協議是密切相關的。因此,RTSPRequest探測器具有對GetRequest匹配的後備。

  如果從處於open|filtered狀態的UDP端口接收到版本檢測期間的任何響應,則該狀態更改為打開。這使得版本檢測成為UDP掃描的絕佳補充,當一些常見的防火墻規則生效時,它被強制將所有已掃描的UDP端口標記為已打開|過濾。將UDP掃描與版本檢測相結合可以做到簡單的UDP掃描只需要很多次,這是一個有效和有用的技術。

  5)由於需要管理連接,Nmap提高速度的技術:大多數探針具有通用性;如果服務匹配software指令,那麽Nmap只需要嘗試可能匹配該服務的探針;所有的探針都不是相等的,有些可以探測出更多的服務,Nmap通過使用稀有度,來避免嘗試不太可能實現匹配的探針。

  6)如果至少有一個探針引起響應,但是Nmap無法識別該服務,則響應內容將以指紋的形式打印給用戶。

  7)探針選擇

    Nmap使用rarity變量來控制探針的選擇,rarity的值越高,那麽它被認為不常見,不太可能被嘗試;可以通過選項指定rarity的值。

    (1)如果是TCP,NULL探針第一個被嘗試;

    (2)將掃描端口列為可能端口的所有探針將會被嘗試,按照探針順序進行嘗試。

    (3)所有其他具有小於或等於掃描的rarity值的探針也按照它們在nmap服務探針中出現的順序進行嘗試。

    一旦探針發現匹配,算法終止並報告輸出。

    因為除了NULL探針以外,其他探針都附帶了rarity變量值,因此很容易在版本探測中控制他們;Nmap默認的rarity強度是7。

nmap -sV --version-intensity 3 scanme.nmap.org
--version-light 等價於指定2
--version-all 等價於指定9
如果指定0,那麽只有空探針被嘗試

  如果上面的論述不清楚,可以通過使用 --version-trace選項和-d選項;這將顯示連接和數據讀寫的狀態,對我們理解執行過程非常有用。

  例子可參考:https://nmap.org/book/vscan-technique-demo.html

4. 參考文獻

  https://nmap.org/book/vscan.html

Nmap原理02 - 版本探測介紹(上)