发包真香之: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 python3

from 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 alive


if __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,下期介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【手眼标定】使用kalibr对imu和双目摄像头进行联合标定

使用kalibr对imu和双目摄像头进行联合标定 前言一、IMU标定二、双目摄像头标定三、手眼标定&#xff08;imu和双目摄像头的联合标定&#xff09; 前言 由于本文的imu、双目摄像头都是在ros2环境下开发&#xff0c;数据传输自然也是在ros2中。 但想要使用kalibr进行标定&#x…

Power BI 插件 DAX Studio 安装配置

1&#xff0c;dax studio 下载地址 DAX Studio | DAX Studio 2&#xff0c;安装配置&#xff08;几乎是默认&#xff09; 3&#xff0c;使用方法 打开DAX studio 默认支持Power povit, PBI/SSDT ,Tabular server。先打开PBI再打开DAX studio &#xff0c;不然如果只打开Dax …

ios18开发者预览,Beta 2升级新增镜像等功能

近日&#xff0c;苹果发布了 iOS 18 开发者预览版 Beta 2 升级&#xff0c;为 iPhone 用户带来了多项新功能。据了解&#xff0c;这些新功能包括 iPhone 镜像和 SharePlay 屏幕共享&#xff0c;以及其他新增功能。 据了解&#xff0c;iPhone镜像可以让Mac用户将iPhone屏幕镜像…

IPFoxy Tips:匿名海外代理IP的使用方法及注意事项

在互联网上&#xff0c;隐私和安全问题一直备受关注。为了保护个人隐私和数据安全&#xff0c;使用匿名代理IP是一种常用的方法。匿名代理IP可以隐藏用户的真实IP地址&#xff0c;使用户在访问网站时更加隐秘和安全。 本文将介绍匿名代理IP的基本原理和核心功能。 基本原则 匿…

【云原生】Docker可视化工具Portainer使用详解

目录 一、前言 二、docker可视化管理概述​​​​​​​ 2.1 什么是docker可视化管理 2.1.1 Docker可视化管理常用功能 2.2 为什么需要docker可视化管理工具 2.3 docker可视化工具带来的好处 三、常用的docker容器可视化管理工具解决方案 3.1 Portainer 3.2 Rancher 3…

作 业 二

cs与msf权限传递 1、进入cs界面,首先来到 Cobalt Strike 目录下&#xff0c;启动 Cobalt Strike 服务端 2、用客户端进 3、建立监听 4、生成脚本文件 5、开启服务&#xff0c;让win_2012 下载木马文件并运行 6、显示已经获取到了win的权限 转到Metasploit Framework 7、进去m…

6 序列数据和文本的深度学习

6.1 使用文本数据 文本是常用的序列化数据类型之一。文本数据可以看作是一个字符序列或词的序列。对大多数问题&#xff0c;我们都将文本看作词序列。深度学习序列模型(如RNN及其变体)能够从文本数据中学习重要的模式。这些模式可以解决类似以下领域中的问题&#xff1a; 自然…

vface贴图使用说明

第一部分&#xff1a;01_head 说明 geos&#xff1a;几何体正常导入DCC软件即可&#xff1b; maps&#xff1a;重点说明: ID_mask&#xff1a;做头部区域细节区分控制的遮罩图&#xff1b;官方有详细教程&#xff1b; XYZ_albedo_lin_srgb.1001.exr 颜色贴图正常使用即可&…

【曦灵平台】深度体验百度智能云曦灵平台之数字人3.0、声音克隆、直播等功能,AI加持就是不一样,快来一起体验

目录 资产数字人 2D数字人克隆声音克隆 AI卡片更多功能总结推荐文章 资产 可进行人像与声音的定制&#xff0c;让数字人形象和声音成为我们的专属资产&#xff0c;用于后续的内容生产工作 数字人 这里拍摄的视频分辨率和帧率必须要确保是官方要求&#xff0c;这里博主通过第…

再谈kettle两种循环之--调用http分页接口循环获取数据

再谈kettle两种循环之 – 调用http分页接口循环获取数据 1.场景介绍&#xff1a; 由于数据量比较大,接口有返回限制,需要用到循环分页获取数据 2.案例适用范围&#xff1a; 循环job可参考&#xff0c;变量运用可参考&#xff0c;调用http分页接口循环获取数据可参考&#…

