原理演示
在命令行下用下面命令安装scap模块:
python -m pip install scapy
scapy与scrapy 有非常大的区别。
scapy 是一个Python 的第三方模块,被称为“网络神器”。scapy 模块能够发送、捕获、分析和铸造网络数据sr1发送接收函数
如图,安装成功,并加载成功:
用pkt设置源IP和目标IP,协议为TCP
pkt=IP(src="10.9.75.238",dst="10.9.75.2")/TCP()
然后用sr1发送接收函数探测主机IP是否存活,超时时间设置为5秒:
res=sr1(pkt,timeout=5)
如下图,接收到1035个数据包,但是没有得到目标主机的回应,这是因为sr1函数在发送数据包的时候会一直处于监听状态,收到的1035个数据包是该局域网所有主机的数据包:
使用ICMP协议进行主机探测,并查看该pkt的配置:
pkt=IP(src="10.9.75.238",dst="10.9.75.2")/ICMP()
查看pkt的配置:
pkt.show()
如图,源IP和目标IP分别是10.9.75.238和10.9.75.2,ICMP的类型是request请求包:
发包后依然没有回应包,说明该主机没有存活:
脚本编写
verbose= False:隐藏发包过程,上述的点
from scapy.all import *和from scapy.layers.inet import *:载入IP()和ICMP()函数需要的包
import logging
logging.getLogger(“scapy.runtime”).setLevel(logging.ERROR):这两个模块可以隐藏warning报错信息,设置只显示最高级的报错ERRORfrom termcolor import colored:该模块可以提供文本变色的效果
print(colored(f"\n{ip} is ALINE",“green”))将存活的主机IP颜色变为绿色
ip=f"{netmask}{i}"将10.9.75.与for循环遍历的i拼接
from scapy.all import *
from scapy.layers.inet import *
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from termcolor import colored
netmask="10.9.75."
src="10.9.75.45"
for i in range(1,12):
ip=f"{netmask}{i}"
pkt=IP(src=src,dst= ip)/ICMP()
res = sr1(pkt,timeout= 1,verbose= False)
if res and res.type == 0:
print(colored(f"\n{ip} is ALTVE","green"))
else:
print(f"\r{ip} is NOT ALTVE")
结果如下,遍历11次,探测出两个存活IP:
如果将最后一句改为
print(f"\r{ip} is NOT ALTVE",end="")
输出结果就会原地输出,后面的输出会覆盖前面的,直到输出存活IP: