发包真香之:scapy工具

scapy – python 可自由组包

参考学习:初识Scapy–Python的Scapy/Kamene模块学习之路

scapy 介绍

Scapy是基于Python语言的网络报文处理程序,它可以让用户发送、嗅探、解析、以及伪造网络报文,运用Scapy可以进行网路侦测、端口扫描、路由追踪、以及网络攻击。Kamene是Scapy的分支,一开始的Scapy并不支持Python 3,为了支持Python 3就诞生了Scapy3k这个分支,为了方便区分就把Scapy3k更名为了Kamene。注意:最新的Scapy是支持Python 3的(Scapy 2.4.0+)。
Scapy 官网: https://scapy.net/
image.png
image.png
Scapy Pypi包主页: https://pypi.org/project/scapy/

:::info
官方指导文档:https://scapy.readthedocs.io/en/latest/
:::

如何选择Python和Scapy的版本?
这是Scapy版本的兼容列表:

scapy 安装

sudo apt install python3-scapy

运行 scapy 后,会进入到 python 的环境

sudo scapy


这就是一个Python shell,所以可以用exit()退出它。

scapy 的使用

ping = IP(dst="http://www.baidu.com") / ICMP()

Scapy中的斜杠’ / ‘就是用来区分网络层次的,一般来说把底层的协议写在左边,把高层的协议写在右边,就像下面这样:
数据链路层协议 / 网络层协议 / 传输层协议 / 应用层协议及数据
下面是TCP/IP协议族关系表:
image.png一般来说我们不需要关心数据链路层的协议Scapy会为我们自动配置。
Scapy定义了很多函数和类,通过这些函数和类我们就可以构造数据包。这里的IP可以用来生成一个IP的报文头。

IP()

ping = IP(dst="http://www.baidu.com") 

有基础的朋友可能会说:“这明明是域名,不是IP地址!“。对,这确实是域名,但是Scapy功能非常强大,当你把dst赋值为域名时Scapy会自动调用一个名为Net的函数来解析域名。

list()

还可以指定掩码位数:

list(Net('http://www.baidu.com/30'))


然后我们再来看看ICMP协议:
ICMP(互联网控制消息协议)是互联网协议族的核心协议之一。它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决(维基百科)。ping就是基于ICMP协议的。

ICMP()

生成一个ICMP报文头:

ICMP只有5个字段这些字段分别的意思是:

  • type:ICMP的类型,标识生成的错误报文。
  • code:进一步划分ICMP的类型,该字段用来查找产生错误的原因。例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
  • chksum:校验码部分,这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,其中此校验码字段的值视为0。
  • id:这个字段包含了ID值,在Echo Reply类型的消息中要返回这个字段。
  • Seq:这个字段包含一个序号,同样要在Echo Reply类型的消息中要返回这个字段。

以下是ICMP type code的对应表:
一般来说只用记住这2个,type为8、code为0是ping的请求,type为0、code为0是ping的响应。
知道这些之后我们就可以构造一个ICMP请求报文头。注意Scapy会为每个报文设定默认值,调用ICMP函数默认就是构造一个ICMP请求,所以下面两条是等价的:
ICMP()
ICMP(type=8, code=0)
也可以查看对象的type,code属性值

ls(<协议名>)

通过ls函数就可以查看默认值
也可以同时查看实际值和默认值

ls(IP(dst="http://www.baidu.com"))

没有括号的是实际值,有括号的是默认值

_.show()

show()方法获取报文字段信息(在Python shell中下划线’_’表示上条语句执行结果)

长度(len),校验和(chksum)、协议(proto)等字段Scapy都会自动计算,所以我们只有3个字段需要注意一下,ttl、src、dst。

  • ttl: 生存时间值(Time To Live),当数据包每进行进行一次转发时TLL值就会减一,TTL为0时数据包就会被丢弃,TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到告警消息(路由追踪原理)。
  • src: 源地址(Source Address)数据发送者的地址
  • dst: 目的地址(Destination Address)数据接收者的地址

现在我们再回头看刚刚构造的ping请求包就应该可以明白其中的意思了:

ping = IP(dst="192.168.40.1") / ICMP()

注意: 为了方便演示我把地址换成了自己的网关
ICMP函数首先构造一个ping请求报文头,然后IP函数构造一个IP报文头设置目标为’192.168.40.1’,最后赋值给变量ping。
构造完数据包之后那我们就来发送数据包。

