当前位置: 首页 > news >正文

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中,网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力,成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本,该脚本集成了 ARP 扫描、端口扫描以及 TCP 三次握手和简单聊天功能,为用户提供了一个多功能的网络工具集。

项目概述

Scapy 是一个功能强大的交互式数据包处理程序,允许用户发送、嗅探、解析和伪造网络数据包。通过 Scapy,开发者可以实现复杂的网络操作,如网络扫描、安全审计和网络通信。本文介绍的项目利用 Scapy 库,提供了一个命令行工具,支持 ARP 扫描、端口扫描以及 TCP 三次握手和简单聊天功能。

功能详解

1. ARP 扫描

ARP(地址解析协议)扫描用于检测局域网内活动的主机。通过发送 ARP 请求,ARP 扫描可以确定哪些 IP 地址对应的主机是在线的。

实现方式
  • 获取本地 MAC 地址。

  • 构造 ARP 请求包,发送给目标 IP 地址。

  • 接收并解析 ARP 响应,判断目标主机是否在线。

  • 输出在线主机的 IP 和 MAC 地址。

2. 端口扫描

端口扫描用于检测目标主机上开放的端口。通过发送 TCP SYN 包,端口扫描可以确定哪些端口处于开放状态。

实现方式
  • 构造 TCP SYN 包,发送给目标主机的指定端口。

  • 接收并解析 TCP 响应,判断端口是否开放。

  • 如果端口开放,发送 TCP RST 包关闭连接,避免对目标主机造成影响。

  • 输出开放的端口号。

3. TCP 三次握手及聊天

TCP 三次握手是建立可靠连接的基础。通过模拟 TCP 三次握手,用户可以与目标主机建立连接,并进行简单的聊天。

实现方式
  • 构造 TCP SYN 包,发送给目标主机的指定端口,等待 SYN/ACK 响应。

  • 收到 SYN/ACK 响应后,构造 TCP ACK 包,完成三次握手。

  • 进入聊天模式,接收用户输入的消息并发送给目标主机。

  • 接收并显示目标主机的响应。

  • 用户可以输入 exit 退出聊天。

代码结构

  • 导入模块: 导入 Scapy 库及其他必要的模块。

  • 函数定义: 定义 ARP 扫描、端口扫描和 TCP 三次握手及聊天的功能函数。

  • 命令行参数解析: 使用 argparse 模块解析命令行参数,支持选择不同的功能和指定目标 IP 地址、端口范围等。

  • 主函数: 根据命令行参数调用相应的功能函数。

使用方法

  1. ARP 扫描: 使用 --arp 参数扫描指定 IP 地址或网段,检测在线主机。

    python script.py --arp --ip 192.168.10.1-255
    
  2. 端口扫描: 使用 --port 参数扫描指定 IP 地址的端口,检测开放端口。

    python script.py --port --ip 192.168.10.1 --start-port 20 --end-port 100
    
  3. TCP 三次握手及聊天: 使用 --tcp 参数与指定 IP 地址的目标主机进行 TCP 三次握手,并进入聊天模式。

    python script.py --tcp --ip 192.168.10.1 --dst-port 55555
    

注意事项

  • ARP 扫描和端口扫描仅支持单一 IP 地址,不支持网段。

  • 运行脚本可能需要管理员权限,尤其是在发送和接收数据包时。

  • 使用这些工具时,请确保遵守相关法律法规,避免未经授权的网络扫描和通信。

结论

本文介绍的基于 Scapy 的网络工具集,提供了一个简洁而强大的解决方案,用于执行 ARP 扫描、端口扫描以及 TCP 三次握手和简单聊天。通过灵活的命令行参数,用户可以根据需要选择不同的功能,进行网络探测和通信。无论是在网络管理、安全审计还是学习和实验中,这个工具集都将是一个有价值的助手。

希望本文的介绍能够帮助读者更好地理解和使用这个基于 Scapy 的网络工具集,为网络操作和管理提供便利。

项目地址:https://github.com/2678509359/Scapy-based-network-scanning-tool

基于scapy的网络扫描工具-源码

