30分钟快速上手scapy

在前两篇博客中,笔者简单分享了如何使用scapy进行网络流量的分析,但比较粗略,没有详细说明,本文我们就0开始,一起快速学习一下scapy 框架的使用。

另附之前的两篇博客,有需要快速参考代码的请自取:
使用Scapy框架分析HTTP流量
使用 Scapy 分析网络包:Python 网络编程的利器

Scapy

Scapy is a powerful interactive packet manipulation library written in Python. Scapy is able to forge or decode packets of a wide number of protocols, send them on the wire, capture them, match requests and replies, and much more.

根据官方的说法, scapy的功能是 “packets manipulation in Python”,即用python操控packet, 这个说法相当贴切。
对于python的版本是有要求的,当前是需要高于 python 3.7.

安装

可以用pip非常方便的安装

pip install scapy

同时可以clone代码

git clone --depth 1 https://github.com/secdev/scapy
cd scapy
sudo ./run_scapy

scapy

应用

下面我们通过一些具体的例子快速学习框架的使用

操作packet

scapy中有一个特殊的运算符/,作用是 “stack packets”,把packet堆叠起来.
我们实际操作一下。

>>> packet = IP()/TCP()
>>> Ether()/packet

输出

<Ether  type=IPv4 |<IP  frag=0 proto=tcp |<TCP  |>>>

还可以列出packet中的字段,用ls方法

>>> ls(IP,verbose=True)
version    : BitField  (4 bits)                  = ('4')
ihl        : BitField  (4 bits)                  = ('None')
tos        : XByteField                          = ('0')
len        : ShortField                          = ('None')
id         : ShortField                          = ('1')
flags      : FlagsField                          = ('<Flag 0 ()>')MF, DF, evil
frag       : BitField  (13 bits)                 = ('0')
ttl        : ByteField                           = ('64')
proto      : ByteEnumField                       = ('0')
chksum     : XShortField                         = ('None')
src        : SourceIPField                       = ('None')
dst        : DestIPField                         = ('None')
options    : PacketListField                     = ('[]')

并且通过scapy,访问堆叠后的packet字段也非常方便

>>> p = Ether()/IP(dst="www.baidu.com")/TCP(flags="F")
>>> p.summary()
'Ether / IP / TCP 192.168.3.176:ftp_data > Net("www.baidu.com/32"):http F'
>>> print(p.dst)
88:44:77:be:33:41
>>> print(p[IP].src)
192.168.3.176

并且,在一个字段中,可以是有多个值的,通过遍历可以取出

>>> [p for p in IP(ttl=(1,5)) / ICMP()]
[<IP  frag=0 ttl=1 proto=icmp |<ICMP  |>>,<IP  frag=0 ttl=2 proto=icmp |<ICMP  |>>,<IP  frag=0 ttl=3 proto=icmp |<ICMP  |>>,<IP  frag=0 ttl=4 proto=icmp |<ICMP  |>>,<IP  frag=0 ttl=5 proto=icmp |<ICMP  |>>]

网络交互

我们用一个DNS查询作为例子展现网络交互. 网络交互的时候,通常会用到一个方法sr1,注意这里是自然数1,不是字母l.

构造并发送数据包

>>> dns_req=IP(dst="8.8.8.8")/UDP(dport=53)/DNS(rd=1,qd=DNSQR(qname='baidu.com')
...: )
>>> answer = sr1(dns_req,verbose=0)
>>> print(answer[DNS].an)
[<DNSRR  rrname='baidu.com.' type=A rclass=IN ttl=484 rdata=39.156.66.10 |>, <DNSRR  rrname='baidu.com.' type=A rclass=IN ttl=484 rdata=110.242.68.66 |>]
  • IP(dst="8.8.8.8"):构造一个IP层,目标地址设为8.8.8.8,这是Google的公共DNS服务器。
  • UDP():构造一个UDP层。
  • DNS():构造一个DNS层,默认是一个空的DNS查询。
  • IP() / UDP() / DNS():这三个层级的协议组合成一个完整的数据包。
  • sr1():发送这个数据包并等待一个响应包。sr1函数会返回收到的第一个响应数据包。

提取DNS响应

answer[DNS].an
  • answer是响应的数据包。
  • answer[DNS]:从响应数据包中提取DNS层。
  • answer[DNS].an:提取DNS层中的答案部分(an表示answer)。

通过这段代码,你可以发送一个简单的DNS查询请求到8.8.8.8,并获取这个请求的响应包,然后从响应包中提取DNS的答案部分。如果DNS查询成功并且有答案,这个部分将包含DNS响应的详细信息,如域名对应的IP地址等。如果没有答案,answer[DNS].an可能为None

