Python灰帽——Scapy模块 / 数据包的构造、发送、接收、捕获

这篇具有很好参考价值的文章主要介绍了Python灰帽——Scapy模块 / 数据包的构造、发送、接收、捕获。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Scapy 库

基础

" 网络神器 " scapy 是 python 的一个第三方模块,能够发送、捕获、分析和铸造网络数据包

主要功能:扫描、识别、测试、攻击、包铸造、抓包分析

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

数据包的构造

在编辑器导入 scapy 包

from scapy.all import *
from  scapy.layers.inet import *

简单构造

pkt = IP()/TCP()
# 该包的结构包含 IP 部分和 TCP 部分

构造数据包

pkt = IP(src="10.9.47.66",dst="10.6.47.88")/TCP()

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

Scapy 中的分层结构

OSI 模型中的下层协议在前,以/隔开

Ether()/IP()/TCP()

Ether 类用于设置发送方和接收方的 MAC 地址

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

构造 HTTP、ICMP 包

pkt=IP()/TCP()/"GET / HTTP1.0\r\n\r\n"
pkt=IP(dst="192.168.147.215")/ICMP()
res=sr1(pkt)
res.show()

数据包的查看

查看数据包内容

pkt=IP()/TCP()
pkt.show()

显示的内容

###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = tcp
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \
###[ TCP ]### 
     sport     = ftp_data
     dport     = http
     seq       = 0
     ack       = 0
     dataofs   = None
     reserved  = 0
     flags     = S
     window    = 8192
     chksum    = None
     urgptr    = 0
     options   = ''

查看数据包格式

pkt=IP()/TCP()
ls(pkt)

显示的内容

version    : BitField  (4 bits)                  = 4               ('4')
ihl        : BitField  (4 bits)                  = None            ('None')
tos        : XByteField                          = 0               ('0')
len        : ShortField                          = None            ('None')
id         : ShortField                          = 1               ('1')
flags      : FlagsField                          = <Flag 0 ()>     ('<Flag 0 ()>')
frag       : BitField  (13 bits)                 = 0               ('0')
ttl        : ByteField                           = 64              ('64')
proto      : ByteEnumField                       = 6               ('0')
chksum     : XShortField                         = None            ('None')
src        : SourceIPField                       = '127.0.0.1'     ('None')
dst        : DestIPField                         = '127.0.0.1'     ('None')
options    : PacketListField                     = []              ('[]')
--
sport      : ShortEnumField                      = 20              ('20')
dport      : ShortEnumField                      = 80              ('80')
seq        : IntField                            = 0               ('0')
ack        : IntField                            = 0               ('0')
dataofs    : BitField  (4 bits)                  = None            ('None')
reserved   : BitField  (3 bits)                  = 0               ('0')
flags      : FlagsField                          = <Flag 2 (S)>    ('<Flag 2 (S)>')
window     : ShortField                          = 8192            ('8192')
chksum     : XShortField                         = None            ('None')
urgptr     : ShortField                          = 0               ('0')
options    : TCPOptionsField                     = []              ("b''")

数据包的发送

总览

发送数据包的函数 说明
sr(pkt) 发送数据包,接收所有返回包
返回值时两个列表,第一个列表包含收到了应答的数据包和对应的数据包
第二个列表包含未收到应答的数据包
sr1(pkt) 发送数据包,接收一个返回包
send(pkt) 发送数据包,不等待返回包
srp(pkt) 发送2 层数据包,等待回应
sendp(pkt) 发送2 层数据包,不等待返回包

数据包的发送

sr()

from scapy.all import *
from  scapy.layers.inet import *

pkt=IP(dst="192.168.147.215")/ICMP()
res,unres=sr(pkt)
res.summary()

# 接收到应答包的数据包和返回包保存到了 res 列表中,使用 res.summary() 可查看两个数据包中的内容
# 未接收到应答的数据包保存到 unres 列表中

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

send()

from scapy.all import *
from  scapy.layers.inet import *

pkt=IP(dst="192.168.147.215")/ICMP()
print(pkt.summary())
send(pkt)

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

