1.基于TCP协议
优点:
1.可路由且结果可靠
2.不太可能会被防火墙过滤
3.甚至可以发现端口
缺点:
速度较慢(三次握手)
利用Scapy发送ACK数据包:
配置数据包:
发送数据包:
看一下收到数据包的结果:
这里收到Reset,只要ip存在,无论这个端口是否开放,都会返回Reset数据包。
我们抓包看看:
基本会使用Scapy之后,可以写一个Scapy的脚本:
ack_ping.py
#!/usr/bin/python import logging import subprocess logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * if len(sys.argv)!= 2: print "Usage - ./ack_ping.py [/24 network address]" print "Example - ./ack_ping.py 10.14.4.129" sys.exit() address = str(sys.argv[1]) prefix = address.split(".")[0]+'.'+address.split(".")[1]+'.'+address.split(".")[2]+'.' for addr in range(1, 255): response = sr1(IP(dst=prefix+str(addr))/TCP(dport=2222,flags='A'),timeout=0.1,verbose=0) try: if int(response[TCP].flags)==4: print(prefix+str(addr)) except: pass
vi ack_ping.py
:set fileformat=unix
:wq
chmod u+x ack_ping.py
接下来就可以运行:
./ack_ping.py
就可以探测哪些ip存活
2.基于UDP协议
由于UDP协议的特性:
如果ip存在,我们将无法收到回应
反而:如果ip不存在,我们就会收到ICMP的不可达信息
所以,要注意使用时最好发送到基本不会使用到的端口
Scapy使用:
同理,写一个脚本:
#!/usr/bin/python import logging import subprocess logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * if len(sys.argv)!= 2: print "Usage - ./ping1.py [/24 network address]" print "Example - ./ping1.py 10.14.4.129" sys.exit() address = str(sys.argv[1]) prefix = address.split(".")[0]+'.'+address.split(".")[1]+'.'+address.split(".")[2]+'.' for addr in range(1, 254): response = sr1(IP(dst=prefix+str(addr))/UDP(dport=7634),timeout=0.1,verbose=0) try: if int(response[IP].proto)==1: print(prefix+str(addr)) except: pass
这种方式其实通常无法满足我们的需求
实际总是运用多种方式,arping,tcp等等结合在一起使用
3.Nmap工具
在三、四层的发现中,nmap是一个十分强大的工具:
四层发现参数:-PU端口:UDP -PA端口:TCP(ACK)
nmap的速度和scapy相比,快了很多,而且nmap扫描两遍
4.Hping命令
当然可以将hping命令写成脚本
#!/bin/bash prefix=$(echo $1 | cut -d"." -f 1-3) for addr in $(seq 1 254);do hping3 $prefix.$addr -c 1 >> r.txt done grep ^len r.txt | cut -d" " -f 2 | cut -d"=" -f 2 >> output.txt rm r.txt
总结:推荐使用nmap,毕竟这是最强大的工具。而我们如果想要细节定制,可以采用Scapy