可视化

scapy支持plot图形,可以方便我们进行可视化分析,下面我们看一个可视化的例子,为了方便输出图片,我们用jupyter.

# import所需要的包
from scapy.all import *

我们需要用srloop这个方法

srloop: Send a packet at layer 3 in loop and print the answer each time

ans, unans = srloop(IP(dst=["8.8.8.8", "8.8.4.4"]) / ICMP(), inter=.1, timeout=.1, count=100, verbose=False)

这段代码的主要功能是发送ICMP(Internet Control Message Protocol,互联网控制消息协议)包到指定的IP地址,然后接收返回的包。

解释如下:

  • IP(dst=["8.8.8.8", "8.8.4.4"]) / ICMP():这部分代码创建了一个ICMP包,目标IP地址是"8.8.8.8"和"8.8.4.4"。/操作符在Scapy中用来组合多个网络层的包。

  • srloop(...):这是Scapy的一个函数,用来发送包并接收响应。它会持续发送网络包,直到满足一定的条件。

  • inter=.1:这是发送包之间的时间间隔,单位是秒。这里设置为0.1秒。

  • timeout=.1:这是等待响应的超时时间,单位是秒。这里设置为0.1秒。

  • count=100:这是发送包的数量。

  • verbose=False:这是一个选项,决定是否打印详细的操作信息,设置为False则不打印。

最后,srloop函数返回两个值:ansunansans是一个列表,包含了接收到的响应包。unans也是一个列表,包含了没有接收到响应的包。

然后我们进行可视化

%matplotlib inline
ans.multiplot(lambda x_y: (x_y[1][IP].src, (x_y[1].time, x_y[1][IP].id)), plot_xy=True)

输出效果如下图所示
在这里插入图片描述

小结

本文介绍了scapy的安装使用,并通过例子给出了scapy强大功能的直接展现,希望本文能够帮助大家快速入门这个优秀的网络分析库,欢迎交流

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

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

相关文章

外贸如何找国外客户?

外贸客户开发国外客户可以使用多种软件来完成&#xff0c;以下是一些常用的软件推荐&#xff1a; 即时通讯软件&#xff1a; SKYPE&#xff1a;一款功能丰富的即时通讯软件&#xff0c;支持视频聊天、多人语音会议、文件传输等&#xff0c;方便与海外客户进行实时沟通。Line&a…

用增之Firebase

目录 简介 开发准备&#xff1a; 1、在Firebase平台创建项目 2、将项目关联到应用 3、项目配置 简介 前面讲了google ddl部分&#xff0c;本篇为Firebase的事件上报部分&#xff0c;包括在FireBase平台创建应用 &#xff0c; 如果有用到ddl…

【网络安全的神秘世界】JavaScript

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 01-JavaScript简介 JavaScript背景 2003年之前&#xff0c;JavaScript被称为“牛皮藓”&#xff0c;用来制作页面上的广告、弹窗、漂浮的广告 2004年&a…

小猪APP分发:让APP封装变得如此简单

你是否曾经在开发完一款APP后&#xff0c;为了封装、分发而头疼不已&#xff1f;别担心&#xff0c;小猪APP分发来拯救你了&#xff01;这款神器不仅能让你的工作变得更加高效&#xff0c;还能让你的APP在各大平台上顺利分发。 小猪APP封装www.ppzhu.net APP封装的挑战 开发一…

docker 停止重启容器命令start/stop/restart详解(容器生命周期管理教程-2)

Docker 提供了多个命令来管理容器的生命周期&#xff0c; 其中start、stop 和 restart。这些命令允许用户控制容器的运行状态。 1. docker start 命令格式&#xff1a; docker start [OPTIONS] CONTAINER [CONTAINER...]功能&#xff1a; 启动一个或多个已经停止的 Docker …

WLAN工作原理

目录 一、引言二、FAT AP的工作模式与挑战三、FIT APAC的组网方式四、CAPWAPI隧道技术五、WLAN网络的关键报文六、漫游机制七、总结 一、引言 随着无线网络的迅猛发展&#xff0c;WLAN&#xff08;无线局域网&#xff09;技术已广泛应用于各个领域&#xff0c;为企业和个人提供…

若依 ruoyi-vue element-ui el-cascader 级联选择器 选择任意一级选项,去掉单选按钮,选中点击后隐藏

