由于大多数边界路由器以及防火墙 会对ICMP数据包无应答,因此我们考虑从传输层角度来发现、探测目标主机
基于TCP/UDP进行探测
-
优点:
- 结果更可靠一些
- 被防火墙过滤的概率较低 -
缺点:
- 基于状态过滤的防火墙 可能过滤扫描
- 全端口扫描速度慢 -
TCP探测思路
- 未经请求的ACK——会收到目标主机返回的RST包 来判断目标是否在线
- 发送SYN——对方可能会返回SYN/ACK、RST -
UDP探测思路
- 向目标主机发送一个udp数据包,如果目标的端口在主机上没有开放,目标主机会返回一个ICMP数据包告诉你你端口不可达
TCP发现
TCP是要经过三次握手之后,双方才开始进行通信
此时当我们没有进行连接,直接向目标主机发送ACK数据包
目标主机会返回给我们一个reset字段
首先利用Scapy构建数据包
i=IP()
t=TCP()
r=(i/t) //构造数据包
r.display()
r[IP].dst =192.168.1.1 //设置地址
r[TCP].flags='A'
r.display()
a=sr1(r)
a.display()//查看包中的内容
收到目标主机返回的数据包,其中标志位(Flags)被置为了reset,由此我们得知 目标主机是存活的
同时我们通过抓包再看一下 可以看到标志位被置为reset
之后修改目标端口为11111(大概率不开放)
发现同样可以收到reset包
但有时此方法不奏效
(如下图对自己同一网段下的虚拟机发送同样的ack数据包)
同时 对刚刚不能够收到reset数据包的目标主机来说 更换端口也不会收到reset包
因此有结论: 能否收到来自目标主机的reset包与其端口是否开放无关 与目标主机对畸形数据包的配置有关 但同时 发现ping命令可以探测到目标主机在线 因此 我们要 通过多种工具对主机进行扫描
nmap
nmap 192.168.31.1-100 -PU3333 -sn //sn表示不进行端口扫描 udp方式
笔者进行第二次扫描时,发现又多出了几个结果 说明多次重复探测是有必要的
对目标地址进行扫描的过程中,进行抓包 又一次印证了 nmap使用的udp探测同样使用的原理是 如果目标主机的端口没有开放 但是主机存活 会返回一个ICMP端口不可达数据报 (同样的 nmap会对存活的主机再进行一次 域名反向解析 )
nmap 192.168.31.1-100 -PA3333 -sn //ack方式
没有发现任何主机
原理也是一样 发送畸形数据包 使目标主机返回一个 reset包 不过看来没有奏效
Hping3
hping3 -2 1.1.1.1 -c 1 //使用 udp进行探测
hping3 1.1.1.1 -c 1 (TCP)
可以看到的是 与nmap不同 hping3将一个标志位全为0的tcp数据包发往了目标 等待目标返回信息
小结:在目标主机设置禁止ping的情况下,我们可以考虑利用TCP/UDP协议来继续对目标主机进行探测
TCP方法的思路是 向目标主机发送畸形的TCP数据包 对方会返回 reset数据包
UDP方法的思路是 向目标主机关闭的端口发送数据包 对方会返回一个ICMP报文告知你端口不可达 从而判断目标主机是否存活