Nmap是一款網絡掃描和主機檢測的很是有用的工具。Nmap是不侷限於僅僅收集信息和枚舉,同時能夠用來做爲一個漏洞探測器或安全掃描器。它能夠適用於winodws,linux,mac等操做系統
linux
Nmap是一款很是強大的實用工具,可用於:
檢測活在網絡上的主機(主機發現)
檢測主機上開放的端口(端口發現或枚舉)
檢測到相應的端口(服務發現)的軟件和版本
檢測操做系統,硬件地址,以及軟件版本
檢測脆弱性的漏洞(Nmap的腳本)
Nmap是一個很是廣泛的工具,它有命令行界面和圖形用戶界面。本人包括如下方面的內容:
介紹Nmap
掃描中的重要參數
操做系統檢測
Nmap使用教程
Nmap使用不一樣的技術來執行掃描,包括:TCP的connect()掃描,TCP反向的ident掃描,FTP反彈掃描等。全部這些掃描的類型有本身的優勢和缺點,咱們接下來將討論這些問題。
Nmap的使用取決於目標主機,由於有一個簡單的(基本)掃描和預先掃描之間的差別。咱們須要使用一些先進的技術來繞過防火牆和***檢測/防護系統,以得到正確的結果。下面是一些基本的命令和它們的用法的例子:
掃描單一的一個主機,命令以下:
git
複製代碼數據庫
代碼以下:windows
#nmap nxadmin.com
#nmap 192.168.1.2
安全
掃描整個子網,命令以下:
服務器
複製代碼網絡
代碼以下:tcp
#nmap 192.168.1.1/24
ide
掃描多個目標,命令以下:
工具
複製代碼
代碼以下:
#nmap 192.168.1.2 192.168.1.5
掃描一個範圍內的目標,以下:
複製代碼
代碼以下:
#nmap 192.168.1.1-100 (掃描IP地址爲192.168.1.1-192.168.1.100內的全部主機)
若是你有一個ip地址列表,將這個保存爲一個txt文件,和namp在同一目錄下,掃描這個txt內的全部主機,命令以下:
複製代碼
代碼以下:
#nmap -iL target.txt
若是你想看到你掃描的全部主機的列表,用如下命令:
複製代碼
代碼以下:
#nmap -sL 192.168.1.1/24
掃描除過某一個ip外的全部子網主機,命令:
複製代碼
代碼以下:
#nmap192.168.1.1/24-exclude192.168.1.1
掃描除過某一個文件中的ip外的子網主機命令
複製代碼
代碼以下:
#nmap192.168.1.1/24-excludefilexxx.txt(xxx.txt中的文件將會從掃描的主機中排除)
掃描特定主機上的80,21,23端口,命令以下
複製代碼
代碼以下:
#nmap-p80,21,23192.168.1.1
從上面咱們已經瞭解了Nmap的基礎知識,下面咱們深刻的探討一下Nmap的掃描技術
Tcp SYN Scan (sS)
這是一個基本的掃描方式,它被稱爲半開放掃描,由於這種技術使得Nmap不須要經過完整的握手,就能得到遠程主機的信息。Nmap發送SYN包到遠程主機,可是它不會產生任何會話.所以不會在目標主機上產生任何日誌記錄,由於沒有造成會話。這個就是SYN掃描的優點.
若是Nmap命令中沒有指出掃描類型,默認的就是Tcp SYN.可是它須要root/administrator權限.
複製代碼
代碼以下:
#nmap -sS 192.168.1.1
Tcp connect() scan(sT)
若是不選擇SYN掃描,TCP connect()掃描就是默認的掃描模式.不一樣於Tcp SYN掃描,Tcp connect()掃描須要完成三次握手,而且要求調用系統的connect().Tcp connect()掃描技術只適用於找出TCP和UDP端口.
複製代碼
代碼以下:
#nmap -sT 192.168.1.1
Udp scan(sU)
顧名思義,這種掃描技術用來尋找目標主機打開的UDP端口.它不須要發送任何的SYN包,由於這種技術是針對UDP端口的。UDP掃描發送UDP數據包到目標主機,並等待響應,若是返回ICMP不可達的錯誤消息,說明端口是關閉的,若是獲得正確的適當的迴應,說明端口是開放的.
複製代碼
代碼以下:
#nmap -sU 192.168.1.1
FINscan(sF)
有時候TcpSYN掃描不是最佳的掃描模式,由於有防火牆的存在.目標主機有時候可能有IDS和IPS系統的存在,防火牆會阻止掉SYN數據包。發送一個設置了FIN標誌的數據包並不須要完成TCP的握手.
複製代碼
代碼以下:
<a href="mailto:root@bt:~#nmap-sF192.168.1.8">root@bt:~#nmap-sF192.168.1.8</a></p> <p>StartingNmap5.51at2012-07-0819:21PKT
Nmapscanreportfor192.168.1.8
Hostisup(0.000026slatency).
Notshown:999closedports
PORTSTATESERVICE
111/tcpopen|filteredrpcbind
FIN掃描也不會在目標主機上建立日誌(FIN掃描的優點之一).個類型的掃描都是具備差別性的,FIN掃描發送的包只包含FIN標識,NULL掃描不發送數據包上的任何字節,XMAS掃描發送FIN、PSH和URG標識的數據包.
PINGScan(sP)
PING掃描不一樣於其它的掃描方式,由於它只用於找出主機是不是存在在網絡中的.它不是用來發現是否開放端口的.PING掃描須要ROOT權限,若是用戶沒有ROOT權限,PING掃描將會使用connect()調用.
複製代碼
代碼以下:
#nmap-sP192.168.1.1
版本檢測(sV)
版本檢測是用來掃描目標主機和端口上運行的軟件的版本.它不一樣於其它的掃描技術,它不是用來掃描目標主機上開放的端口,不過它須要從開放的端口獲取信息來判斷軟件的版本.使用版本檢測掃描以前須要先用TCPSYN掃描開放了哪些端口.
複製代碼
代碼以下:
#nmap-sV192.168.1.1
Idlescan(sL)
Idlescan是一種先進的掃描技術,它不是用你真實的主機Ip發送數據包,而是使用另一個目標網絡的主機發送數據包.
複製代碼
代碼以下:
#nmap-sL192.168.1.6192.168.1.1
Idlescan是一種理想的匿名掃描技術,經過目標網絡中的192.168.1.6向主機192.168.1.1發送數據,來獲取192.168.1.1開放的端口
有須要其它的掃描技術,如FTPbounce(FTP反彈),fragmentationscan(碎片掃描),IPprotocolscan(IP協議掃描),以上討論的是幾種最主要的掃描方式.
Nmap的OS檢測(O)
Nmap最重要的特色之一是可以遠程檢測操做系統和軟件,Nmap的OS檢測技術在***測試中用來了解遠程主機的操做系統和軟件是很是有用的,經過獲取的信息你能夠知道已知的漏洞。Nmap有一個名爲的nmap-OS-DB數據庫,該數據庫包含超過2600操做系統的信息。Nmap把TCP和UDP數據包發送到目標機器上,而後檢查結果和數據庫對照。
複製代碼
代碼以下:
InitiatingSYNStealthScanat10:21
Scanninglocalhost(127.0.0.1)[1000ports]
Discoveredopenport111/tcpon127.0.0.1
CompletedSYNStealthScanat10:21,0.08selapsed(1000totalports)
InitiatingOSdetection(try#1)againstlocalhost(127.0.0.1)
RetryingOSdetection(try#2)againstlocalhost(127.0.0.1)
上面的例子清楚地代表,Nmap的首次發現開放的端口,而後發送數據包發現遠程操做系統。操做系統檢測參數是O(大寫O)
Nmap的操做系統指紋識別技術:
設備類型(路由器,工做組等)
運行(運行的操做系統)
操做系統的詳細信息(操做系統的名稱和版本)
網絡距離(目標和***者之間的距離跳)
若是遠程主機有防火牆,IDS和IPS系統,你可使用-PN命令來確保不ping遠程主機,由於有時候防火牆會組織掉ping請求.-PN命令告訴Nmap不用ping遠程主機。
複製代碼
代碼以下:
#nmap-O-PN192.168.1.1/24
以上命令告訴發信主機遠程主機是存活在網絡上的,因此沒有必要發送ping請求,使用-PN參數能夠繞過PING命令,可是不影響主機的系統的發現.
Nmap的操做系統檢測的基礎是有開放和關閉的端口,若是OSscan沒法檢測到至少一個開放或者關閉的端口,會返回如下錯誤:
複製代碼
代碼以下:
Warning:OSScanresultsmaybeunreliablebecausewecouldnotfindatleast1openand1closedport
OSScan的結果是不可靠的,由於沒有發現至少一個開放或者關閉的端口
這種狀況是很是不理想的,應該是遠程主機作了針對操做系統檢測的防範。若是Nmap不能檢測到遠程操做系統類型,那麼就沒有必要使用-osscan_limit檢測。
想好經過Nmap準確的檢測到遠程操做系統是比較困難的,須要使用到Nmap的猜想功能選項,–osscan-guess猜想認爲最接近目標的匹配操做系統類型。
複製代碼
代碼以下:
#nmap-O--osscan-guess192.168.1.1
下面是掃描類型說明
-sT
TCPconnect()掃描:這是最基本的TCP掃描方式。connect()是一種系統調用,由操做系統提供,用來打開一個鏈接。若是目標端口有程序監聽,connect()就會成功返回,不然這個端口是不可達的。這項技術最大的優勢是,你勿需root權限。任何UNIX用戶均可以自由使用這個系統調用。這種掃描很容易被檢測到,在目標主機的日誌中會記錄大批的鏈接請求以及錯誤信息。
-sS
TCP同步掃描(TCPSYN):由於沒必要所有打開一個TCP鏈接,因此這項技術一般稱爲半開掃描(half-open)。你能夠發出一個TCP同步包(SYN),而後等待迴應。若是對方返回SYN|ACK(響應)包就表示目標端口正在監聽;若是返回RST數據包,就表示目標端口沒有監聽程序;若是收到一個SYN|ACK包,源主機就會立刻發出一個RST(復位)數據包斷開和目標主機的鏈接,這實際上有咱們的操做系統內核自動完成的。這項技術最大的好處是,不多有系統可以把這記入系統日誌。不過,你須要root權限來定製SYN數據包。
-sF-sX-sN
祕密FIN數據包掃描、聖誕樹(XmasTree)、空(Null)掃描模式:即便SYN掃描都沒法肯定的狀況下使用。一些防火牆和包過濾軟件可以對發送到被限制端口的SYN數據包進行監視,並且有些程序好比synlogger和courtney可以檢測那些掃描。這些高級的掃描方式能夠逃過這些干擾。
些掃描方式的理論依據是:關閉的端口須要對你的探測包迴應RST包,而打開的端口必需忽略有問題的包(參考RFC793第64頁)。FIN掃描使用暴露的FIN數據包來探測,而聖誕樹掃描打開數據包的FIN、URG和PUSH標誌。不幸的是,微軟決定徹底忽略這個標準,另起爐竈。因此這種掃描方式對Windows95/NT無效。不過,從另外的角度講,可使用這種方式來分別兩種不一樣的平臺。若是使用這種掃描方式能夠發現打開的端口,你就能夠肯定目標註意運行的不是Windows系統。若是使用-sF、-sX或者-sN掃描顯示全部的端口都是關閉的,而使用SYN掃描顯示有打開的端口,你能夠肯定目標主機可能運行的是Windwos系統。如今這種方式沒有什麼太大的用處,由於nmap有內嵌的操做系統檢測功能。還有其它幾個系統使用和windows一樣的處理方式,包括Cisco、BSDI、HP/UX、MYS、IRIX。在應該拋棄數據包時,以上這些系統都會從打開的端口發出復位數據包。
-sP
ping掃描:有時你只是想知道此時網絡上哪些主機正在運行。經過向你指定的網絡內的每一個IP地址發送ICMPecho請求數據包,nmap就能夠完成這項任務。若是主機正在運行就會做出響應。不幸的是,一些站點例如:microsoft.com阻塞ICMPecho請求數據包。然而,在默認的狀況下nmap也可以向80端口發送TCPack包,若是你收到一個RST包,就表示主機正在運行。nmap使用的第三種技術是:發送一個SYN包,而後等待一個RST或者SYN/ACK包。對於非root用戶,nmap使用connect()方法。
在默認的狀況下(root用戶),nmap並行使用ICMP和ACK技術。
注意,nmap在任何狀況下都會進行ping掃描,只有目標主機處於運行狀態,纔會進行後續的掃描。若是你只是想知道目標主機是否運行,而不想進行其它掃描,纔會用到這個選項。
-sU
UDP掃描:若是你想知道在某臺主機上提供哪些UDP(用戶數據報協議,RFC768)服務,可使用這種掃描方法。nmap首先向目標主機的每一個端口發出一個0字節的UDP包,若是咱們收到端口不可達的ICMP消息,端口就是關閉的,不然咱們就假設它是打開的。
有些人可能會想UDP掃描是沒有什麼意思的。可是,我常常會想到最近出現的solarisrpcbind缺陷。rpcbind隱藏在一個未公開的UDP端口上,這個端口號大於32770。因此即便端口111(portmap的衆所周知端口號)被防火牆阻塞有關係。可是你能發現大於30000的哪一個端口上有程序正在監聽嗎?使用UDP掃描就能!cDcBackOrifice的後門程序就隱藏在Windows主機的一個可配置的UDP端口中。不考慮一些一般的安全缺陷,一些服務例如:snmp、tftp、NFS使用UDP協議。不幸的是,UDP掃描有時很是緩慢,由於大多數主機限制ICMP錯誤信息的比例(在RFC1812中的建議)。例如,在Linux內核中(在net/ipv4/icmp.h文件中)限制每4秒鐘只能出現80條目標豢紗鐗腎CMP消息,若是超過這個比例,就會給1/4秒鐘的處罰。solaris的限制更加嚴格,每秒鐘只容許出現大約2條ICMP不可達消息,這樣,使掃描更加緩慢。nmap會檢測這個限制的比例,減緩發送速度,而不是發送大量的將被目標主機丟棄的無用數據包。
不過Micro$oft忽略了RFC1812的這個建議,不對這個比例作任何的限制。因此咱們能夠可以快速掃描運行Win95/NT的主機上的全部65K個端口。
-sA
ACK掃描:這項高級的掃描方法一般用來穿過防火牆的規則集。一般狀況下,這有助於肯定一個防火牆是功能比較完善的或者是一個簡單的包過濾程序,只是阻塞進入的SYN包。
這種掃描是向特定的端口發送ACK包(使用隨機的應答/序列號)。若是返回一個RST包,這個端口就標記爲unfiltered狀態。若是什麼都沒有返回,或者返回一個不可達ICMP消息,這個端口就納入filtered類。注意,nmap一般不輸出unfiltered的端口,因此在輸出中一般不顯示全部被探測的端口。顯然,這種掃描方式不能找出處於打開狀態的端口。
-sW
對滑動窗口的掃描:這項高級掃描技術很是相似於ACK掃描,除了它有時能夠檢測處處於打開狀態的端口,由於滑動窗口的大小是不規則的,有些操做系統能夠報告其大小。這些系統至少包括:某些版本的AIX、Amiga、BeOS、BSDI、Cray、Tru64UNIX、DG/UX、OpenVMS、DigitalUNIX、OpenBSD、OpenStep、QNX、Rhapsody、SunOS4.x、Ultrix、VAX、VXWORKS。從nmap-hackers郵件3列表的文檔中能夠獲得完整的列表。
-sR
RPC掃描。這種方法和nmap的其它不一樣的端口掃描方法結合使用。選擇全部處於打開狀態的端口向它們發出SunRPC程序的NULL命令,以肯定它們是不是RPC端口,若是是,就肯定是哪一種軟件及其版本號。
所以你可以得到防火牆的一些信息。誘餌掃描如今還不能和RPC掃描結合使用。
-b
FTP反彈***(bounceattack):FTP協議(RFC959)有一個頗有意思的特徵,它支持代理FTP鏈接。也就是說,我可以從evil.com鏈接到FTP服務器target.com,而且能夠要求這臺FTP服務器爲本身發送Internet上任何地方的文件!1985年,RFC959完成時,這個特徵就能很好地工做了。然而,在今天的Internet中,咱們不能讓人們劫持FTP服務器,讓它向Internet上的任意節點發送數據。如同Hobbit在1995年寫的文章中所說的,這個協議"可以用來作投遞虛擬的不可達郵件和新聞,進入各類站點的服務器,填滿硬盤,跳過防火牆,以及其它的騷擾活動,並且很難進行追蹤"。咱們可使用這個特徵,在一臺代理FTP服務器掃描TCP端口。所以,你須要鏈接到防火牆後面的一臺FTP服務器,接着進行端口掃描。若是在這臺FTP服務器中有可讀寫的目錄,你還能夠向目標端口任意發送數據(不過nmap不能爲你作這些)。
傳遞給-b功能選項的參數是你要做爲代理的FTP服務器。語法格式爲:
-busername:password@server:port。
除了server之外,其他都是可選的。若是你想知道什麼服務器有這種缺陷,能夠參考我在Phrack51發表的文章。還能夠在nmap的站點獲得這篇文章的最新版本。
通用選項
這些內容不是必需的,可是頗有用。
-P0
在掃描以前,沒必要ping主機。有些網絡的防火牆不容許ICMPecho請求穿過,使用這個選項能夠對這些網絡進行掃描。microsoft.com就是一個例子,所以在掃描這個站點時,你應該一直使用-P0或者-PT80選項。
-PT
掃描以前,使用TCPping肯定哪些主機正在運行。nmap不是經過發送ICMPecho請求包而後等待響應來實現這種功能,而是向目標網絡(或者單一主機)發出TCPACK包而後等待迴應。若是主機正在運行就會返回RST包。只有在目標網絡/主機阻塞了ping包,而仍舊容許你對其進行掃描時,這個選項纔有效。對於非root用戶,咱們使用connect()系統調用來實現這項功能。使用-PT來設定目標端口。默認的端口號是80,由於這個端口一般不會被過濾。
-PS
對於root用戶,這個選項讓nmap使用SYN包而不是ACK包來對目標主機進行掃描。若是主機正在運行就返回一個RST包(或者一個SYN/ACK包)。
-PI設置這個選項,讓nmap使用真正的ping(ICMPecho請求)來掃描目標主機是否正在運行。使用這個選項讓nmap發現正在運行的主機的同時,nmap也會對你的直接子網廣播地址進行觀察。直接子網廣播地址一些外部可達的IP地址,把外部的包轉換爲一個內向的IP廣播包,向一個計算機子網發送。這些IP廣播包應該刪除,由於會形成拒絕服務***(例如smurf)。