一、實(shí)驗(yàn)背景:
網(wǎng)絡(luò)入侵的一般流程是確定目標(biāo)、信息收集、漏洞挖掘、實(shí)施攻擊、留下后門、清除日志。在信息收集環(huán)節(jié)又可分為網(wǎng)絡(luò)踩點(diǎn)、網(wǎng)絡(luò)掃描和網(wǎng)絡(luò)查點(diǎn)。在網(wǎng)絡(luò)掃描部分,按照攻擊者的入侵流程又可分為主機(jī)掃描、端口掃描、系統(tǒng)類型探測和漏洞掃描。
網(wǎng)絡(luò)掃描是針對整個目標(biāo)網(wǎng)絡(luò)或單臺主機(jī),網(wǎng)絡(luò)掃描可以全面、快速、準(zhǔn)確的獲取目標(biāo)系統(tǒng)的信息;通過網(wǎng)絡(luò)掃描發(fā)現(xiàn)對方,獲取對方的信息是進(jìn)行網(wǎng)絡(luò)攻防的前提。至今,互聯(lián)網(wǎng)上有許多開源的優(yōu)秀網(wǎng)絡(luò)掃描工具,Nmap(簡稱Network Mapper)就是世界上最流行功能、最強(qiáng)大的網(wǎng)絡(luò)掃描工具。
Nmap是一款開源免費(fèi)的網(wǎng)絡(luò)發(fā)現(xiàn)(Network Discovery)和安全審計(jì)(Security Auditing)工具,由Fyodor在1997年創(chuàng)建,是滲透測試人員必用的軟件之一,用以評估網(wǎng)絡(luò)系統(tǒng)安全。一般情況下,Nmap用于列舉網(wǎng)絡(luò)主機(jī)清單、管理服務(wù)升級調(diào)度、監(jiān)控主機(jī)或服務(wù)運(yùn)行狀況;可以檢測目標(biāo)機(jī)是否在線、端口開放情況、偵測運(yùn)行的服務(wù)類型及版本信息、偵測操作系統(tǒng)與設(shè)備類型等信息。
Nmap有很多優(yōu)點(diǎn)。一是NMAP支持很多掃描技術(shù),如UDP、TCP connect()、TCP SYN(半開掃描)、FTP bounce scan、反向標(biāo)志掃描、ICMP、FIN、ACK掃描、Xmas Tree、null掃描等掃描技術(shù)。二是支持主流操作系統(tǒng):Windows/Linux/Unix/MacOS等,源碼開放,方便移植。三是Nmap官網(wǎng)提供了詳細(xì)的文檔描述,互聯(lián)網(wǎng)上的參考資料也比較豐富。四是Nmap功能強(qiáng)大,Nmap可以掃描互聯(lián)網(wǎng)上大規(guī)模的計(jì)算機(jī),可以通過TCP/IP協(xié)議棧特征探測操作系統(tǒng)類型,可以進(jìn)行秘密掃描、并行掃描、誘餌掃描、避開端口過濾檢測、RPC掃描、碎片掃描、腳本掃描等。
Zenmap是Nmap官方提供的圖形界面,是用Python語言編寫的開源免費(fèi)的圖形界面,能在Windows/Linux/Unix/Mac OS等操作系統(tǒng)上運(yùn)行;Zenmap旨在為nmap提供更加簡單的操作方式。簡單常用的操作命令可以保存成為profile,用戶掃描時(shí)可以在Profile欄位選擇profile即可,可以很方便地比較不同的掃描結(jié)果;Topology選項(xiàng)卡中還可以提供有網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的圖形顯示功能,用于顯示掃描到的目標(biāo)機(jī)與本機(jī)之間的拓?fù)浣Y(jié)構(gòu)。NMAP的功能架構(gòu)圖如圖1所示:
?
圖1 功能架構(gòu)圖
從圖1中也可以看出Nmap的功能:主機(jī)發(fā)現(xiàn)(Host Discovery)、端口掃描(Port Scanning)、版本偵測(Version Detection)、操作系統(tǒng)偵測(Operating System Detection),以及NMAP的高級用法防火墻/IDS規(guī)避、NSE腳本引擎。其中,nmap腳本引擎(NSE,Nmap scripting Engine)也是nmap最強(qiáng)大、最靈活的功能之一,它允許用戶使用lua編程語言編寫、共享簡單的腳本,以自動化執(zhí)行各種網(wǎng)絡(luò)任務(wù)。
二、實(shí)驗(yàn)原理:
本次實(shí)驗(yàn)使用nmap工具,需要預(yù)先掌握IP、ICMP、TCP和UDP等協(xié)議原理與一些編程知識。使用NMAP進(jìn)行掃描,可分為以下幾類,首先是常規(guī)掃描,通過TCP的三次連接進(jìn)行掃描,如圖2所示:
?
圖2 ?常規(guī)掃描
然后是半打開掃描,沒有完成三次連接進(jìn)行掃描,如圖3所示:
?
圖3 ?半打開掃描(SYN掃描)
另一類是ACK掃描,ACK掃描通過發(fā)送一個ACK包給目標(biāo)主機(jī),不論目標(biāo)主機(jī)的端口是否開啟,都會返回相應(yīng)的RST包,通過判斷RST包中的TTL來判斷端口是否開啟。如圖4所示
?
圖4 ?ACK掃描
還有一類是UDP掃描,UDP掃描是由掃描主機(jī)發(fā)出UDP數(shù)據(jù)包給目標(biāo)主機(jī)的UDP Port,并等待目標(biāo)主機(jī)Port送回ICMP Unreachable信息,如圖5所示:
?
圖5 ?半打開掃描
三、實(shí)驗(yàn)環(huán)境:
Windows系統(tǒng)、Nmap軟件、靶機(jī)系統(tǒng)。本次實(shí)驗(yàn)的網(wǎng)絡(luò)拓?fù)淙鐖D6所示:
?
圖6 nmap網(wǎng)絡(luò)掃描器實(shí)驗(yàn)環(huán)境
四、實(shí)驗(yàn)?zāi)康募耙螅?/h2>
深入Nmap網(wǎng)絡(luò)掃描器的原理,并通過使用Nmap發(fā)現(xiàn)目標(biāo)主機(jī)、開放端口、服務(wù)類型、版本和操作系統(tǒng),進(jìn)行nmap腳本及庫文件編寫,深入掌握網(wǎng)絡(luò)掃描器的作用,達(dá)到以下要求:
- 深入掌握信息探測技術(shù)中的nmap網(wǎng)絡(luò)掃描器原理,掌握常用網(wǎng)絡(luò)服務(wù)對應(yīng)的端口號。
- 熟練使用nmap常用參數(shù)對網(wǎng)絡(luò)環(huán)境進(jìn)行掃描,并通過掃描結(jié)果對目標(biāo)進(jìn)行分析。
- 掌握nmap腳本的基本使用方法和開發(fā)方法,理解并掌握nmap的API和庫文件的使用。
- 本次實(shí)驗(yàn)需連接SUSE校園網(wǎng);完成實(shí)驗(yàn)后,提交電子實(shí)驗(yàn)報(bào)告1份,命名格式:學(xué)號+姓名+實(shí)驗(yàn)名。
五、實(shí)驗(yàn)內(nèi)容:
- 安裝Nmap,掌握windows下nmap的安裝方法
- 通過掃描目標(biāo)計(jì)算機(jī)熟悉nmap圖形界面Zenmap的基本應(yīng)用
- 通過nmap命令行的使用,掌握nmap命令行下常用的參數(shù)。
- 掌握nmap腳本的使用和簡單Nmap腳本開發(fā)。
- 利用Halcyon編寫簡單的nmap腳本,實(shí)現(xiàn)對web服務(wù)器的檢測。
- 掌握nmap的API和庫文件的使用。
六、實(shí)驗(yàn)步驟:
(1)安裝Nmap:
雙擊nmap-7.92-setup.exe安裝,在安裝過程中,保持默認(rèn)設(shè)置,按照提示進(jìn)行安裝即可。
(2)Zenmap應(yīng)用:
2.1)單機(jī)掃描:
通過掃描自己的PC,熟悉nmap圖形界面Zenmap的基本使用。打開Zenmap,點(diǎn)擊“掃描”—>“新建窗口”,在目標(biāo)框中輸入IP地址172.26.10.102,不修改配置直接點(diǎn)擊掃描,等待返回掃描結(jié)果。點(diǎn)擊狀態(tài)界面的“掃描”選項(xiàng)卡,可以看到掃描進(jìn)度,掃描完成后,可以看到被掃描對象的各種狀態(tài),包括端口、拓?fù)鋱D、主機(jī)操作系統(tǒng)類型等信息。掃描效果如圖7所示:
?
圖7 單機(jī)掃描效果(截圖需展示端口對應(yīng)的服務(wù)類型和版本號)
問題1:請?jiān)趯?shí)驗(yàn)報(bào)告上回答該IP地址最有可能的OS類型及OS版本?
接著繼續(xù)在zenamp界面,將配置改為:Intense scan, all TCP ports,重新對目標(biāo)172.26.10.102進(jìn)行掃描,觀察返回結(jié)果有何不同。對比掃描效果如圖8所示:
?
圖8 對比掃描結(jié)果
2.2)網(wǎng)段掃描:
對本機(jī)所處網(wǎng)段進(jìn)行掃描,分析本網(wǎng)段環(huán)境:根據(jù)圖7的目標(biāo)欄,在掃描目標(biāo)中輸入:172.22.252.0/24,將配置改為:Intense scan, all TCP ports,然后運(yùn)行掃描任務(wù),掃描任務(wù)停止后即可查看返回結(jié)果。在左側(cè)“主機(jī)”中會列舉出被掃描網(wǎng)段中所有存活的主機(jī)以及操作系統(tǒng)類型,點(diǎn)擊相關(guān)主機(jī)即可查看主機(jī)的詳細(xì)信息。接著,選擇“掃描”菜單中“保存掃描”選項(xiàng)可以保存掃描結(jié)果,保存類型選用默認(rèn)的XML格式??捎肐E瀏覽器打開并查看該XML文件。效果如圖9所示:
?
圖9 網(wǎng)段掃描效果(截圖需展示存活的主機(jī)IP列表)
問題2:請?jiān)趯?shí)驗(yàn)報(bào)告上回答存活的主機(jī)IP列表以及有SSH服務(wù)的IP有哪些?
(3)Nmap命令行的使用:
3.1)Nmap命令行用法及參數(shù)說明:
打開CMD命令提示符,在CMD命令提示符窗口中輸入“nmap”命令,按下回車鍵,nmap會返回使用說明??梢钥吹絥map的用法如圖10所示,其中目標(biāo)參數(shù)<target specification>為必選項(xiàng):
?
圖10 ?nmap的命令行用法
根據(jù)圖10,常用掃描類型及參數(shù)說明如圖11所示,掃描類型-sT、-sS、-sA、-sU的原理分別對應(yīng)圖2、圖3、圖4、圖5:
?
圖11 常用掃描類型及參數(shù)說明
3.1)Nmap命令行使用案例:
基于圖11,若要判斷172.26.10.102的操作系統(tǒng),則nmap命令行的命令為:nmap -O -T5 172.26.10.102。若要在測試中不在服務(wù)器172.26.10.102上留下連接痕跡,可以采用半開掃描(即非TCP三次握手連接),nmap命令行的命令為:nmap -sS 172.26.10.102。若要掃描目標(biāo)主機(jī)172.26.10.102所有端口(1-65535),nmap命令行的命令為:nmap -p 1-65535?172.26.10.102。
(4)nmap腳本的使用:
雖然nmap內(nèi)嵌的服務(wù)與版本探測很強(qiáng)大,但是在某些情況下需要多倫次的交互才能夠探測到更多的服務(wù)器信息,這時(shí)就需要自己編寫NSE插件來實(shí)現(xiàn)。NSE插件能夠完成網(wǎng)絡(luò)發(fā)現(xiàn)、復(fù)雜版本探測、脆弱性探測、簡單漏洞利用等功能。
nmap執(zhí)行時(shí),首先需要理解Nmap腳本引擎原理,如圖12所示:
?
圖12 ?nmap執(zhí)行原理
在圖12中,根據(jù)腳本的運(yùn)行階段不同分為四類:Prerule scripts、Host scripts、Service scripts、Postrule scripts。 Service scripts應(yīng)用最多,Post scripts是對Nmap輸出進(jìn)行格式化,Host scripts在Nmap運(yùn)行完主機(jī)發(fā)現(xiàn)、端口掃描、版本探測、OS偵測后執(zhí)行;Prerule scripts執(zhí)行一些資源操作,先于各探測執(zhí)行。
4.1)使用--script、--script-help選項(xiàng)的腳本掃描:
Nmap安裝后已自帶了很多腳本,這些可使用的腳本處于nmap的scripts目錄下,也是nmap的腳本庫。在使用nmap時(shí),通過在命令中加上--scritp就可以調(diào)用nmap腳本來配合網(wǎng)絡(luò)掃描;這些腳本分為以下幾類,如表1所示:
表1 nmap常用腳本類型及說明
腳本類別 |
腳本類別說明 |
auth |
負(fù)責(zé)處理鑒權(quán)證書的腳本,以繞開鑒權(quán) |
broadcast |
通過網(wǎng)絡(luò)廣播,在局域網(wǎng)內(nèi)探查更多服務(wù)開啟狀況,如dhcp/dns/sqlserver等服務(wù) |
brute |
提供暴力破解方式,針對常見的應(yīng)用如http/snmp等 |
default |
使用-sC或-A選項(xiàng)掃描時(shí)候默認(rèn)的腳本,提供基本腳本掃描能力 |
discovery |
對網(wǎng)絡(luò)進(jìn)行更多的信息,如SMB枚舉、SNMP查詢等,以進(jìn)行服務(wù)發(fā)現(xiàn) |
dos |
用于進(jìn)行拒絕服務(wù)攻擊 |
exploit |
利用已知的漏洞入侵系統(tǒng),進(jìn)行漏洞利用 |
external |
利用第三方的數(shù)據(jù)庫或資源,例如進(jìn)行whois解析 |
fuzzer |
模糊測試的腳本,發(fā)送異常的包到目標(biāo)機(jī),探測出潛在漏洞 |
intrusive |
入侵性的腳本,此類腳本可能引發(fā)對方的IDS/IPS的記錄或屏蔽,造成不良后果 |
malware |
探測目標(biāo)機(jī)是否感染了病毒、開啟了后門等信息 |
safe |
此類與intrusive相反,屬于安全性腳本,掃描危害較小 |
version |
負(fù)責(zé)增強(qiáng)服務(wù)與版本掃描(Version Detection)功能的腳本,進(jìn)行版本識別 |
vuln |
負(fù)責(zé)檢查目標(biāo)機(jī)是否有常見的漏洞(Vulnerability),如是否有MS08_067 |
在使用nmap時(shí),一種調(diào)用腳本的方式是使用種類的名字就可調(diào)用該分類下的全部腳本,如--scritp vuln;但這種調(diào)用方式比較費(fèi)時(shí)。另一種就是調(diào)用單個nmap腳本的方式,如以自帶的http-methods腳本為例,用以查看web server支持的http methods。
使用http-methods腳本時(shí),可先用--script-help查看http-methods腳本的用法,命令為:nmap --script-help http-methods;可以看到腳本的類別和使用該腳本的描述。要使用該腳本,則使用--script加載該腳本,就會在結(jié)果中會打印出目標(biāo)對象支持HTTP協(xié)議的請求方法,使用該腳本的命令為:nmap --script=http-methods 172.26.10.2
問題3:請?jiān)趯?shí)驗(yàn)報(bào)告上回答以上命令支持支持HTTP協(xié)議的請求方法有哪些?
在nmap的scripts目錄中仔細(xì)分析一下,可以看到與http相關(guān)的腳本都是以http-的方式命名的,如與ssh相關(guān)的都是以ssh-的方式命名。如圖13所示:
?
圖13 nmap腳本
因此,在使用nmap對目標(biāo)對象進(jìn)行檢測時(shí),可以使用通配符”*”來匹配所有的與某類相關(guān)的腳本;比如使用所有與ssh相關(guān)的腳本的命令為:nmap --script "ssh-*" 172.26.10.2。
4.2)使用?--script-args選項(xiàng)的腳本掃描:
一般普通用戶在向一些Web網(wǎng)站發(fā)送HTTP請求時(shí),網(wǎng)站會提取HTTP請求中的user-agent來判斷該請求是否合法。事實(shí)上,在nmap使用http-methods腳本掃描時(shí),會發(fā)送帶有nmap特征的請求報(bào)文。輸入命令:nmap --script=http-methods 172.26.10.2時(shí),并使用wireshark抓取該命令的掃描請求報(bào)文,并追蹤HTTP流,可得圖14所示:
?
圖14 使用wireshark抓取http-methods腳本的掃描請求報(bào)文
在圖14中,可以看到在user-agent中有nmap的特征“nmap scripting engine”,這也驗(yàn)證了在nmap使用http-methods腳本掃描時(shí),會發(fā)送帶有nmap特征的請求報(bào)文。
因此,在使用某個腳本時(shí),若該腳本支持傳入?yún)?shù),可以利用--script-args選項(xiàng)來修改數(shù)據(jù)包。在上面的http-methods腳本掃描案例中,若目標(biāo)站點(diǎn)根據(jù)nmap特征來拒絕nmap的HTTP請求;此時(shí),若攻擊者還想讓網(wǎng)站通過判斷nmap的HTTP請求是合法請求,以繞過網(wǎng)站的對nmap請求包的檢測,就可以利用--script-args修改nmap的HTTP請求包中的user-agent,命令為:nmap --script=http-methods --script-args http.useragent="Mozilla 42" 172.26.10.2;再使用wireshark抓包,可發(fā)現(xiàn)此時(shí)nmap的HTTP請求包中含有的useragent與命令中傳入的http.useragent一樣。
4.3)理解Nmap腳本掃描的細(xì)節(jié):
要理解Nmap腳本掃描的細(xì)節(jié),還是以http-methods腳本掃描為例,若攻擊者想知道腳本掃描的細(xì)節(jié),就可以使用--script-trace,以16進(jìn)制形式來打印所有收發(fā)的數(shù)據(jù),命令為:nmap --script-trace --script=http-methods 172.26.10.2,如圖15所示:
?
圖15 使用--script-trace以16進(jìn)制形式來打印所有收發(fā)的數(shù)據(jù)
也使用--packet-trace查看所有發(fā)送和收到的數(shù)據(jù)包。命令為:nmap --packet-trace --script=http-methods 172.26.10.2。還可以使用-d進(jìn)入調(diào)試模式,-d后面需要跟1-9的某個數(shù)字,數(shù)字越大,輸出越詳細(xì)以-d3為例,命令為:nmap -d3 --script=http-methods 172.26.10.2。
4.4)簡單Nmap腳本開發(fā):
事實(shí)上,攻擊者可以自己寫腳本,以解決一些定制化的nmap腳本掃描任務(wù)。要實(shí)現(xiàn)這一目的,先以http-method這個腳本為例,觀察該腳本主體結(jié)構(gòu),如圖16所示:
?
圖16 腳本文件http-method.nse的主體結(jié)構(gòu)
根據(jù)圖16,description字段介紹了該腳本的功能;categories給出了該nse所在的腳本類別;rule字段描述了腳本執(zhí)行的規(guī)則,確定了腳本觸發(fā)執(zhí)行的條件,這個規(guī)則是一個lua函數(shù),返回值只有true和false兩種,只有返回true時(shí),action中的函數(shù)才會執(zhí)行。action字段給出了腳本具體的執(zhí)行內(nèi)容,若rule字段的檢查通過并被觸發(fā)執(zhí)行時(shí),就會調(diào)用action字段定義的函數(shù)。
由于nmap的擴(kuò)展腳本語言都基于lua來開發(fā)的,執(zhí)行腳本時(shí)調(diào)用了內(nèi)部封裝的lua解釋器;正常情況下,調(diào)用任何一個擴(kuò)展腳本會首先執(zhí)行nse_main.lua,該腳本主要加載一些Nmap的核心庫(nselib文件夾中)、定義多線程函數(shù)、定義輸出結(jié)果處理函數(shù)、讀取、加載擴(kuò)展腳本、定義擴(kuò)展腳本函數(shù)接口、執(zhí)行擴(kuò)展腳本。nse_main.lua文件處于nmap的安裝目錄下,并且擴(kuò)展腳本執(zhí)行的規(guī)則也定義在nse_main.lua中,如圖17所示:
?
?
圖17 擴(kuò)展腳本的執(zhí)行規(guī)則
根據(jù)圖17,通過開發(fā)一個腳本就可以驗(yàn)證圖17中的規(guī)則含義。首先在scripts目錄下創(chuàng)建一個test.nse文件,寫入如下腳本代碼:
prerule=function() print("1-個人姓名拼音+prerule()") end hostrule=function(host) print("2-個人姓名拼音+hostrule()") end portrule=function(host , port) print("3-個人姓名拼音+portrule()") end action=function() print("4-個人姓名拼音+action()") end postrule=function() print("5-個人姓名拼音+postrule()") end |
執(zhí)行命名:nmap --script test 127.0.0.1;可以看到prerule和postrule是在開始和結(jié)束運(yùn)行且只運(yùn)行一次;hostrule是掃描一個主機(jī)就運(yùn)行一次,有N個主機(jī)就會運(yùn)行N次;portrule是掃描到一個端口就運(yùn)行一次,有N個端口就運(yùn)行N次。效果如圖18所示:
?
圖18 test.nse腳本文件執(zhí)行效果
再以http-method.nse腳本文件為例,在圖16的文件中只有一個portrule,也就是該腳本先進(jìn)行端口掃描,再運(yùn)行action函數(shù)。理解了圖16中腳本主體結(jié)構(gòu)以及圖17中腳本的運(yùn)行規(guī)則后,參照http-method.nse的基本結(jié)構(gòu),就可以編寫一個簡單的nse腳本進(jìn)行測試。新建test-simple.nse文件,輸入如下代碼:
local shortport = require "shortport" description = [[]] author = "test" categories = {"default"} portrule = function(host,port) return true end action = function(host,port) end |
接著執(zhí)行命令:nmap --script test-simple 127.0.0.1。可以看到該命令執(zhí)行后,能正確輸出結(jié)果,說明腳本代碼沒有問題。
(5)基于Halcyon的nmap腳本開發(fā):
Halcyon是一個開源的、專門設(shè)計(jì)開發(fā)Nmap腳本的IDE。利用Halcyon可以開發(fā)從偵察到利用的各類Nmap高級掃描腳本。
5.1)安裝jdk、啟動并配置Halcyon:
根據(jù)參考資料9,通過本實(shí)驗(yàn)提供的工具jdk-8u271-windows-x64.exe安裝JDK。接著根據(jù)參考資料10,下載Halcyon_IDE_v2.0.2.jar后,在cmd中進(jìn)入Halcyon_IDE_v2.0.2.jar所在的目錄,輸入命令:java -jar Halcyon_IDE_v2.0.2.jar,啟動Halcyon。
接著在Project->Settings->Environment Settings中,配置Nmap?Executable Path、Nmap?Script?Path、Nmap?Library Path。如圖19所示:
?
圖19 在Halcyon中配置nmap環(huán)境
然后將nselib目錄下的data文件夾復(fù)制到Nmap的安裝目錄,并重命名為nselibdata;接著再關(guān)閉Halcyon,在cmd中輸入命令:java -jar Halcyon_IDE_v2.0.2.jar,重新啟動Halcyon。
5.2)創(chuàng)建nse模板文件、查看Halcyon的布局:
接下來可以新建一個項(xiàng)目:File->New,在彈出的對話框中,要求填寫存儲位置、腳本分類等信息;這里在nmap的scripts目錄下新建一個名為demo.nse的腳本,并點(diǎn)擊Create?New,就自動生成了一個NSE的模板文件;如圖20所示:
?
?
圖20 在Halcyon中新建一個名為demo.nse的腳本
在圖20的右圖中的左側(cè),可以看到Nmap Scripts是namp腳本;NSE Data是nse需要的數(shù)據(jù),比如爆破時(shí)的字典、指紋等文件;Nmap Libraries是nmap的庫文件。在圖20右圖中右側(cè)是編輯代碼的窗口。
5.3)Halcyon模板代碼生成功能、利用Halcyon編寫nmap腳本:
利用Halcyon來編寫nmap腳本,功能是非常強(qiáng)大的;比如使用project->code generator功能,可以快速生成對應(yīng)的功能代碼或相應(yīng)的模板;以socket為例,點(diǎn)擊Project->Code Generator->Socket->Connect and Send,就會在編輯代碼的窗口插入三行代碼。效果如圖21所示:
?
?
圖21 生成socket代碼
刪掉圖21中剛剛插入的三行代碼;本部分實(shí)驗(yàn)僅需編寫一個簡單的nmap腳本,以實(shí)現(xiàn)對web服務(wù)器的檢測功能;該功能描述為:如果發(fā)現(xiàn)目標(biāo)開放了80端口,并在這個端口上運(yùn)行了http服務(wù),則輸出"this is a webserver"。若要實(shí)現(xiàn)該功能,在demo.nse文件中,可以發(fā)現(xiàn)description、author、license、categories字段無需修改;portrule、action字段需要修改。
在portrule部分的true修改為規(guī)則A:port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state == "open",用以實(shí)現(xiàn)上述功能;當(dāng)目標(biāo)服務(wù)器上開放的80端口且運(yùn)行著http服務(wù)時(shí),就會命中了規(guī)則A(既同時(shí)滿足規(guī)則A的四個條件),接著會執(zhí)行action部分。此時(shí),在action部分加入代碼:return "this is a webserver",并按ctrl+s保存,再點(diǎn)擊file->update script DB。在CMD中執(zhí)行命令:nmap --script=demo www.baidu.com,就可以看到在掃描出80端口開放后就打印出了this is a webserver,效果如圖22所示:
?
?
圖22 實(shí)現(xiàn)對web服務(wù)器的檢測功能
(6)Nmap的API和庫文件的使用:
NSE 腳本可以訪問多個 Nmap 工具,用于編寫靈活而優(yōu)雅的腳本。 Nmap API提供了目標(biāo)主機(jī)詳細(xì)信息,例如端口狀態(tài)和版本檢測結(jié)果。它還提供了Nsock 庫的接口,以實(shí)現(xiàn)高效的網(wǎng)絡(luò)I/O。
6.1)理解并使用Nmap關(guān)于主機(jī)信息的API:
在5.3節(jié),利用Halcyon編寫nmap腳本部分;我們將portrule部分的true修改為規(guī)則A:port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state == "open";其中port有protocol 、number 、service、state屬性,這些其實(shí)是Nmap提供的API;Nmap中的API的核心功能就是向腳本提供關(guān)于主機(jī)和端口的信息,例如名字解析、主機(jī)和端口的狀態(tài)、服務(wù)發(fā)現(xiàn)等內(nèi)容。
Nmap引擎會向腳本傳遞如下兩個Lua table類型的參數(shù):host table,port table。這兩個table分別包含了目標(biāo)主機(jī)的host和port信息。host table包括的字段如表2所示:
表2 host table包括的字段
字段 |
類型 |
具體含義 |
host.os |
Array(數(shù)組) |
一組操作系統(tǒng)匹配表;操作系統(tǒng)匹配由一個可讀的名稱和一系列操作系統(tǒng)類組成。 每個OS類由供應(yīng)商、OS系列、OS代、設(shè)備類型和該類的CPE(Common Platform Enumeration)條目數(shù)組組成。 |
host.ip |
字符串 |
以字符串形式表示目標(biāo)主機(jī) IP 地址。 如果掃描是針對主機(jī)名運(yùn)行的,并且其 DNS 查找返回了多個 IP 地址,則使用相同的 IP 地址作為為掃描選擇的 IP 地址。 |
host.name |
字符串 |
包含以字符串表示的已掃描目標(biāo)主機(jī)的反向 DNS 條目。 如果主機(jī)沒有反向 DNS 條目,則該字段的值為空字符串。 |
host.targetname |
字符串 |
包含在命令行中指定的主機(jī)名稱。如果命令行中給出的目標(biāo)包含網(wǎng)絡(luò)掩碼或 IP 地址,則該字段的值為0。 |
host.reason |
字符串 |
以字符串形式表示目標(biāo)主機(jī)處于其當(dāng)前狀態(tài)的原因。 |
host.reason_tll |
字符串 |
包含響應(yīng)數(shù)據(jù)包的TTL值,用于確定目標(biāo)主機(jī)到達(dá)時(shí)的狀態(tài)。 這個響應(yīng)包也是用來設(shè)置host.reason的包。 |
host.directly_connected |
布爾型 |
指示目標(biāo)主機(jī)是否直接連到運(yùn)行Nmap 的主機(jī)(即在同一網(wǎng)段上) |
host.mac_addr |
字符串 |
如果有,則為目標(biāo)主機(jī)的MAC地址(六字節(jié)長的二進(jìn)制字符串),否則為零。 通常僅適用于直接連接在LAN上的主機(jī),且僅當(dāng)Nmap正在執(zhí)行原始數(shù)據(jù)包掃描(如 SYN 掃描)時(shí)。 |
host.mac_addr_next_hop |
字符串 |
到主機(jī)的路由中第一跳的 MAC 地址,如果不可用,則為0; |
host.mac_addr_src |
字符串 |
我們自己的 MAC 地址,用于連接到主機(jī)(一般是我們的網(wǎng)卡,或使用--spoof-mac偽造的欺騙地址)。 |
host.interface |
字符串 |
包含接口名稱的字符串,通過該接口將數(shù)據(jù)包發(fā)送到主機(jī)。 |
host.interface_mtu |
字符串 |
host.interface 的 MTU(最大傳輸單元),如果未知,則為 0。 |
host.bin_ip |
字符串 |
目標(biāo)主機(jī)的IP地址為4字節(jié) (IPv4) 或16字節(jié) (IPv6) 字符串。 |
host.bin_ip_src |
字符串 |
自己運(yùn)行Nmap主機(jī)的源IP地址為4字節(jié) (IPv4) 或 16 字節(jié) (IPv6) 字符串。 |
host.times |
Table(表) |
此表包含主機(jī)的 Nmap 時(shí)間數(shù)據(jù)(請參閱“往返時(shí)間估計(jì)”一節(jié))。 它的鍵是 srtt(平滑往返時(shí)間)、rttvar(往返時(shí)間方差)和 timeout(探測超時(shí)),均以浮點(diǎn)秒數(shù)給出。 |
host.traceroute |
Array(數(shù)組) |
是一個跟蹤路由跳躍點(diǎn)數(shù)組,在使用--traceroute選項(xiàng)時(shí)出現(xiàn)。 每一條都是一個host table,其中包含字段名稱、ip 和 srtt(往返時(shí)間),條目的 TTL 是隱含的。 一個空表代表一個超時(shí)的跳躍點(diǎn)。 |
在表2中,以host.os表為例來理解Nmap?API,host.os表的整體結(jié)構(gòu)如下:
host.os = { ??{ ????name = <string>, ????classes = { ??????{ ????????vendor = <string>, ????????osfamily = <string>, ????????osgen = <string>, ????????type = <string>, ????????cpe = { ??????????"cpe:/<...>", ??????????[More CPE] ????????} ??????}, ??????[More classes] ????}, ??}, ??[More OS matches] } |
為了深入理解host.os;舉個例子,若一個操作系統(tǒng)能夠匹配nmap-os-db(nmap的主機(jī)指紋庫)中的條目:
Fingerprint Linux 2.6.32 - 3.2 Class Linux | Linux | 2.6.X | general purpose CPE cpe:/o:linux:linux_kernel:2.6 Class Linux | Linux | 3.X | general purpose CPE cpe:/o:linux:linux_kernel:3 |
則會返回類似如下的詳細(xì)信息:
host.os = { ??{ ????name = "Linux 2.6.32 - 3.2", ????classes = { ??????{ ????????vendor = "Linux", ????????osfamily = "Linux", ????????osgen = "2.6.X", ????????type = "general purpose", ????????cpe = { "cpe:/o:linux:linux_kernel:2.6" } ??????}, ??????{ ????????vendor = "Linux", ????????osfamily = "Linux", ????????osgen = "3.X", ????????type = "general purpose", ????????cpe = { "cpe:/o:linux:linux_kernel:3" } ??????} ????}, ??} } |
在表2中,我們再以host.mac_addr為例來理解Nmap?API,它表示目標(biāo)主機(jī)的mac地址,目標(biāo)主機(jī)只有與運(yùn)行nmap的主機(jī)處于同一子網(wǎng)的設(shè)備,這個參數(shù)才有效。
首先在cmd中進(jìn)入Halcyon_IDE_v2.0.2.jar所在的目錄,輸入命令:java -jar Halcyon_IDE_v2.0.2.jar,啟動Halcyon;接著在nmap安裝目錄的scripts文件夾下,創(chuàng)建一個名為apitest.nse的腳本,并將portrule改為hostrule(因?yàn)閔ost.mac_addr是host表的字段,所以執(zhí)行規(guī)則是hostrule);若我們想要得到的是mac_addr,所以在action中,使用return返回host.mac_addr;完整代碼如圖23所示:
圖23 創(chuàng)建一個名為apitest.nse的腳本,返回host.mac_addr
保存并update script db。在cmd中輸入命令:nmap --script apitest 172.22.128.1,其中目標(biāo)172.22.128.1為本機(jī)網(wǎng)關(guān)。此時(shí)就可以看到打印出來的mac地址,這個mac地址和我們平時(shí)見到的格式不太一樣。這是因?yàn)橥ㄟ^host.mac_addr獲取的mac地址是二進(jìn)制編碼的,還需要將該結(jié)果轉(zhuǎn)換成字符串。通過引入stdnse庫,stdnse包的format_mac函數(shù)就能夠?qū)ost.mac_addr轉(zhuǎn)換成字符串。所以在apitest.nse腳本開頭加上:local stdnse = require "stdnse",且action的return部分改為:stdnse.format_mac(host.mac_addr)。此時(shí),完整代碼如圖24所示:
?
?
圖23 將host.mac_addr轉(zhuǎn)換成字符串
保存并update script db。在cmd中輸入命令:nmap --script apitest 172.22.128.1,此時(shí)得到可讀的mac地址。測試效果如圖24所示:
?
?
圖24 apitest.nse腳本的測試host.mac_addr轉(zhuǎn)換成字符串效果
問題4:請根據(jù)上述方法測試host的字段host.directly_connected,測試對象為自己主機(jī)網(wǎng)關(guān)和百度,并分別回答返回結(jié)果。
6.2)理解并使用Nmap關(guān)于端口信息的API:
接下來理解Nmap關(guān)于端口信息的API。port table以與host table相同的方式傳遞給 NSE 服務(wù)腳本(即僅具有端口規(guī)則而不是主機(jī)規(guī)則)。 port table包含有關(guān)運(yùn)行腳本的端口的信息。 雖然port table未傳遞給主機(jī)腳本,但仍可以通過Nmap 使用 nmap.get_port_state() 和 nmap.get_ports() 函數(shù),發(fā)送請求獲取目標(biāo)上的端口狀態(tài)。
Port的字段比較少,包括number,protocol,service,verison,state等。以在5.3節(jié)寫的nmap腳本為例,其中規(guī)則A為:return port.protocol == "tcp" and port.number == 80 and port.service == "http" and port.state == "open"。此時(shí),protocol標(biāo)志了目標(biāo)端口的類型,為tcp或udp;number是目標(biāo)端口號,service是端口上運(yùn)行的服務(wù),state是端口上運(yùn)行的狀態(tài)。demo.nse腳本就是通過判斷目標(biāo)的80端口開放、并運(yùn)行http服務(wù)后,通過執(zhí)行action打印出this is a webserver。
與6.1一樣,在apitest.nse中,將hostrule改回portrule,action返回port.protocol,port.number,port.service,port.state;如圖25所示:
?
?
圖25 返回port.protocol,port.number,port.service,port.state
此時(shí)在cmd輸入命令:nmap --script apitest baidu.com,測試效果如圖26所示:
?
圖26 apitest.nse腳本輸出端口信息效果
可以在圖26中看到,端口的protocol、number、service、state打印出tcp、80、http、open與tcp、443、https、open。
6.3)理解并編寫Nmap的庫文件:
本節(jié)我們來學(xué)習(xí)nse中的庫文件;在6.1節(jié)中,我們在格式化host.mac_addr返回的mac地址時(shí),使用了stdnse庫文件。Nmap自帶的庫文件都在Nmap安裝目錄的nselib文件夾下,在Halcyon中也列出了這些庫文件,如圖27所示:
?
圖27 在Halcyon中列出的nmap庫文件
接下來,在Nmap安裝目錄的nselib文件夾下,新建一個名為mylib.lua的庫文件(可用notepad++編輯),以實(shí)現(xiàn)打印出某端口是否開放的功能。
首先,先聲明所需的庫文件"stdnse",它保存了一些用于輸入的函數(shù)。然后,定義一個PrintPort函數(shù),它需要一個port參數(shù),將參數(shù)傳遞給stdnse庫的format函數(shù),用于格式化輸出;最后保存一下。
接下來利用Halcyon,接著在nmap安裝目錄的scripts文件夾下,創(chuàng)建一個名為apitestlib.nse的腳本,在其中導(dǎo)入mylib.lua庫文件,在action部分調(diào)用PrintPort函數(shù),保存并Update Script?DB。代碼如圖28所示:
?
圖28 編寫測試mylib.lua庫文件的腳本
在cmd中輸入命令:nmap --script apitestlib baidu.com,就可觀察我們成功地從apitestlib 腳本文件里引用了的mylib庫文件,成功執(zhí)行了mylib庫的PrintPort函數(shù)。運(yùn)行測試效果如圖29所示:
?
圖29 nmap測試apitestlib腳本的效果
七、分析與思考:
1)在使用Nmap掃描時(shí),TCP?connect()掃描(-sT)與TCP?SYN掃描(-sS)有什么區(qū)別?
2)Nmap對局域網(wǎng)中主機(jī)掃描與互聯(lián)網(wǎng)掃描有什么區(qū)別?Nmap在進(jìn)行掃描時(shí),應(yīng)該怎樣選擇相應(yīng)參數(shù)?文章來源:http://www.zghlxwxcb.cn/news/detail-435106.html
3)如果你是網(wǎng)絡(luò)管理員,為了防止其他人掃描你管理的服務(wù)器以獲取信息,有哪些解決辦法?文章來源地址http://www.zghlxwxcb.cn/news/detail-435106.html
八、參考資料:
- https://www.nmap.org/
- https://blog.csdn.net/aspirationflow/article/details/7694274
- https://jsj.bift.edu.cn/wlaq/wlaqzs/68701.htm
- https://nmap.org/nsedoc/
- https://www.secpulse.com/archives/73804.html
- https://www.secpulse.com/archives/73817.html
- https://www.cnblogs.com/liun1994/p/7041373.html
- https://zhuanlan.zhihu.com/p/27224457
- https://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html
- https://github.com/s4n7h0/Halcyon-IDE
- https://nmap.org/book/nse-api.html
- https://blog.csdn.net/weixin_43745072/article/details/112256829
- https://blog.csdn.net/AspirationFlow/article/details/7797708
- https://blog.csdn.net/AspirationFlow/article/details/7853234
- https://blog.csdn.net/AspirationFlow/article/details/7884735
- https://blog.csdn.net/AspirationFlow/article/details/7910350
- https://blog.csdn.net/AspirationFlow/article/details/7932319
- https://blog.csdn.net/AspirationFlow/article/details/7956928
到了這里,關(guān)于Nmap網(wǎng)絡(luò)掃描器實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!