如果需要知道当前某个IP段内有多少存活的机器,可以使用ping命令查看,虽然不是很准确,但是如果有IP响应了ping那么这个一定是一个存活的主机。
- 当IP数据包在对方计算机处理过程中出现未知的发送错误时,ICMP会向发送者传送错误事实以及错误原因等
- 信息查询由一个请求和一个应答构成的。只需要向目标发送一个请求数据包,如果收到了来自目标的回应,就可以判断目标是活跃主机,否则可以判断目标是非活跃主机
Ping命令是ICMP中较为常见的一种应用,经常使用这个命令来测试本地与目标之间的连通性,发送一个ICMP请求消息给目标主机,若源主机收到目标主机的应答响应消息,则表示目标可达,主机存在。
$\color{yellow}{但是该方法也存在一定的缺陷,就是当网络设备,例如路由器、防火墙等对ICMP采取了屏蔽策略时,就会导致扫描结果不准确。} $
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| from scapy.layers.inet import IP, ICMP, sr1 from random import randint from ipaddress import ip_network from threading import Thread import time
def ping_single(ip): ip_id = randint(1, 65535) icmp_id = randint(1, 65535) icmp_seq = randint(1, 65535) packet = IP(dst=ip, ttl=64, id=ip_id)/ICMP(id=icmp_id, seq=icmp_seq) response = sr1(packet, timeout=1, verbose=0) if response: print("[+] %s is alive" % str(ip))
def ping_scan(network): ip_list = ip_network(network) for ip in ip_list: t = Thread(target=ping_single, args=[str(ip)]) t.start()
if __name__ == '__main__': host = '14.215.177.0/24' t1 = time.time() ping_scan(host) t2 = time.time() print("[+] 本次扫描共花费 %s 秒" % (t2 - t1))
|