发现——四层发现
四层发现简介:
四层发现虽然使用了端口的探测,但是并不对端口进行解析,只是利用了四层的通信,通过端口识别目标主机是否存活;
最终目的,判断目标IP是否存活;
优点:
可路由且结果可靠(根据TCP/UDP 探测端口,根据端口返回的结果,探测目标IP是否存活)
不太可能被防火墙过滤;
甚至可以发现所有端口都被过滤的主机;
缺点:
基于状态过滤的防火墙可能过滤扫描;
全端口扫描速度慢;
TCP发现:
TCP发现是直接发送ACK数据包,一般来说目标主机存活会返回一个RST数据包以终止这个不正常的TCP链接。也可以发送正常的SYN数据包,若果目标主机返回SYN/ACK或者SRT数据包,都可以证明目标主机存活。
UDP发现:
如果目标主机是存活的且UDP目标端口为关闭状态,目标主机就会返回一个目标端口不可达的数据包,这就可以证明目标主机是存活的;
如果目标主机是关闭的,或者目标主机存活且目标端口为开放的状态,都不会有任何数据包返回,不能证明目标主机存活,这也就是UDP发现时选择一个最不常用的端口的原因;
(1)scapy
1.1> ACK——TCP Port——RST(发现单个主机)
TCP发现是直接发送ACK数据包,一般来说目标主机存活会返回一个RST数据包以终止这个不正常的TCP链接。也可以发送正常的SYN数据包,若果目标主机返回SYN/ACK或者RST数据包,都可以证明目标主机存活。
root@root:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
INFO: Can't import python ecdsa lib. Disabled certificate manipulation tools
Welcome to Scapy (2.3.3)
>>> 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.37.128"
>>> 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.37.131
dst= 192.168.37.128
\options\
###[ TCP ]###
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}
>>> a=sr1(r)
Begin emission:
..*Finished to send 1 packets.
Received 3 packets, got 1 answers, remaining 0 packets
>>> a.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 21833
flags= DF
frag= 0L
ttl= 128
proto= tcp
chksum= 0xd932
src= 192.168.37.128
dst= 192.168.37.131
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R #返回RST包
window= 0
chksum= 0xe328
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
>>> r[TCP].dport=8888
>>> a.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 21833
flags= DF
frag= 0L
ttl= 128
proto= tcp
chksum= 0xd932
src= 192.168.37.128
dst= 192.168.37.131
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0xe328
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
>>> a1=sr1(r)
Begin emission:
..Finished to send 1 packets.
*
Received 3 packets, got 1 answers, remaining 0 packets
>>> a1.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 21874
flags= DF
frag= 0L
ttl= 128
proto= tcp
chksum= 0xd909
src= 192.168.37.128
dst= 192.168.37.131
\options\
###[ TCP ]###
spo