大家應該都知道,nmap是用來掃描端口的標桿級神器,我們經常在運維工作或安全評估中使用到它。在使用的時候,我們可能會碰到明明目標IP端口有開著,但是nmap卻死活掃描不出來,等了大半天卻得到一些不可靠的結果。那到底是nmap不行還是我們用法不對呢?下面且聽老司機娓娓道來。
為了提高掃描的效率,nmap在掃描指定IP之前會先判斷該IP是否存活,如果不存活則忽略,避免花太多的精力去掃描根本就不存在的IP。那nmap是怎么判斷目標IP是否存活呢?主要分三種情況:
如果目標IP是在本地網絡:
nmap會對該IP進行arp查詢,如果有響應則認定其是存活的。
如果目標IP不在本地網絡,且當前權限為普通用戶權限:
當前權限是普通用戶權限,nmap會默認會:
- 向目標的TCP 80端口發送TCP SYN包
- 向目標的TCP443端口發送TCP SYN包
對應的nmap參數為-PS80,443,只要任何一個端口收到響應則判定該IP是存活的。
如果目標IP不在本地,且當前權限為管理員權限,nmap則會:
- 向目標發送ICMP echo request(即ping請求)
- 向目標的TCP 443端口發送TCP SYN包
- 向目標的TCP 80端口發送ACK包
- 向目標發送ICMP timestamp request包
如果以上四個請分別對應-PE、PS443、-PA80、-PP參數,如果任意一個請求有應答,則認定目標是存活的。
舉個例子,如果我們執行nmap 8.8.4.4 -p 53命令確認8.8.4.4的TCP 53端口是否開啟,以上三種情形實際執行的nmap命令分別為:
- nmap 8.8.4.4 -p 53
- nmap 8.8.4.4 -p 53 -PS80 -PS443
- nmap 8.8.4.4 -p 53 -PE -PS443 -PA80 -PP
那接下來我們分別以管理員及普通用戶權限執行以下nmap 8.8.4.4 -p 53命令:
發現問題沒?普通用戶msf掃描不到53端口,為什么呢?
正如我們上面所提到的,如果當前用戶是普通用戶權限,nmap默認會通過目標IP的80及443端口來判斷目標IP是否存活,在這個例子中,目標80及443端口均不可達,所以nmap認為8.8.4.4是死的并不再繼續執行掃描動作。
所以,通過這篇文章我們應該學到:
1、nmap如果不正確使用,其掃描結果將不可靠。
2、nmap在掃描目標之前會先確定其是否存活,如果存活才會繼續執行掃描操作。
3、nmap可以通過-PE、-PS、PA、PP、-Pn等參數指定判斷目標存活狀態的條件。
4、nmap的默認參數不一定可靠,因此在執行時要明確指定你想要的參數。