import logging
import random
import argparsefrom scapy.arch import get_if_hwaddr
from scapy.config import conf
from scapy.layers.inet import TCP, IP
from scapy.layers.l2 import ARP
from scapy.packet import Raw
from scapy.sendrecv import sr1, send# 配置Scapy日志级别
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)def scapy_ip(start, end=10, network='192.168.10.'):local_mac = get_if_hwaddr(conf.iface)for i in range(start, start + end):ip = f'{network}{i}'try:pkg = ARP(op=1, psrc=ip, hwsrc=local_mac, pdst=ip)reply = sr1(pkg, timeout=3, verbose=False)if reply and ARP in reply and reply[ARP].op == 2:print(f'{ip} 在线,MAC 地址: {reply[ARP].hwsrc}')except Exception as e:continuedef scapy_port(ip, start_port=20, end_port=100, src_ip='192.168.10.101'):for port in range(start_port, end_port + 1):try:pkg = IP(src=src_ip, dst=ip) / TCP(dport=port, flags='S')reply = sr1(pkg, timeout=1, verbose=False)if reply and reply.haslayer(TCP) and reply[TCP].flags == 0x12:  # SYN/ACKprint(f'端口 {port} 开放')# 发送 RST 包关闭连接rst = IP(src=src_ip, dst=ip) / TCP(dport=port, flags='R', seq=reply[TCP].ack)send(rst, verbose=False)except Exception as e:continuedef scapy_tcp_handshake(ip, dst_port=55555, src_port=None):if src_port is None:src_port = random.randint(1024, 65535)# 第一次握手pkg_1 = IP(dst=ip) / TCP(sport=src_port, dport=dst_port, flags='S')reply = sr1(pkg_1, timeout=2, verbose=False)if not reply or not reply.haslayer(TCP) or reply[TCP].flags != 0x12:  # SYN/ACKprint("未收到 SYN/ACK 响应或响应不完整")return# 第二次握手seq_ack = reply[TCP].ackack_seq = reply[TCP].seq + 1pkg_2 = IP(dst=ip) / TCP(sport=src_port, dport=dst_port, flags='A', seq=ack_seq, ack=seq_ack)send(pkg_2, verbose=False)print("三次握手成功,开始发送聊天信息...")while True:message = input("输入消息发送 (或 'exit' 退出): ")if message.lower() == 'exit':breakpkg_chat = IP(dst=ip) / TCP(sport=src_port, dport=dst_port, flags='PA', seq=ack_seq, ack=seq_ack) / messagereply = sr1(pkg_chat, timeout=2, verbose=False)if reply and reply.haslayer(TCP) and reply[TCP].flags == 0x10:  # ACKack_seq += len(message)try:received = reply[Raw].load.decode('utf-8')print(f"收到响应: {received}")except UnicodeDecodeError:print("收到的响应无法解码为 UTF-8")elif reply is None:print("未收到响应")else:print("握手失败或连接关闭")def parse_arguments():parser = argparse.ArgumentParser(description="Scapy 网络工具集", formatter_class=argparse.RawTextHelpFormatter)group = parser.add_mutually_exclusive_group(required=True)group.add_argument("--arp", action="store_true", help="执行 ARP 扫描")group.add_argument("--port", action="store_true", help="执行端口扫描")group.add_argument("--tcp", action="store_true", help="执行 TCP 三次握手及聊天")parser.add_argument("--ip", type=str, required=True, help="目标 IP 地址或网段(例如 192.168.10.1 或 192.168.10.0/24)")parser.add_argument("--start-port", type=int, default=20, help="端口扫描起始端口(默认: 20)")parser.add_argument("--end-port", type=int, default=100, help="端口扫描结束端口(默认: 100)")parser.add_argument("--dst-port", type=int, default=55555, help="TCP 目标端口(默认: 55555)")return parser.parse_args()def main():args = parse_arguments()if args.arp:if '/' in args.ip:# 处理网段network, mask = args.ip.split('/')start_ip = int(network.split('.')[-1])end_ip = start_ip + (0xFFFFFFFF << (32 - int(mask))) - 1scapy_ip(start=start_ip, end=end_ip - start_ip + 1, network=f"{network}.{start_ip // 256}.{start_ip % 256}.")else:scapy_ip(start=int(args.ip.split('.')[-1]), network=args.ip.rsplit('.', 1)[0] + '.')if args.port:if '/' in args.ip:print("端口扫描不支持网段,请提供一个单一的IP地址。")else:scapy_port(args.ip, args.start_port, args.end_port)if args.tcp:if '/' in args.ip:print("TCP 握手不支持网段,请提供一个单一的IP地址。")else:scapy_tcp_handshake(args.ip, args.dst_port)if __name__ == '__main__':main()