Cascader 级联选择器 选择任意一级选项&#xff0c;去掉单选按钮。 这兄弟文章写的可以&#xff0c;查了一堆文章&#xff0c;基本搞完才发现。 官方的例子不支持选中后自动关闭&#xff0c;要点击旁边空白&#xff0c;并且单选框太小了。 <el-form-item label"所属地…

基于SSM+Jsp的二手手机回收平台系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

libsystemctlm-soc项目分析

概述 libsystemctlm-soc项目是Xilinx的SystemC库。 环境安装 verilator安装 # Prerequisites: #sudo apt-get install git help2man perl python3 make autoconf g flex bison ccache #sudo apt-get install libgoogle-perftools-dev numactl perl-doc #sudo apt-get insta…

JavaScript 从入门到精通Object(对象)

文章目录 对象文本和属性方括号计算属性 属性值简写属性名称限制属性存在性测试&#xff0c;“in” 操作符“for…in” 循环像对象一样排序 总结✅任务你好&#xff0c;对象检查空对象对象属性求和将数值属性值都乘以 2 对象引用和复制通过引用来比较克隆与合并&#xff0c;Obj…

Keil编译bin格式固件方法

打开Option选项卡&#xff0c;选择User&#xff0c;在After Build/Rebuild下面增加以下命令&#xff1a; fromelf.exe --bin -o "L.bin" "#L"

四川菊乐食品IPO终止:收入增速放缓,内控缺陷遭关注,产能过剩

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;四川菊乐食品股份有限公司&#xff08;下称“菊乐股份”或“菊乐食品”&#xff09;及其保荐人中信建投证券撤回上市申请文件。因此&#xff0c;深圳证券交易所决定终止对该公司首次公开发行股票并在主板上市的审核。…

一文看懂llama2(原理模型训练)

自从Transformer架构问世以来&#xff0c;大型语言模型&#xff08;Large Language Models, LLMs&#xff09;以及AIGC技术的发展速度惊人&#xff0c;它们不仅在技术层面取得了重大突破&#xff0c;还在商业应用、社会影响等多个层面展现出巨大潜力。随着ChatGPT的推出&#x…

提示词工程基础:定义与重要性

目录 一、引言二、提示词工程的定义1. 概念明晰2. 技术框架3. 功能作用 三、提示词工程的重要性1. 核心作用强调2. 提升效率与降低成本3. 推动技术发展与创新 四、提示词工程的组成部分1. 提示词设计2. 模型训练与调整3. 效果评估与优化 五、实际应用示例1. 虚拟助手2. 自动新闻…

宝塔部署vue+springboot过程(图文)

宝塔是傻瓜式操作部署&#xff0c;xshell是用linux命令部署 &#xffe5;过程&#xffe5; 整个流程具体服务器开端口在阿里云服务器打开3306端口&#xff08;有用到的端口都要打开&#xff09;宝塔&#xff1a;添加数据库获取数据库名、用户名、密码&#xff1b;点击“工具”…

JavaSE——【逻辑控制】(知识)

目录 前言 一、顺序结构 二、分支结构 三、循环结构 总结 前言 公元 3050 年&#xff0c;地球的科技已经发展到令人难以想象的地步。这天&#xff0c;艾米莉在自己的房间里启动了最新的虚拟旅行装置&#xff0c;下一秒&#xff0c;她发现小奥奇的博客更新了。立即放弃了虚…

我们设计制造MW级水冷负载电阻器-数据中心船舶岸电发电机组测试大功率负载RLC阻感容集装箱负载

UEPR系列电阻采用先进材料制造&#xff0c;采用专利设计&#xff0c;将电阻与冷却液完全隔离&#xff0c;为水冷应用提供重量轻、体积小、超大功率的解决方案。其革命性的模块化设计意味着它们可以串联在一起&#xff0c;以满足您的电力需求。应用于发电、电力传输、电气传动等…

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…

ChatGPT 宕机部分用户访问报错 api key开发应用不影响

就在今日4号下午&#xff0c;有部分用户反映ChatGPT访问报错&#xff0c;不幸的是&#xff0c;ChatGPT 目前对某些用户不可用 - 该问题已被发现&#xff0c;OpenAI 团队正在努力解决它 似乎就api 开发使用key的应用不受影响 以下是对接ChatGPT api key开发的应用正常对话

Numba 的 CUDA 示例(3/4):流和事件

本教程为 Numba CUDA 示例 第 3 部分。 按照本系列的第 3 部分&#xff0c;了解 Python CUDA 编程中的流和事件 介绍 在本系列的前两部分&#xff08;第 1 部分&#xff0c;第 2 部分&#xff09;中&#xff0c;我们学习了如何使用 GPU 编程执行简单的任务&#xff0c;例如高度…