安全掃描工具Nmap引擎理解文檔

Nmap簡介html


Nmap也就是Network Mapper,是一款網絡鏈接端掃描軟件,用來掃描網上電腦開放的網絡鏈接端。肯定哪些服務運行在哪些鏈接端,而且推斷計算機運行哪一個操做系統。它是網絡管理員比用的軟件之一,以及用以評估網絡系統保安,nmap的核心功能有:web


主機發現:用於發現目標主機是否處於活動狀態。Nmap提供多種檢測機制,能夠更有效地辯識主機。sql


端口掃描:用於掃描主機上端口狀態。Nmap能夠將端口識別爲開放(Open)、關閉(Closed)、過濾(Filtered)、未過濾(Unfiltered)、開放|過濾(Open|Filtered)、關閉|過濾(Closed|Filtered)。默認狀況下,Nmap會掃描1000個經常使用端口,能夠覆蓋大多數基本應用狀況。數據庫


版本偵測:用於識別端口上運行的應用程序與應用版本。Nmap目前能夠識別數千鍾中應用的簽名,檢測數百種應用協議。而對於不識別的應用,Nmap默認會將應用的指紋打印出來,若是用於確知該應用程序,那麼用戶能夠將信息提交到社區,爲社區作貢獻。編程


操做系統偵測:用於識別目標機的操做系統類型、版本編號及設備類型。Nmap目前提供了上千種操做系統或設備的指紋數據庫,能夠識別通用PC系統、路由器、交換機等設備類型。安全


防火牆/IDS規避:Nmap提供多種機制來規避防火牆、IDS的屏蔽和檢查,便於祕密地探查目標機的情況。基本的規避方式包括:分片/IP誘騙/IP假裝/MAC假裝等等。服務器


NSE腳本引擎:NSE是Nmap最強大最靈活的特性之一,能夠用於加強主機發現、端口掃描、版本偵測、操做系統偵測等功能,還能夠用來擴展高級的功能如web掃描、漏洞發現。漏洞利用等等。Nmap使用lua語言來做爲NSE腳本語言,目前的Nmap腳本庫已經支持400多個腳本。網絡


Nmap的工做流程併發


Nmap的執行流程簡單清晰,主要分爲三個階段app


  • 準備階段:在其中會執行參數解析、資源分配、基本掃描信息的輸出、端口與地址列表的初始化、NSE環境準備及pre_scripts的運行等基本的準備操做。

  • 工做階段:而後進入主循環,每次循環對一組目標地址進行主機發現、端口掃描、服務與版本偵測、OS偵測及腳本掃描等操做,直到全部的目標地址都被掃描完畢才推出主循環

  • 善後階段:在完成全部掃描操做後,調用post-script完成相應處理,而後打印出掃描的最終結果,並釋放掉分配的資源。


下圖爲Nmap的執行流程圖


0


Nmap腳本引擎


Nmap提供了強大的腳本引擎(NSE),以支持Lua編程來擴展Nmap的功能。目前腳本庫已經包含400多個經常使用的Lua腳本,輔助完成Nmap的主機發現、端口掃描、服務偵測、操做偵測四個基本功能,並補充了其餘掃描能力:如執行HTTP服務詳細信息的探測、暴力破解簡單密碼、檢查常見的漏洞信息等等。若是用戶須要對特定的應用作更深刻的探究,能夠按照NSE腳本格式便攜Lua腳原本加強Nmap的掃描能力。


實現原理


NSE主要分爲兩大部分:內嵌Lua解釋器與NSE library。


解釋器:Nmap採用嵌入的Lua解釋器來支持Lua腳本語言。Lua語言小巧簡單並且擴展靈活自身的C/C++語言融合。


NSE library:爲Lua腳本與Nmap提供了鏈接,負責完成基本初始化及提供腳本調度、併發執行、IO框架及異常處理,並提供了默認的實用的腳本程序。


腳本分類


NSE中提供的Lua腳本分別爲不一樣的類別,根據官方網站,目前的有14中類別:


auth:負責處理鑑權證書(繞開鑑權)的腳本
broadcast:在局域網內探查更多服務開啓情況,如dhcp/dns/sqlserver等服務。
brute:提供暴力破解方式,針對常見的應用如http/snmp等
default:這是使用-sC或A選項掃描時默認的腳本,提供基本掃描能力
discovery:對網絡進行更多的信息,如SMB枚舉、SNMP查詢等
dos:用於進行拒絕服務***
exploit:利用已知的漏洞***系統
external:利用第三方的數據庫或資源,例如whois解析
fuzzer:模糊測試的腳本,發送異常的包的目標機,探測出潛在漏洞
intrusive:***性的腳本,此類腳本可能引起對方的IDS/IPS的記錄或屏蔽
malware:探測目標機是否感染了病毒、開啓了後門等信息
safe:此類與instrusive相反,屬於安全性腳本
version:負責加強服務與版本掃描功能的腳本
vuln:負責檢查目標機是否有常見的漏洞,如是否有MS08_067


每種腳本不止屬於一種類型的,具體屬於哪一種類型可進入官網查看 http://www.nmap.org


NSE掃描流程


Nse腳本掃描屬於主循環流程下的一個部分,其代碼流程圖以下


0


初始化流程


在命令行參數中指定腳本(–script/-sC)或指定-A選項或指定-sV選項,都會觸發Nmap啓動腳本引擎。其中-A選項表示全面掃描,會調用default類別的腳本掃描;而-sV選項表示應用與版本偵測,會調用Version類別的腳本,輔助偵測服務詳細信息。


nmap_main()函數中,若判斷須要啓動腳本引擎,這首先須要調用open_nse()函數進行NSE環境的準備,首先要建立luaState(管理Lua解釋器的執行的全局變量),而後調用init_main()函數進行詳細的初始化過程。


進入init_main()函數,首先加載Lua標準版庫與Nmap的擴展庫,隨後準備參數環境,而後加載並執行nse_main.lua文件。


nse_main.lua腳本爲後續的腳本執行準備Lua環境,加載用戶選擇的須要調用的腳本(例如,用戶–script discovery,那麼會將該類別中全部的腳本加載進來),返回一個main()函數對象給init_main(),該main()是否後續腳本掃描須要的主函數,被保存在Lua的環境的註冊表中。


在nse_main.lua中,定義兩個核心的類,Script和Thread,Script用於管理NSE腳本,當新的腳本被加載時,調用Script.new建立腳本對象,該對象被保存下來在後續的掃描過程當中使用;Thread用於管理腳本的執行,該類中也包含對腳本健全性的檢查(sanitycheck,如是否包含Action函數,4.4會講到)。在腳本執行時,若是腳本之間存在依賴關係,那麼會將基礎的無依賴的腳本統一執行完畢,再執行依賴性的腳本。


腳本掃描流程


執行腳本掃描時,從nmap_main()中調用script_scan()函數。


在進入script_scan()後,會標記掃描階段類型,而後進入到初始化階段返回的main()函數(來自nse_main.lua腳本中的main)中,在函數中解析具體的掃描類型。


main()函數負責處理三種類型的腳本掃描:預掃描(SCRIPT_PRE_SCAN)、腳本掃描(SCRIPT_SCAN)、後掃描(SCRIPT_POST_SCAN)。預掃描即在Nmap調用的最前面(沒有進行主機發現、端口掃描等操做)執行的腳本掃描,一般該類掃描用於準備基本的信息,例如到第三服務器查詢相關的DNS信息。而腳本掃描,是使用NSE腳原本掃描目標主機,這是最核心的掃描方式。後掃描,是整個掃描結束後,作一些善後處理的腳本,好比優化整理某些掃描。


在main()函數中核心操做由run函數負責。而run()函數的自己設計用於執行全部同一級別的腳本(根據依賴關係劃分的級別),直到全部線程執行完畢才退出。


run()函數中實現三個隊列:執行隊列(Running Queue)、等待隊列(Waiting Queue)、掛起隊列(Pending Queue),並管理三個隊列中線程的切換,直到所有隊列爲空或出錯而退出。


NSE腳本結構


NSE的使用Lua腳本,而且配置固定格式,以減輕用戶編程負擔,一般的一個腳本氛圍幾個部分:


Description 字段:描述腳本功能的字符串,使用雙層方括號表示。


Comment 字段:以__開頭的行,描述腳本輸出格式


Author   字段:描述腳本做者


License    字段:描述腳本使用許可證,一般配置爲Nmap相同的license


Categories 字段:描述腳本所屬的類別,以對腳本的調用進行管理。


Rule      字段:描述腳本執行的規則,也就是肯定觸發腳本執行的條件。在Nmap中有四種類型的規則。


A.Prerule()用於在Nmap沒有執行掃描以前觸發腳本執行,這類腳本腳本並不須要用到任何Nmap掃描的結果;

B.Hostrule()用在Nmap執行完畢主機發現後觸發的腳本,根據主機發現的結果來觸發該類腳本

C.Postrule用於Nmap執行端口掃描或版本偵測時觸發的腳本,例如檢測到某個端口時觸發某個腳本執行以完成更詳細的偵查

D.Postrule用於Nmap執行完畢全部掃描後,一般用於掃描結果的數據提取和整理。


Action   字段:腳本執行的具體內容。當腳本經過rule字段檢查被觸發執行時,就會調用action字段定義的函數


下面以broadcast-db2-discover.nse腳本爲例說明(源代碼請點擊下方「閱讀原文」查看)


參考文獻

官網地址:http://www.nmap.org/

相關文章
相關標籤/搜索