resultpkt = sr1(ping)

sr1函数发送一个数据包,再接收一个数据包,然后返回响应的数据包。发送成功会显示形如下面信息。

Received 3 packets意思是: 收到了3个包
got 1 answers意思是: 得到了一个应答。也就是我们需要的包。
rermaining 0 packets意思是: 剩余没有应答得包。
直接在命令行输入变量名就可以输出接收到的包信息了。

好了得到回显数据之后就可以通过一些方法来访问其中的数据了。通过下标访问每个报文数据:

这里可能有一点难理解,简单解释一下就是:对于IP协议来说ICMP报文头和Padding实际上就是一堆数据,当我们获取IP报文时它会把IP报文头和数据一起输出。对于获取ICMP报文也是如此,输出ICMP报文头和Padding数据**(报文实际上就是报文头加数据)**。

通过属性的形式获取字段
resultpkt[0].src

resultpkt[1].type

可以加下标也可以不加,但是推荐加上。例如我们想访问ICMP的校验和(chksum),不加标访问的是IP的校验和加下标[1]才可以访问ICMP的校验和

通过fields属性以字典的形式获取报文头
获取IP报文头:
resultpkt[0].fields

获取ICMP报文头 :
resultpkt[1].fields

获取Padding数据:
resultpkt[2].fields

既然是字典就可以通过键获取对应的值。
获取IP报文头的源地址:
resultpkt[0].fields[‘src’]

获取IP报文头的目标地址:
resultpkt[0].fields[‘dst’]

获取ICMP报文头的type值和code值:
resultpkt[0].fields[‘type’]
resultpkt[0].fields[‘code’]

还有一种高级的方法,通过协议下标来访问报文头:

就是把数字下标改为了对应协议的下标功能和数字下标基本一样,但是用协议下标可以增加程序的灵活性和可读性。

Scapy数据包收发机制

Scapy数据包发送函数:

  • sr1: 发送一个数据包并接收一个相匹配的数据包
  • srp1: 与sr1一样但是关注数据链路层(以后讲ARP协议时会用)
  • sr: 发送数据包并接收相匹配的数据包
  • srp: 与sr一样但是关注数据链路层(以后讲ARP协议时会用)
  • send: 只发送数据包不接收数据包
  • sendp: 与send一样但是关注数据链路层(以后讲ARP协议时会用)

下图就是Scapy sr函数发收流程图:

通过实例理解一下
生成一组数据包然后通过sr函数发送,timeout参数设置超时时间默认单位为秒,这里设置超时时间为10秒钟。

result = sr(IP(dst="10.72.1.0/24") / ICMP(), timeout=10)


直接输入变量名或用type函数就可以看到返回的数据是个元组

通过下标访问results中的数据

上图通过result[0],获取有响应的包的列表,用len函数获取长度,用display方法来展示数据。
result[0]里的每个素都是元组,每个元组都是由发送的包和它相匹配的应答包组成。

分别访问发送的包和接收的包
对于单个数据包的操作就和就前面的一样了
通过result[1]访问没有相应的请求数据表列表,里面的元素就是单个数据包。

scapy 实例

发送一个 RA 包

在Linux中,发送RA(Router Advertisement)包通常需要使用 scapy 这样的工具,它是一个强大的Python库,用于构建和发送网络数据包。以下是使用 scapy 发送RA包的命令示例:

sudo scapy

然后在 scapy 命令行中,你可以使用以下代码来构造和发送RA包:

from scapy.all import *# 构造RA包
ra_packet = Ether(dst="00:C0:02:12:35:8A") / IPv6(dst="ff02::1") / ICMPv6ND_RA()# 发送RA包
sendp(ra_packet, iface="你的网卡接口名")

在上述代码中:

  • Ether(dst=“00:C0:02:12:35:8A”) 指定了目的MAC地址。
  • IPv6(dst=“ff02::1”) 指定了IPv6的多播地址。
  • ICMPv6ND_RA() 构造了一个RA包。

请确保替换代码中的 “00:C0:02:12:35:8A” 为你的目的MAC地址,以及 “你的网卡接口名” 为你要发送数据包的网络接口名称(如 eth0wlan0 等)。

发送二层数据链路层包【MAC】

