nmap掃描的方法
原文 the art of port scanning
tcp connect()
這種方式最簡單。直接與被掃描的端口建立tcp鏈接,如果成功,則說明端口開放,如果不成功則說明端口關閉的。這種掃描的特點是與被掃描端口建立完成的tcp鏈接,完整的tcp三次握手。優點主要是不需要root權限即可掃描端口。因為connect可以在用戶態直接調用
TCP SYN scanning
這種掃描方式又被稱為tcp半開放掃描。顧名思義,這種掃描不需要建立完整的tcp連接,即可掃描端口的狀態。發送tcp syn數據包,這個也是tcp握手的第一個包。如果端口開放,則會返回 tcp syn+ack數據包。如果端口關閉,則返回 tcp rst數據包。這樣我們就不用進行tcp 握手的第三步,也可以探測端口的狀態。這種掃描需要構建raw socket。所以需要root權限
TCP FIN scanning
有些時候防火墻繪過濾tcp syn數據包,有些時候會記錄syn數據包并檢測時候有nmap掃描。這時候可以使用TCP FIN scanning。這種方式很簡單。發送tcp FIN數據包到待測端口。如果返回RST數據包,則說明該端口關閉,如果無返回則說明該端口開放。這時tcp協議的一個BUG,所以這種掃描方式不一定百分之百可靠(例如windows),但是這種掃描方式適合大部分 *NIX 系統。
TCP NULL, FIN, and Xmas scans
在RFC 793的第65頁寫到,如果目的端口的是關閉的,并且接受到的tcp數據包如果可能會導致系統錯誤,則返回RST。如果開放的端口接受到諸如SYN RST ACK,則丟棄或者不做任何處理。根據此RFC描述,我們可以發送不包含SYN RST或者ACK標志的數據包,如果返回RST則說明端口是關閉狀態,如果什么都沒有返回則說明端口是開放狀態。
- Null scan
tcp flag headers 全為0 - FIN scan
只設置tcp FIN標志 - xmas scan
同時設置FIN PSH URG標志位。
上面這三種掃描的結果都是一致的,如果接受到到RST,則說明端口是關閉的。如果無響應,則端口可能是開放或者filteted狀態。如果返回icmp unreachable error(type 3, code 0, 1, 2, 3, 9, 10, 13),則說明端口一定是filtered的。
TCP ACK scan
這種掃描只設置tcp ack標志位。這種掃描一般來探測防火墻是否過濾被掃描的端口。如果掃描的端口未被防火墻保護,那么無論是開放或者是關閉,都會返回RST。nmap將該端口標記為未被封鎖的(unfiltered),但是不能確定該端口是開放或者關閉狀態。如果無響應,或者返貨icmp error,則該端口一定被防火墻封鎖了
TCP Window scan
tcp窗口掃描,如果接收到RST,則說明端口封鎖了。在某些操作系統,開放的端口會返回一個正數的tcp窗口值,如果端口關閉,則返回tcp窗口值為0或者負數。但是這種掃描不是很靠譜
TCP Maimon scan
這種掃描為發送同時設置FIN/ACK的數據包。如果返回RST,則說明端口是開放的,如果無響應,則是關閉狀態的。
IP protocol scan
這種是專門掃描ip協議的。掃描類似于udp掃描,如果IP協議號不存在,返回 icmp錯誤。具體沒用過,不太好寫
UDP ICMP port unreachable scanning
如果udp端口開放,則無響應。如果udp端口關閉,則會返回icmp unreachable error錯誤。這種掃描需要root權限,因為需要構建raw socket。
UDP connect掃描
這種直接一個一個建立udp連接,如果能建立,則說明端口開放,不能建立則端口關閉唄。