如果需要知道当前某个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))