基于scapy的网络扫描工具-源码解析

这段代码是一个使用 Scapy 库编写的 Python 脚本,用于执行网络扫描和 TCP 三次握手及聊天功能。以下是对代码的详细分析:

导入模块

  • logging: 用于配置 Scapy 的日志级别。

  • random: 用于生成随机端口号。

  • argparse: 用于解析命令行参数。

  • scapy 相关模块: 用于网络数据包的构造、发送和接收。

函数定义

scapy_ip(start, end, network)
  • 功能: 执行 ARP 扫描,检测指定网段内的在线主机。

  • 参数:
    • start: 起始 IP 地址的最后一个八位字节。

    • end: 结束 IP 地址的最后一个八位字节。

    • network: 网络前缀(例如 192.168.10.)。

  • 实现:
    • 获取本地 MAC 地址。

    • 遍历指定范围内的 IP 地址,发送 ARP 请求并等待响应。

    • 如果收到 ARP 响应且操作码为 2(表示 ARP 回复),则打印在线主机的 IP 和 MAC 地址。

scapy_port(ip, start_port, end_port, src_ip)
  • 功能: 执行端口扫描,检测指定 IP 地址的开放端口。

  • 参数:
    • ip: 目标 IP 地址。

    • start_port: 起始端口号。

    • end_port: 结束端口号。

    • src_ip: 源 IP 地址。

  • 实现:
    • 遍历指定范围内的端口号,发送 SYN 包并等待响应。

    • 如果收到 SYN/ACK 响应,则打印开放端口,并发送 RST 包关闭连接。

scapy_tcp_handshake(ip, dst_port, src_port)
  • 功能: 执行 TCP 三次握手,并启动一个简单的聊天功能。

  • 参数:
    • ip: 目标 IP 地址。

    • dst_port: 目标端口号。

    • src_port: 源端口号(可选,默认随机生成)。

  • 实现:
    • 执行 TCP 三次握手。

    • 进入一个循环,接收用户输入的消息并发送给目标 IP 和端口。

    • 接收并打印来自目标的响应。

parse_arguments()
  • 功能: 解析命令行参数。

  • 实现:
    • 使用 argparse 创建一个参数解析器。

    • 定义互斥的参数组(ARP、端口扫描、TCP 握手)。

    • 定义其他必要的参数(IP 地址、端口范围等)。

main()
  • 功能: 主函数,根据命令行参数调用相应的功能。

  • 实现:
    • 解析命令行参数。

    • 根据参数调用 scapy_ipscapy_portscapy_tcp_handshake 函数。

命令行参数

  • --arp: 执行 ARP 扫描。

  • --port: 执行端口扫描。

  • --tcp: 执行 TCP 三次握手及聊天。

  • --ip: 目标 IP 地址或网段。

  • --start-port: 端口扫描起始端口(默认 20)。

  • --end-port: 端口扫描结束端口(默认 100)。

  • --dst-port: TCP 目标端口(默认 55555)。

注意事项

  • ARP 扫描不支持网段,需要提供单一 IP 地址。

  • 端口扫描和 TCP 握手不支持网段,需要提供单一 IP 地址。

  • 代码中使用了 Scapy 的 sr1send 函数发送和接收数据包,这些操作可能需要管理员权限。

总结

这段代码提供了一个简单的网络工具集,可以用于 ARP 扫描、端口扫描和 TCP 三次握手及聊天。通过命令行参数可以灵活选择不同的功能。

 

相关文章:

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中&#xff0c;网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力&#xff0c;成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本&#xff0c;该脚本集成了 ARP 扫描、端口扫描以及 TCP…...

面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述

文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例&#xff1a;结构体的内存对齐分析&#xff1a; 内存对齐的常见规则&#xff1a;填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...

使用 Kotlin 将 Vertx 和 Springboot 整合

本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活&#xff0c;因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高&#xff0c;因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...

线性回归算法-01

线性回归简介 学习目标 了解线性回归的应用场景知道线性回归的定义 1 线性回归应用场景 房价预测销售额度预测贷款额度预测 2 什么是线性回归 2.1 定义与公式 线性回归(Linear regression)是利用 回归方程(函数)对 一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模…...

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…...

