内网主机存活检测程序
scapy
" 网络神器 " scapy
是 python 的一个第三方模块,能够发送、捕获、分析和铸造网络数据包
主要功能
扫描、识别、测试、攻击、包铸造、抓包分析
安装
Windows 下安装
python -m pip install scapy
Kali 自带 scapy 环境
调用 scapy 模块
-
安装完成后可以直接在 cmd 中输入命令进入
scapy
模块scapy
-
在编辑器导入 scapy 包
from scapy.all import * from scapy.layers.inet import *
构造数据包
-
简单构造
pkt = IP()/TCP() # 该包的结构包含 IP 部分和 TCP 部分
-
构造数据包
pkt = IP(src="10.9.47.66",dst="10.6.47.88")/TCP()
查看数据包
-
构造后查看数据包
pkt.show()
显示内容
###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = None src = 10.9.47.90 dst = 127.0.0.1 \options \ ###[ TCP ]### sport = ftp_data dport = http seq = 0 ack = 0 dataofs = None reserved = 0 flags = S window = 8192 chksum = None urgptr = 0 options = ''
发送数据包
发送数据包的函数 | 说明 |
---|---|
sr(pkt) | 发送数据包,接收所有返回包 |
sr1(pkt) | 发送数据包,接收一个返回包 |
send(pkt) | 发送数据包,不等待返回包 |
srp(pkt) | 发送2 层数据包,等待回应 |
sendp(pkt) | 发送2 层数据包,不等待返回包 |
res = sr1(pkt)
# pkt 为发送的包名
内网主机存活检测程序
发送 ICMP 报文检测
cmd 启动 scapy
>>> pkt = IP(src="10.9.47.90",dst="10.9.47.24")/ICMP()
>>> res = sr1(pkt)
'''
收到回复
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
'''
res.show()
# 查看回应报文
reply,存活
res.type(回复的 ICMP 数据包的类型编号及含义)
类型(十进制) | 内容 |
---|---|
0 | 回送应答 |
3 | 目标不可达 |
4 | 原点抑制 |
5 | 重定向或改变路由 |
8 | 回送请求 |
9 | 路由器公告 |
10 | 路由器请求 |
11 | 超时 |
17 | 地址子网请求 |
18 | 地址子网应答 |
筛选存活的主机
if res and res.type == 0:
# 如果收到包并且状态码为 0,则确认存活
print("ip is live")
添加以下代码可以避免检测到主机未存活时返回错误
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
内网主机存活检测脚本
源码
from scapy.all import *
from scapy.layers.inet import *
import logging
# 防止扫描的主机未存活时报错
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
src = input("输入你的 ip 地址:")
# 默认掩码为 24 位
net_cut = src.split(".")
net = ""
for i in range(3):
# 输出 ip 前 24 位
net += net_cut[i]+"."
for i in range(1,255):
# ip 前 24 位加 1~254 遍历内网内所有 ip
dst = net+f"{i}"
# 构造 icmp 报文
pkt=IP(src=src,dst=dst)/ICMP()
# 发送数据包,并设置超时时间,去除多余输出
res = sr1(pkt,timeout = 0.2,verbose=False)
# 如果收到包并且状态码为 0,则确认存活,输出结果
if res and res.type==0:
print(f"[+] {dst} is alive")
else:
pass
效果