【idea-jdk1.8】使用Spring Initializr 创建 Spring Boot项目没有JDK8

信息差真可怕&#xff01; 很久没创建springboot项目&#xff0c;今天使用idea的Spring Initializr 创建 Spring Boot项目时&#xff0c;发现java版本里&#xff0c;无法选择jdk1.8&#xff0c;只有17、21、22&#xff1b;前段时间也听说过&#xff0c;springboot将放弃java8&a…

Java面试问题(一)

一.Java语言具有的哪些特点 1.Java是纯面向对象语言&#xff0c;能够直接反应现实生活中的对象 2.具有平台无关性&#xff0c;利用Java虚拟机运行字节码文件&#xff0c;无论是在window、Linux还是macOS等其他平台对Java程序进行编译&#xff0c;编译后的程序可在其他平台上运行…

深入理解计算机系统 CSAPP 家庭作业7.13

用一下496页提到的工具咯 A: whereis libm.a file lidm.a gedit libm.a libm.a是个ASCII text文件打开一看原来 libm-2.27.a 和libmvec.a才是我们要看的 所以我们cd到目标地址后 ar -t libm-2.27.a ar -t libmvec.a B: gcc -Og bar5.c foo5.c 用之前的两个文件链接后生成…

使用AI机器学习,轻松解决化合物配比优化问题

为什么需要化合物配比的优化&#xff1f; 在化合物制造行业中&#xff0c;化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前&#xff0c;这一过程高度依赖于材料专家和工程技术人员的经验&#xff0c;通过反复试验来验证产品性能&#xff0c;确保其满足市场和客户的…

JavaWeb系列八: WEB 开发通信协议(HTTP协议)

HTTP协议 官方文档什么是HTTP协议快速入门页面请求的一个问题(分析)http请求包分析(get)http请求包分析(post)GET请求 POST请求分别有哪些http响应包分析常用的状态码说明状态码200状态码404状态码500状态码302状态码304 MIME类型MIME介绍常见的 MIME 类型 官方文档 HTTP常见请…

一家大型银行的电子课程示例

Logrus IT的专家为最大的金融公司之一开发了一门课程&#xff0c;作为一个交互式路线图&#xff0c;向用户介绍公司的业务部门。我们的设计师以企业风格创造了独特的布局&#xff0c;每个课程模块都被创造性地表示为一个单独的建筑。用户可以在部门之间进行非线性导航&#xff…

Java基础:常用类(四)

Java基础&#xff1a;常用类&#xff08;四&#xff09; 文章目录 Java基础&#xff1a;常用类&#xff08;四&#xff09;1. String字符串类1.1 简介1.2 创建方式1.3 构造方法1.4 连接操作符1.5 常用方法 2. StringBuffer和StringBuilder类2.1 StringBuffer类2.1.1 简介2.1.2 …

编程设计思想

健康检查脚本 nmap:扫描端口 while true do healthycurl B:httpPORT/healthy -i | grep HTTP/1.1 | tail -n 1 | awk {print $2} done 批量操作类型脚本&#xff08;记录每一步日志&#xff09; 将100个nginx&#xff1a;vn推送到harbor仓库192.168.0.100 根据镜像对比sha值…

jdk1.8升级到jdk11遇到的各种问题

一、第三方依赖使用了BASE64Decoder 如果项目中使用了这个类 sun.misc.BASE64Decoder&#xff0c;就会导致错误&#xff0c;因为再jdk11中&#xff0c;该类已经被删除。 Caused by: java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder 当然这个类也有替换方式&#xf…

mysql查询2个日期之间的数据,表字段只有年和月,无日期字段查询的解决

1.核心mysql查询 SELECT * FROM 表名 WHERE CONCAT(year, -, LPAD(month, 2, 0)) > 2022-02-08 AND CONCAT(year, -, LPAD(month, 2, 0)) < 2024-06-06;2.表结构 CREATE TABLE ys_datezzq (id int(10) NOT NULL AUTO_INCREMENT,bid int(10) NOT NULL DEFAULT 0 COMMEN…