发现的目的是扫描出可能存活的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