《基于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 三次握手及聊天。通过命令行参数可以灵活选择不同的功能。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11285.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通信易懂唠唠SOME/IP——SOME/IP协议简介

一 简介 1.1 面向服务的中间件 SOME/IP是Scalable service-Oriented MiddlewarE over IP (SOME/IP)的缩写&#xff0c;基于IP的可扩展面向服务的中间件。 1.2 广泛应用于汽车嵌入式通信 SOME/IP是一种支持远程通信的汽车/嵌入式通信协议 。支持远程过程调用&#xff08;RPC…

高温环境对电机性能的影响与LabVIEW应用

电机在高温环境下的性能可能受到多种因素的影响&#xff0c;尤其是对于持续工作和高负荷条件下的电机。高温会影响电机的效率、寿命以及可靠性&#xff0c;导致设备出现过热、绝缘损坏等问题。因此&#xff0c;在设计电机控制系统时&#xff0c;特别是在高温环境下&#xff0c;…

[SAP ABAP] SE11 / SE16N 修改标准表(慎用)

1.SE16N修改标准表 使用事务码ME16N进入到查询页面&#xff0c;填入要修改的标准表MARA&#xff0c;在事务码输入框中填入/H&#xff0c;回车之后点击按钮&#xff0c;进入Debug调试界面 把GD-SAPEDIT 与 GD-EDIT 的值更改为X然后点击按钮(快捷键按F8)进行下一步操作 可以在此…

小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5

闲鱼上收了一台CR6606和一台CR6609, 一直没时间研究, 趁春节假期把这两个都刷成 OpenWRT 配置说明 CPU: MT7621AT&#xff0c;双核880MHz内存: NT5CC128M16JR-EKI 或 M15T2G16128A, 256MB闪存: F59L1G81MB, 128MB无线基带芯片(BB): T7905DAN无线射频芯片(RF): MT7975DN无外置F…

CSS(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…

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

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

Observability:实现 OpenTelemetry 原生可观察性的商业价值

作者&#xff1a;来自 Elastic David Hope 利用开放标准和简化的数据收集转变组织的可观察性策略。 现代组织面临着前所未有的可观察性挑战。随着系统变得越来越复杂和分散&#xff0c;传统的监控方法难以跟上步伐。由于数据量每两年翻一番&#xff0c;系统跨越多个云和技术&am…

deep generative model stanford lecture note2 --- autoregressive

1 Introduction 在note1 已经明确了生成模型&#xff0c;是通过概率分布来拟合数据&#xff0c;这个部分采用自回归的模型结构来拟合数据。主要任务包括&#xff1a;选择什么样的自回归模型结构和设计什么样的loss函数来让模型收敛。 自回归模型结构的理论基础还是贝叶斯概率结…

C++模板初了解

这节我们来学习一下C的一个便捷之处——模板 文章目录 一、泛型编程 泛型编程的基本思想 泛型编程的优点 泛型编程的应用 二、模板 函数模板 函数模板格式 函数模板的原理 函数模板的实例化 1.隐式实例化 2.显示实例化 函数模板的匹配原则 类模板 类模板的格式 类模板的实例化 …

PPT演示设置:插入音频同步切换播放时长计算

PPT中插入音频&同步切换&放时长计算 一、 插入音频及音频设置二、设置页面切换和音频同步三、播放时长计算 一、 插入音频及音频设置 1.插入音频&#xff1a;点击菜单栏插入-音频-选择PC上的音频&#xff08;已存在的音频&#xff09;或者录制音频&#xff08;现场录制…

React

1. React 基础 1) 环境准备 创建项目 首先&#xff0c;通过 react 脚手架创建项目 npx create-react-app client --template typescriptclient 是项目名目前 react 版本是 18.x 运行项目 cd client npm start会自动打开浏览器&#xff0c;默认监听 3000 端口 修改端口 在…

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方&#xff0c;在空白处鼠标右键选择通过Code打开 打开Vscode&#xff0c;点击platformIO图标&#xff0c;选择PIO Home下的open&#xff0c;最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

3、从langchain到rag

文章目录 本文介绍向量和向量数据库向量向量数据库 索引开始动手实现rag加载文档数据并建立索引将向量存放到向量数据库中检索生成构成一条链 本文介绍 从本节开始&#xff0c;有了上一节的langchain基础学习&#xff0c;接下来使用langchain实现一个rag应用&#xff0c;并稍微…

【自然语言处理(NLP)】基于Transformer架构的预训练语言模型:BERT 训练之数据集处理、训练代码实现

文章目录 介绍BERT 训练之数据集处理BERT 原理及模型代码实现数据集处理导包加载数据生成下一句预测任务的数据从段落中获取nsp数据生成遮蔽语言模型任务的数据从token中获取mlm数据将文本转换为预训练数据集创建Dataset加载WikiText-2数据集 BERT 训练代码实现导包加载数据构建…

41【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…

NLP深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)

用稀疏向量表示文本&#xff0c;即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的&#xff0c;早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层&#xff0c;逼近目标&#xff0c;进而使这些单词嵌入的训练更加高效。…

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统&#xff0c;重复开发&#xff0c;维护多套版本 多种语言栈&#xff0c;对人员技能要求高 多种开发框架&#xff0c;不同的编程…

Windows11 不依赖docker搭建 deepseek-R1 1.5B版本(附 Open WebUi搭建方式)

零、前言 过年这几天发现 DeepSeek 非常火&#xff0c;试用了一下发现确实不错。与豆包、kimi、perplexity 这些相比完全不是一个次元的存在&#xff0c;特别是用ta写文章的时候体验非常好。所以试着自己搭一个环境。 一、安装 Ollama和DeepSeek-R1 我的安装方式很简单&#xf…

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…

springCload快速入门

原作者&#xff1a;3. SpringCloud - 快速通关 前置知识&#xff1a; Java17及以上、MavenSpringBoot、SpringMVC、MyBatisLinux、Docker 1. 分布式基础 1.1. 微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自…