from scapy.all import Ether, sendp# 构造以太网帧
eth_frame = Ether(dst="00:C0:02:12:35:89")data = "hello mantic"# 发送以太网帧
sendp(eth_frame/data, iface="你的网络接口名")

Screenshot from 2024-03-06 13-16-00.png

发送 IP 包【IP】

使用scapy发包工具,从192.168.3.2 的电脑发送一个二层协议包到IP是192.168.3.1,mac地址是00:C0:02:12:35:89的开发板,包的内容是hello mantic

from scapy.all import Ether, IP, sendp# 构造以太网帧,指定目的 MAC 地址和源 MAC 地址
eth_frame = Ether(dst="00:C0:02:12:35:89")# 构造 IP 数据包,指定目的 IP 地址和源 IP 地址
ip_packet = IP(dst="192.168.3.1", src="192.168.3.2")# 自定义内容
data = "hello mantic"# 构造数据帧
packet = eth_frame/ip_packet/data# 发送数据帧
sendp(packet, iface="你的网络接口名")

开发一个ping扫描工具

下面代码的Git仓库地址: https://github.com/starunity/Sc

#!/usr/bin/env python3from scapy.all import *def pingscan(ip):"""pingscan(ip)Ping the incoming IP.ip: Pass in an IP like 192.168.1.0 or 192.168.1.0/24"""answer, uanswer = sr( \IP(dst=ip) / ICMP(), \timeout=10, verbose=False \)alive = []for send, recv in answer:if recv[ICMP].type == recv[ICMP].code == 0:alive.append(recv[IP].src)return aliveif __name__ == '__main__':ip = input("Enter IP address:")result = pingscan(ip)for i in result:print("{} is alive.".format(i))

第13行的sr函数里面的verbose参数是用来开启或关闭发收包详情的
verbose默认开启的效果:

verbose关闭的效果:

执行结果如下:

总结

scapy是一个很好用的发包工具,不过在使用中,是比较麻烦的,要自己组包需要写代码完成,不如hping3,下期介绍。

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

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

相关文章

已解决java.beans.IntrospectionException: 在Java Beans中内省过程失败的正确解决方法,亲测有效!!!

已解决java.beans.IntrospectionException: 在Java Beans中内省过程失败的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 检查命名规范 验证Getter/Setter匹配性 确认访问权限 审查类型一致性 简…

Android网络基础面试题之HTTPS的工作流程和原理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 工作流程 HTTPS 默认工作在 TCP 协议443端口&#xff0c;它的工作流程一般如以下方式&#xff1a; 1、TCP 三次同步握手 2、客户端验证服务器…

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时&#xff0c;主要分为…

字节豆包 MarsCode:AI 开发工具

MarsCode 是豆包旗下的智能编程助手&#xff0c;类似 GitHub Copilot 提供以智能代码补全为代表的核心能力&#xff0c;简单试用了下&#xff0c;免费&#xff0c;使用时需要手机号登录&#xff0c;代码补全还算 ok&#xff0c;聊天功能就有点差了。 还包括一个 AI 原生 IDE&am…

UNIAPP编译到微信小程序时,会多一层以组件命名的标签

UNIAPP编译到微信小程序时&#xff0c;会多一层以组件命名的标签 解决方案 可以配置virtualHost来配置 export default {options: {virtualHost: true} }

pygraphviz安装教程

踩了无数坑之后&#xff0c;终于把pygraphviz安装好了。 首先先说明我的配置情况&#xff0c;我是在pycharm里面使用anaconda的虚拟环境运行项目。要安装pygraphviz得先满足三个前置条件&#xff1a; &#xff08;1&#xff09;已安装python(version 3.10, 3.11, or 3.12) &…

DockerDesktop中mysql容器无法使用Exec窗口解决

解决前 需要登陆&#xff1a; 登陆后需要升级才能启动调试模式 需要订阅才能使用 解决后&#xff1a; 正常使用 解决方法&#xff1a; 不要在DockerDesktop中启动mysql容器&#xff0c;使用命令行启动 启动命令 docker run --name mysql_docker -e MYSQL_ROOT_PASSWORD12345…

怎么新建百度词条

新建百度词条是一个分步骤的过程&#xff0c;需要遵循一定的规则和流程。以下是百科参考网shaoshai整理详细的步骤&#xff1a; 点击输入图片描述&#xff08;最多30字&#xff09; 怎么新建百度词条 1. 注册百度账号 在创建百度词条之前&#xff0c;您需要先注册一个百度账号…

