《基于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.mzph.cn/pingmian/68859.shtml

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

相关文章

GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI

同学们好&#xff01;今天和大家分享的是 “改进型土壤调整植被指数MSAVI”&#xff0c;它能够更准确地反映植被生长状态&#xff0c;且广泛应用于植被覆盖监测、生态环境评估等领域。 1. MSAVI 改进型土壤调整植被指数&#xff08;MSAVI&#xff09;是一种针对植被覆盖区域土…

实现使用K210单片机进行猫脸检测,并在检测到猫脸覆盖屏幕50%以上时执行特定操作

要实现使用K210单片机进行猫脸检测&#xff0c;并在检测到猫脸覆盖屏幕50%以上时执行特定操作&#xff0c;以及通过WiFi上传图片到微信小程序&#xff0c;并在微信小程序中上传图片到开发板进行训练&#xff0c;可以按照以下步骤进行&#xff1a; 1. 硬件连接 确保K210开发板…

13 尺寸结构模块(size.rs)

一、size.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…

Qt 5.14.2 学习记录 —— 이십삼 绘图API

文章目录 1、概念2、API 1、概念 Qt的各个控件本质是画出来的。有时候现有控件无法完成所需功能&#xff0c;那就用绘图API来自定义控件。 QPainter提供一系列的绘图方法 QPaintDevice表示用户画的要放到哪个设备上&#xff0c;QWidget是它的子列 QPen是画笔 QBrush是画刷&…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

进阶数据结构——双向循环链表

目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版&#xff08;c&#xff09;八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表&#xff0c;双向循环链表是一种特殊的数据结构&…

稀疏混合专家架构语言模型(MoE)

注&#xff1a;本文为 “稀疏混合专家架构语言模型&#xff08;MoE&#xff09;” 相关文章合辑。 手把手教你&#xff0c;从零开始实现一个稀疏混合专家架构语言模型&#xff08;MoE&#xff09; 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…

作者新游戏1.0

目录 前言 正文 忘记 前言 今天&#xff0c;作者要创作一个关于末日丧尸的游戏&#xff0c;开整&#xff01; 正文 首先&#xff0c;我们创作一个标题 cout<<"作者新游戏!\n"; cout<<"1:查看\n";cout<<"2:提示\n";cout…

PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复

问题 在 PVE 中给 Debian 虚拟机新分配硬盘后&#xff0c;通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后&#xff0c;怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识&#xff1a;挂载硬盘和开启Samba共享。 新建一个虚拟机&#xf…

【黄啊码】DeepSeek提示词大道至简版

1.1 有效提问的五个黄金法 法则一&#xff1a;明确需求 错误示例&#xff1a; Γ帮我写点东西」 正确姿势&#xff1a; Γ我需要一封求职邮件&#xff0c;应聘新媒体运营岗位&#xff0c;强调B年公众号运营经验 法则二&#xff1a;提供背景 错误示例 &#xff1a; Γ分析这个…

Baklib如何改变内容管理平台的未来推动创新与效率提升

内容概要 在信息爆炸的时代&#xff0c;内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容&#xff0c;帮助用户有效地管理信息流。随着技术的发展&#xff0c;传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性&#xff0c;这促使市场需…

想品客老师的第天:类

类是一个优化js面向对象的工具 类的声明 //1、class User{}console.log(typeof User)//function//2、let Hdclass{}//其实跟1差不多class Stu{show(){}//注意这里不用加逗号&#xff0c;对象才加逗号get(){console.log(后盾人)}}let hdnew Stu()hd.get()//后盾人 类的原理 类…

Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;菜品管理 &#xff08;2&#xff09;公告管理 &#xff08;3&#xff09; 厨师管理 2、用…

Node.js常用知识

Nodejs 总结Node.js基础知识&#xff0c;便于定期回顾 1、fs 文件写入 1、require(‘fs’) 2、fs.writeFile() 3、fs.appendFile() 4、fs.createwriteStream&#xff08;&#xff09; //流式写入 ws.write() 文件读取 1、fs.readFile(‘’,(err,data)>{ }) const …

C#属性和字段(访问修饰符)

不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后&#xff0c;我们再来学习Maven高级。其实在前面的课程当中&#xff0c;我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习&#xff0c;相信大家对于 Maven 这款工具的基本使用应该没什…

100.1 AI量化面试题:解释夏普比率(Sharpe Ratio)的计算方法及其在投资组合管理中的应用,并说明其局限性

目录 0. 承前1. 夏普比率的基本概念1.1 定义与计算方法1.2 实际计算示例 2. 在投资组合管理中的应用2.1 投资组合选择2.2 投资组合优化 3. 夏普比率的局限性3.1 统计假设的限制3.2 实践中的问题 4. 改进方案4.1 替代指标4.2 实践建议 5. 回答话术 0. 承前 如果想更加全面清晰地…

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)

目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆&#xff0c;圆弧和椭圆 继续我们的…

文件系统分析

文件系统与磁盘管理详解 一、存储设备基础 1. 存储设备类型对比 设备类型特点典型接口应用场景机械硬盘依赖磁头机械读写&#xff0c;转速影响性能&#xff08;5400/7200/10000rpm&#xff09;&#xff0c;价格低容量大SATA/SAS冷数据存储、备份固态硬盘无机械结构&#xff…