线性代数复习笔记

1. 课程学习 1.1 3Blue1Brown 线性代数 2. 基本术语 eigenvector&#xff08;特征向量&#xff09;&#xff1a;线性变换中方向保持不变的向量 可以视作3D旋转矩阵形成的旋转的轴...

你需要更深层次的解放

先谈一谈理性认知中的属性替换原则。简单来说&#xff0c;属性替换就是用简单的问题取代难题。 当人们需要评估属性A时&#xff0c;却发现评估属性B更容易一些&#xff08;A与B之间存在一定的关系&#xff09;&#xff0c;于是就改为评估属性B。这叫做属性替换。 作为一种认知…...

机器学习算法在网络安全中的实践

机器学习算法在网络安全中的实践 本文将深入探讨机器学习算法在网络安全领域的应用实践&#xff0c;包括基本概念、常见算法及其应用案例&#xff0c;从而帮助程序员更好地理解和应用这一领域的技术。"> 序言 网络安全一直是信息技术领域的重要议题&#xff0c;随着互联…...

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…...

DeepSeek相关技术整理

相关介绍 2024年12月26日&#xff0c;DeepSeek V3模型发布&#xff08;用更低的训练成本&#xff0c;训练出更好的效果&#xff09;671B参数&#xff0c;激活37B。2025年1月20日&#xff0c;DeepSeek-R1模型发布&#xff08;仅需少量标注数据&#xff08;高质量长cot&#xff…...

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…...

蓝桥杯之c++入门(二)【输入输出(上)】

目录 前言1&#xff0e;getchar和 putchar1.1 getchar()1.2 putchar() 2&#xff0e;scanf和 printf2.1 printf2.1.1基本用法2.1.2占位符2.1.3格式化输出2.1.3.1 限定宽度2.1.3.2 限定小数位数 2.2 scanf2.2.1基本用法2.2.2 占位符2.2.3 scanf的返回值 2.3练习练习1&#xff1a…...

消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347

消息队列 使用信号量、事件标志组和线标志进行任务同步时&#xff0c;只能提供同步的时刻信息&#xff0c;无法在任务之间进行数据传输。要实现任务间的数据传输&#xff0c;一般使用两种方式&#xff1a; 1. 全局变量 在 RTOS 中使用全局变量时&#xff0c;必须保证每个任务…...

算法题(55):用最少数量的箭引爆气球

审题&#xff1a; 本题需要我们找到最少需要的箭数&#xff0c;并返回 思路: 首先我们需要把本题描述的问题理解准确 &#xff08;1&#xff09;arrow从x轴任一点垂直射出 &#xff08;2&#xff09;一旦射出&#xff0c;无限前进 也就是说如果气球有公共区域&#xff08;交集&…...

谭浩强C语言程序设计(4) 8章(下)

1、输入三个字符串按照字母顺序从小到大输出 #include <cstdio> // 包含cstdio头文件&#xff0c;用于输入输出函数 #include <cstring> // 包含cstring头文件&#xff0c;用于字符串处理函数#define N 20 // 定义字符串的最大长度为20// 函数&#xff1a;…...

AlexNet论文代码阅读

论文标题&#xff1a; ImageNet Classification with Deep Convolutional Neural Networks 论文链接&#xff1a; https://volctracer.com/w/BX18q92F 代码链接&#xff1a; https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…...

62.病毒在封闭空间中的传播时间|Marscode AI刷题

1.题目 问题描述 在一个封闭的房间里摆满了座位&#xff0c;每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人&#xff0c;坐着的人可能带了口罩&#xff0c;也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒&#xff0c;病毒的传播速度是每秒钟感染距…...

Elixir语言的安全开发

Elixir语言的安全开发 引言 在当今这个互联网高度发展的时代&#xff0c;软件的安全性变得越来越重要。随着网络攻击的增多&#xff0c;软件漏洞的频繁暴露&#xff0c;开发者面临着前所未有的安全挑战。Elixir&#xff0c;作为一种现代化的函数式编程语言&#xff0c;以其高…...

Rust 条件语句

Rust 条件语句 在编程语言中&#xff0c;条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言&#xff0c;其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句&#xff0c;包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...