【LINUX】内核源码文件系统调用相关摸索

首先&#xff0c;先看看想测试那个系统调用&#xff0c;在应用层&#xff0c;如果使用C语言编程一般我们一来就是open函数&#xff0c;实际在测试的时候&#xff0c;直接用touch xxx.txt然后 echo "xxx" >> xxx.txt&#xff0c;这样就完成了文件创建和写文件的…

基于单片机光纤测距系统的设计与实现

摘要 &#xff1a; 光纤由于其频带宽 、 损耗低及抗干扰能力强等优点已被广泛地应用在通信 、 电子及电力方面 &#xff0c; 是我们生产生活中必不可少的媒介。 在实际的光纤实验 、 安装 、 运营和维护工作中 &#xff0c; 一种精准 、 轻便和易操作的光纤测距系统显得尤为重…

【系统架构设计师】七、信息安全技术基础知识(信息安全的概念|信息安全系统的组成框架|信息加解密技术)

目录 一、信息安全的概念 1.1 信息安全的基本要素和范围 1.2 信息存储安全 1.3 网络安全 二、信息安全系统的组成框架 2.1 技术体系 2.2 组织机构体系 2.3 管理体系 三、 信息加解密技术 3.1 数据加密 3.2 对称加密技术 3.3 非对称加密算法 3.4 数字信封 3.5 信…

springcloud-sentinel 限流组件中文文档

快速开始 欢迎来到 Sentinel 的世界&#xff01;这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以上的版本的运行时环境&#xff0c…

Windows 10,11 Server 2022 Install Docker-Desktop

docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 docker-compose Compose 是用于定义和运行…

centos 7.2 离线部署 mysql 5.7.37

1.安装依赖 清楚mysql从图的依赖 rpm -qa|grep mariadb 存在冲突依赖,进行卸载 rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64 确认gcc版本 ldd --version 安装mysql5.7所需要的依赖 mkdir -p /root/AllInstalls 只下载不安装,用于放到其他机器: yum inst…

Stateflow快速入门系列(-):构造并运行 Stateflow 图

Stateflow 提供了一种图形语言&#xff0c;包括状态转移图、流程图、状态转移表和真值表。您可以使用 Stateflow 来说明 MATLAB 算法和 Simulink 模型如何响应输入信号、事件和基于时间的条件。 Stateflow 使您能够设计和开发监控、任务调度、故障管理、通信协议、用户界面和混…

相亲交友微信小程序系统源码

开启浪漫邂逅新篇章 相亲交友——随着年龄的增长&#xff0c;越来越多的人开始关注自己的婚姻问题&#xff0c;为了提高相亲服务的质量&#xff0c;这款应用就可以拓宽在线社交网络范围。​ &#x1f491; 引言&#xff1a;邂逅爱情的新方式 在繁忙的都市生活中&#xff0c;寻…

十年,亚马逊云科技合作伙伴网络开启AI新征程

“十年之前&#xff0c;你不认识我&#xff0c;我不认识你&#xff0c;因为云计算我们携手并肩&#xff1b;十年之后&#xff0c;我们仍是伙伴&#xff0c;更是朋友&#xff0c;因为人工智能再次起程。”这就是今天的亚马逊云科技与其合作伙伴的真实写照。 2024年是亚马逊云科技…

板凳-------unix 网络编程 卷1-1简介

unix网络编程进程通信 unpipc.h https://blog.csdn.net/u010527630/article/details/33814377?spm1001.2014.3001.5502 订阅专栏 1>解压源码unpv22e.tar.gz。 $tar zxvf unpv22e.tar.gz //这样源码就被解压到当前的目录下了 2>运行configure脚本&#xff0c;以生成正确…

js+php 上传文件到服务器

https://andi.cn/page/621473.html

喂饭级AI神器!免代码一键绘制图表,文本数据秒变惊艳视觉盛宴!

由于目前的AI生成图表工具存在以下几个方面的问题&#xff1a; 大多AI图表平台是纯英文&#xff0c;对国内用户来说不够友好&#xff1b;部分平台在生成图表前仍需选择图表类型、配置项&#xff0c;操作繁琐&#xff1b;他们仍需一份规整的数据表格&#xff0c;需要人为对数据…