UDP的基础概念
UDP全称是用户数据协议,在网络中它与TCP一样用于处理数据包,是一种无法连接的协议。在OSI模型中位于第4层——传输层,处于IP的上一层。
但基于UDP的或与主机发现技术和TCP不同,UDP没有三次握手。当想主机发送以个UDP数据包之后,目标是不会发出任何UDP数据包的。
不过,如果目标主机是处于活跃状态的,但是目标端口是关闭的时候,可以返回一个ICMP数据包,这个数据包的含义为:“unreachable”, 如果目标主机不处于活跃状态,这时收不到任何回应的。 接下来构造一个发往192.168.43.1的445端口的UDP数据包并将其发送出去。
data = IP(dst="192.168.43.1") / UDP(dport=445)
ans, unans = sr(data)
ans.summary()
运行结果: 这里是有回应的,就证明目标是处于活跃状态的,但是我们仔细看返回的包。
IP / UDP 192.168.43.156:domain > 192.168.43.1:microsoft_ds ==> IP / ICMP 192.168.43.1 > 192.168.43.156 dest-unreach port-unreachable / IPerror / UDPerror
其中有“port-unreachable”关键字样,而且返回的是ICMP类型的数据包,这就验证了目标端口是关闭的时候返回“unreachable”。
UDP探测目标是否存活
接下来我们可以按照我们前面的ICMP,ARP,TCP的写法进行编写UDP的探测工具。
from scapy.all import *
data = IP(dst="192.168.43.1") / UDP(dport=445)
ans, unans = sr(data, timeout=3)
if unans:
print("[*] 目标处于非活跃状态!")
for s, r in ans:
ip_s = s[IP].dst
ip_r = r[IP].src
if ip_s == ip_r:
print("[*] 目标%s" % ip_s)
print("[*] 存活!")
运行结果: 学习了这么多探测目标主机是否存活的文章,相信大家已经对此非常熟练了。