一、检测原理
scapy模块
scapy是python的第三方模块,被称为”网络神器“。scapy模块能发送、捕获、分析和铸造网络数据包。检测原理是通过向目标主机发送数据包,查看是否有返回包,有则主机存活,无则主机不存活。
①安装
windows下安装scapy。
pip install scapy
python -m pip install scapy
安装成功后可在命令提示符中输入scapy进行使用
②构造数据包
构造数据包基于两个协议:tcp/ip协议
构造数据包
pkt= IP(src="",dst="")/TCP()
或
pkt= IP(src="",dst="")/ICMP()
查看数据包内容
pkt.show()
③发送数据包
res = 发送函数
发送数据包的函数 | 说明 |
---|---|
sr(pkt) | 发送数据包,接收所有返回包 |
sr1(pkt) | 发送数据包,接受一个返回包 |
send(pkt) | 发送数据包,不等待返回包 |
srp(pkt) | 发送2层数据包,等待回应 |
sendp(pkt) | 发送2层数据包,不等待返回包 |
实例
pkt =IP(src="10.9.75.143",dst="10.9.75.254")/TCP() //构造数据包,由本机向254发包
pkt.show() //查看数据包
res=sr1(pkt) //发送数据包
④ICMP消息类型和编码类型
Type类型 | Code编码 | 描述 |
---|---|---|
0 | 0 | |
3 | 0/1/2/3 | 网络/主机/协议/端口不可达 |
5 | 0 | 重定向 |
8 | 0 | echo request |
二、代码编写
"""
导包
"""
from scapy.layers.inet import * # scapy相关模块
from scapy.all import * # scapy相关模块
from sqlmap.thirdparty.termcolor.termcolor import colored # 颜色模块
import logging # 日志模块
"""
使用logging模块过滤除error外其他级别的日志消息
"""
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
"""
使用变量接收源ip,目的ip,目标网段,本机,起始,结束主机位
"""
netmask = input("请输入目标网段+. 例如10.9.75.\n") # 定义网段,并由用户输入
src = input("请输入本机主机位\n") # 定义本机主机位
src = f"{netmask}{src}" # 定义源ip,由网段.本机主机位拼接
i = int(input("输入扫描起始主机位\n")) # 定义起始主机位,由用户输入
j = int(input("输入扫描结束主机位\n")) # 定义结束主机位,由用户输入
print(f"在主机范围{i}-{j}中,以下主机存活\n") # 打印信息
j += 1 # 由于range函数左闭右开,所以j需要+1
"""
功能实现
"""
for i in range(i, j): # 在range范围内循环
dst = f"{netmask}{i}" # 拼接目的ip
if dst == src: # 如果目的ip等于源ip则输出,并跳出本次循环
print(f"{dst}为本机ip")
continue
pkt = IP(src=src, dst=dst) / ICMP() # 构建数据包
res = sr1(pkt, timeout=0.2, verbose=False) # 发送数据包
if res and res.type == 0: # 如果类型为0,则主机存在
print(colored(f"{dst}存在", "green"))
# print(f"{dst}存在")
print("扫描结束\n")