發現的目的是掃描出可能存活的IP地址,四層發現雖然涉及端口掃描,可是並不對端口的狀態進行識別,其本質是利用四層協議的一些通訊來識別主機ip是否存在服務器
傳統TCP鏈接是經過三次握手創建通訊過程,而後能夠向目標發送資源申請的請求,本機再發送ack進行確認,這是一種基於鏈接的可靠的通訊協議。若是咱們以前沒有創建TCP鏈接,而是直接向目標發送ack,這時目標服務器回想本機發送一個RST包進行拒絕,所以,當目標服務器拒絕時,即可以基於次探測目標主機是否存在了!也能夠經過三次握手創建通訊鏈接,經過發送的SYN包來肯定目標主機是否在線。tcp
UDP不一樣於TCP,UDP沒有經過握手創建鏈接的過程,UDP只是盡力而爲而已,它是一種非鏈接的不可靠傳輸協議,所以基於UDP來探測主機,難度和發現的準確率都高於TCP。一樣是基於UDP的一些特徵信息來探測。spa
若是目標IP不在線,那咱們對其發送的UDP包不會有任何的迴應,但假如目標IP在線,並且發送到UDP的目標端口處於開放狀態,通常說來,這時目標主機接受到個人UDP包時也不會有任何迴應,但有一種列外,便是目標端口沒有開放時,會向咱們發送一個ICMP不可達的包(可是到這裏咱們並不對其端口進行掃描)code
將TCP包頭的flag位設定爲ACK,而後發送給一個目標/端口,最後判斷是否收到RST響應包,以此肯定目標IP是否在線。不管是基於幾層的探測掃描,獲得結果也只不過是一種極大可能的參考,一切均可能不是真實的ip
先構造三層ip包,再構成四層tcp,而後將三層/四層組合起來構成一個TCP包資源
root@:~# scapy >>> i=IP() >>> t=TCP() >>> r=(i/t) >>> r.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= None src= 127.0.0.1 dst= 127.0.0.1 \options\ ###[ TCP ]### sport= ftp_data dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= [] >>> r[IP].dst="192.168.1.1" >>> r[IP].dst="19 >>> r[IP].dst="192.168.1.1" >>> r[TCP].flags="A" >>> r.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= None src= 192.168.0.108 dst= 192.168.1.1 \options\ ###[ TCP ]### sport= ftp_data dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= A window= 8192 chksum= None urgptr= 0 options= [] >>>
發包:it
a=sr1(r)
上述過程用一行命令實現:io
a=sr1(IP(dst="192.168.0.1")/TCP(dport=80,flags="A"),timeout=1)
a=sr1(IP(dst="192.168.0.102")/UDP(dport=7345),timeout=1)
nmap不只能夠用於端口掃描,還能夠用於四層發現
參數-PU:基於UDPclass
nmap -PU -sn 221.22.0.1-50
-PA:基於TCP的ACK,-PS:基於TCP的SYNcli
nmap -PA80 -sn 221.22.0.1-50
--udp:基於UDP模式
hping3 --udp -c 1 211.144.145.1
若是我選擇一個內網中不存在的IP,會顯示端口不可達
基於這個提示,至少能夠肯定主機是存在的
不加參數--udp,默認使用TCP模式,凡是hping發送的tcp全部的flags位都是not set的,即都是0的狀態,它不一樣於udp的掃描,它經過返回的ack+rst包來判斷主機存活
hping3 -c 1 211.144.145.1