二层数据包的发送(MAC 地址作为目标)

from scapy.all import *
from  scapy.layers.inet import *

pkt=Ether(dst="ff:ff:ff:ff:ff:ff")
print(pkt.summary())
sendp(pkt)

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

数据包的接收

查看响应包

res.show()
from scapy.all import *
from  scapy.layers.inet import *

pkt=IP(dst="192.168.147.215")/ICMP()
res=sr1(pkt)
res.show()

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

响应状态

res.type(回复的 ICMP 数据包的类型编号及含义)

类型(十进制) 内容
0 回送应答
3 目标不可达
4 原点抑制
5 重定向或改变路由
8 回送请求
9 路由器公告
10 路由器请求
11 超时
17 地址子网请求
18 地址子网应答

常用函数

总览

函数名 用途
lsc() 查看常用函数及其使用方法
raw() 以字节格式显示数据包内容
raw(pkt)
hexdump() 以十六进制数据表示数据包中的内容
hexdump(pkt)
summary() 使用不超过一行的摘要内容来简单描述数据包
pkt.summary()
show() 显示数据包的详细信息
pkt.show()
show2() 相比于 show() 增加了显示数据包的校验和
command() 显示出构造该数据包的命令
res.command()
wrpcap() 将数据包存储在文件中
wrpcap("tmp.cap",pkts)
rdpcap() 读取 .cap 文件中的数据包(注意格式为列表
pkts=rdpcap(temp.cap)

raw()

pkt=IP()/TCP()
print(raw(pkt))

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

hexdump()

pkt=IP()/TCP()
print(hexdump(pkt))

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

summary()

pkt=IP()/TCP()
print(pkt.summary())

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

command()

pkt=IP(src="192.168.147.238",dst="192.168.147.215")
res=sr1(pkt)
print(res.command())

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

数据包文件的存储、读取

使用wrpcap()函数存储时,可以将多个 pkt 使用存储为一个列表

使用rdpcap()函数读取数据包时注意为列表格式

from scapy.all import *
from  scapy.layers.inet import *
# IP(src="192.168.147.238",dst="192.168.147.215")

pkt1=IP(src="192.168.147.238",dst="192.168.147.215")/TCP()
pkt2=IP()/ICMP()
pkts=[pkt1,pkt2]

# 将数据包列表 pkts 存储在文件中
wrpcap("temp.cap",pkts)

# 读取存储数据包的文件(列表格式)
pkt_list=rdpcap("temp.cap")
# 第一个数据包的摘要
print(pkt_list[0].summary())
# 第二个数据包的详细数据
print(pkt_list[1].show())

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

sinff() 捕获数据包

参数

参数名 含义
filter 指定捕获数据包的过滤条件,例如指定捕获特定端口、特定协议等
dst host 192.168.1.1 and port 8080
iface 指定要使用的网卡,默认为第一个网卡
prn 指定一个回调函数,用于处理捕获到的每个数据包
count 指定捕获的数据包数量

filter

采用伯克利包过滤机制

限定符 解释
Type 表示指代的对象
如 IP 地址(host)、子网(net)或端口P(port)等
默认为 host
Dir 表示数据包的传输方向
常见 scr(源地址)、dst(目的地址)
默认为 “scr or dst”
Proto 便是数据包匹配的协议类型
常见 Ether、IP、TCP、ARP

过滤语句举例:

host 192.168.1.1

dst host  192.168.1.1

src port 8080

# 以太网(MAC 地址)源地址或者目的地址为 11:22:33:44:55:66
ether host 11:22:33:44:55:66

# 源 MAC 为 11:22:33:44:55:66 的数据包
ether src 11:22:33:44:55:66

# 源地址在 192.168.1.0/24 网段的数据包
src net 192.168.1.0/24

# 还可以使用 and、or、not 组合过滤
host 192.168.1.1 and port 8080

使用

from scapy.all import *

# 定义一个回调函数,输出数据包的概述
def callback(pkt):
    print(pkt.summary)
    
sniff(filter="icmp and host 192.168.147.215",iface="eth0",prn=callback,count=3)
# 过滤 192.168.147.215 的 icmp 报文
# 选择监听 eth0 网卡
# 指定定义好的回调函数 sniff
# 捕获三个数据包

运行后,开始监听

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全

此时,ping 过滤的主机,即可捕获到数据包

python scapy发送数据包,python,python,网络,服务器,网络安全,笔记,安全文章来源地址https://www.toymoban.com/news/detail-835408.html

到了这里,关于Python灰帽——Scapy模块 / 数据包的构造、发送、接收、捕获的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA:uart原理+tx发送模块+rx接收模块

    处理器与外部设备通信的两种方式: 串行通信: 指数据的各个位使用多条数据线同时进行传输。 并行通信: 将数据分成一位一位的形式在一条数据线上逐个传输。 串行通信的通信方式: 同步通信: 带时钟同步信号的数据传输,发送方和接收方在同一时钟控制下,同步传输

    2024年02月12日
    浏览(36)
  • python中导入模块/包的几种方式

    一、模块的导入方式 模块就是.py类型的Python文件 导入时不需要.py后缀,直接导入文件名即可 1.利用import直接导入: 语法:import module_name 使用方式:module_name.class_name或者module.func_name 2.利用import导入模块并设置一个别名 语法:import module_name as XXX 使用方式:XXX.class_name或者X

    2024年01月22日
    浏览(45)
  • python学习 - 模块与包的基础概念

    文章首发于我的个人博客:欢迎大佬们前来逛逛 python提供了一种方法,可以使得在文件编写 函数的定义 ,然后再另一个文件中可以导入这个文件中的函数的定义继而使用。这种文件就叫做 模块 。 模块可以导入另一个模块或者主模块中。 例如我们创建一个文件,内含两个函

    2023年04月19日
    浏览(35)
  • 使用合宙Air724UG物联网模块发送MQTT消息至EMQX服务器 MQTT如何发送消息 AIR724发送MQTT至腾讯云 腾讯云接收MQTT消息

    在上一篇关于物联网的文章中介绍了如何建立一个MQTT的EMQX服务器,有需要的同学可以点击查看。在这里服务器的作用相当于建立一个MQTT消息的中转站,消息先发送到服务器中,再在服务器进行转发消息。 那么有了一个转发的平台,如何在嵌入式终端中发送MQTT消息呢,在这

    2024年02月09日
    浏览(56)
  • python 发送和接收post请求

    bottle是python的web框架,只需要引用一个 .py 文件即可,点击去下载页

    2024年02月15日
    浏览(36)
  • TCP和UDP协议发送数据包的大小方面的知识介绍

    MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一

    2024年02月05日
    浏览(40)
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。比如STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等等,这些都是芯片内部的电路,它们的配置寄存器、数据寄存器都在芯片里面,操作简单,直接读写就行。但是有些功能STM32内部没有

    2024年02月04日
    浏览(61)
  • 串口通信-发送和接收数据

    目录 通信方式 硬件电路 软件部分 USART外设(同步/异步收发器) 波特率 引脚复用 初始化基本流程 发送 接收 语言简述 常用的函数 使用的结构体 引脚模式 打印数据的三种方法 使用printf 在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,

    2024年02月12日
    浏览(57)
  • 本地模拟发送、接收RabbitMQ数据

    日常开发中,当线上RabbitMQ坏境还没准备好时,可在本地模拟发送、接收消息 Docker安装RabbitMQ 【SpringCloud】整合RabbitMQ六大模式应用(入门到精通) Spring RabbitMQ 配置多个虚拟主机(vhost)

    2024年02月21日
    浏览(43)
  • 网络编程-UDP协议(发送数据和接收数据)

    需要了解TCP协议的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 通过此图,可以了解UDP所在哪一层级中 发送数据 接收数据 运行效果 1、 UDP是面向无连接通信协议 (通俗一点讲,就是不管是否已连接成功,直接发送数据),该特性正好与TCP协议相反,

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包