【Python】scapy模块学习笔记

article/2025/9/6 4:39:51

文章目录

  • 0x00 scapy安装以及环境配置
  • 0x01 实验1
  • 0x02 实验2
  • 0x03 实验3
  • 0x04 实验4
  • 0x04 实验5
  • 0x06 python代码实现端口扫描

0x00 scapy安装以及环境配置

学习自知乎大佬 ——弈心——网络工程师的Python之路—Scapy基础篇
复现了一波

scapy安装:

pip install scapy

导入scapy方式:

from scapy.all import *

然后是环境配置

kali的IP地址为192.168.43.245,使用的网卡为eth0
在这里插入图片描述

物理机的IP地址为192.168.43.1,就是kali的网关
在这里插入图片描述

进入scapy,这里我是在kali2020里面进行发送scapy构造的数据包,然后在本机用wireshark进行抓包接收。
在这里插入图片描述
物理机监听kali使用的这块网卡
在这里插入图片描述
然后是scapy的一些基本用法

首先是ls()命令,用来查看scapy支持的网络协议
在这里插入图片描述

除了ls()外,还可以用lsc()函数来查看scapy的指令集(函数)
在这里插入图片描述
这里还可以用使用ls()的携带参数模式,比如ls(IP)来查看IP包的各种默认参数。
在这里插入图片描述

0x01 实验1

实验目的:使用IP()函数构造一个目的地址为192.168.2.11(即拓扑中的交换机S1)的IP报文,然后用send()函数将该IP报文发送给S1,在S1上开启debug ip packet以验证是否收到该报文。

首先用IP()函数构造一个目的地址为192.168.43.1的IP报文,将其实例化给ip这个变量
在这里插入图片描述
ls(ip)查看这个报文的内容
在这里插入图片描述

然后用send()将这个数据包发送给物理机,send()函数只发送不接受
在这里插入图片描述
可以看到物理机已经接收到了这个ip报文
在这里插入图片描述

0x02 实验2

实验目的:除了send()外,scapy还有个sendp()函数,两者的区别是前者是发送三层报文,后者则是发送二层报文,实验2将演示如何用sendp()来构造二层报文。

除了send()外,scapy还有个sendp()函数,两者的区别是前者是发送三层报文,后者则是发送二层报文,实验2将演示如何用sendp()来构造二层报文。

先构造一个arp报文,如下

arp = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(hwsrc="00:0c:29:ef:29:24",psrc="192.168.43.245",pdst="192.168.43.1")/'abc'

在这里插入图片描述
这里我们构造了一个源MAC地址为00:0c:29:ef:29:24, 源IP地址为192.168.43.245,,目标IP地址为192.168.43.1,payload为abc的ARP报文。

然后sendp()发送出去

sendp(arp)

在这里插入图片描述
可以看到物理机接收到了来自kali的arp数据包,询问192.168.43.1的mac地址,并且物理机也把自己的mac地址返回给了kali
在这里插入图片描述问题:为什么目的MAC地址设置为FF.FF.FF.FF.FF.FF

我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

在局域网里抓了一会儿包,目的地址果然都是FF.FF.FF.FF.FF.FF,FF.FF.FF.FF.FF.FF就代表广播broadcast
在这里插入图片描述

0x03 实验3

实验目的:从实验1和实验2的例子可以看出:send()和sendp()函数只能发送报文,而不能接收返回的报文。如果要想查看返回的3层报文,需要用到sr()函数,实验3将演示如何使用sr()函数。

先构造一个目的地址为物理机的ICMP()包。可以看到返回的结果是一个tuple(元组),该元组里的元素是两个列表,其中一个列表叫Results(响应),另一个叫Unanswered(未响应)。
在这里插入图片描述
我们可以将sr()函数返回的元组里的两个元素分别赋值给两个变量,第一个变量叫ans,对应Results(响应)这个元素,第二个变量叫unans,对应Unanswered(未响应)这个元素。
在这里插入图片描述
wireshark捕获到了发送给物理机的icmp包和物理机的应答包
在这里插入图片描述

0x04 实验4

实验目的:实验3讲到了sr(),它是用来接收返回的3层报文。实验4将使用srp()来接收返回的2层报文。

用srp()配合Ether()和ARP()构造一个arp报文,二层目的地址为ff:ff:ff:ff:ff:ff,三层目的地址为192.168.2.0/24, 因为我们是向整个/24网络发送arp, 耗时会很长,所以这里用timeout = 5,表示将整个过程限制在5秒钟之内完成

ans, unans = srp(Ether(dst = "ff:ff:ff:ff:ff:ff") / ARP(pdst = "192.168.43.0/24"), timeout = 5)

wireshark捕获到了从192.168.43.1到192.168.43.254的整个c段的arp包,因为只有192.168.43.1(物理机)、192.168.43.2(dns服务器)和192.168.43.245(kali),所以只会收到三个应答包
在这里插入图片描述
下面用ans.summary()来具体看看到底是哪3个IP响应了我们的’who has’类型的arp报文。

ans.summary()

在这里插入图片描述
用unans.summary()来查看那些没有给予我们’who has’类型arp报文回复的IP地址在这里插入图片描述
可以看到询问其他IP的’who has’类型arp报文没有人响应。我们可以用这个方法来写一个python判断存活主机的脚本,向局域网整个段发送arp、icmp请求,如果收到回应即为存活,否则为不存活。可以参考这篇博客:使用python的scapy和nmap模块进行主机存活探测

0x04 实验5

实验目的:使用tcp()函数构造四层报文,理解和应用RandShort(),RandNum()和Fuzz()函数。

用nmap来扫描一下物理机开启了哪些端口,这里就用8082端口来测试
在这里插入图片描述

在scapy上使用ip()和tcp()函数来构造一个目的地IP为192.168.43.1(物理机),源端口为30,目的端口为8082的TCP SYN报文。

ans, unans = sr(IP(dst = "192.168.43.1") / TCP(sport = 30, dport = 8082, flags = "S"))

在这里插入图片描述

wireshark捕获到了三次tcp握手
在这里插入图片描述
TCP端口号除了手动指定外,还可以使用RandShort(), RandNum()和Fuzz()这几个函数来让scapy帮你自动生成一个随机的端口号,通常可以用作sport(源端口号)。

首先来看RandShort(),RandShort()会在1-65535的范围内随机生成一个TCP端口号,将上面的sport = 30 替换成 sport = RandShort()即可使用。

ans, unans = sr(IP(dst = "192.168.43.1") / TCP(sport = RandShort(), dport = 8082, flags = "S")/"test")

这里可以看到RandShort()替我们随机生成了53780这个TCP源端口号

在这里插入图片描述
如果你想指定scapy生成端口号的范围,可以使用RandNum(),比如你只想在1000-1500这个范围内生成端口号,可以使用RandNum(1000,1500)来指定,举例如下:

ans, unans = sr(IP(dst = "192.168.43.1") / TCP(sport = RandNum(666,888), dport = 8082, flags = "S")/"test")

这里RandNum()帮我们生成了837这个源端口号
在这里插入图片描述

0x06 python代码实现端口扫描

tcp中标记位flags有如下几种

S (SYN), F (FIN), P (PUSH), R (RST), W (ECN CWR) , E (ECN-Echo) , . (no flags)

我们可以利用TCP三次握手原理进行主机存活的探测,当向目标主机直接发送ACK数据包时,如果目标主机存活就会返回一个RST数据包以终止这个不正常的TCP连接。其工作原理主要依据目标主机响应数据包中flags字段,如果flags字段有值则表示主机存活,该字段通常包括:SYN, FIN, ACK, PSH, RST, URG六种类型。SYN表示建立连接,FIN表示关闭连接,ACK表示应答,PSH表示包含DATA数据传输,RST表示连接重置,USG表示紧急指针。

使用python的scapy和nmap模块进行主机存活探测

扫描端口也是同理,当发送端的TCP SYN包发出后,大致会有下面四种情况发生:

  • 目的端口在接收端打开(也可以说接收端正在侦听该端口),收到SYN包的接收端回复SYN/ACK包给发送端,收到SYN/ACK包的发送端此时知道目的端口是打开的(open)。
  • 目的端口在接收端被关闭,收到SYN包的接收端回复RST包给发送端,告知发送端该目的端口已经被关闭了(closed)。
  • 如果发送端和接收端之间有防火墙或者使用ACL进行包过滤的路由器,那么SYN包在到达接收端之前就被防火墙或路由器拦截下来,此时防火墙或路由器会回复一个类型3(Unreachable,不可达)的ICMP包(注意不再是TCP包)给发送端告知该目的端口已经被过滤了(filtered)。
  • 如果ICMP在防火墙或路由器上被关闭了,这时SYN包会被防火墙、路由器"静悄悄"地丢弃,路由器和防火墙不会发送类型3的ICMP包告知发送端。此时发送端收不到任何回应(no response),这里我们同样可以判断该目的端口已经被过滤了(filtered)。

因为用惯了python3所以改成了python3的,并且改为了探测全端口,代码如下

from scapy.all import *target = '192.168.43.1'ans, unans = sr(IP(dst=target) / TCP(sport=RandShort(), dport=[i for i in range(1, 65535)], flags="S"), timeout=5)for sent, received in ans:if received.haslayer(TCP) and str(received[TCP].flags) == "SA":print("Port " + str(sent[TCP].dport) + " of " + target + " is OPEN!")elif received.haslayer(TCP) and str(received[TCP].flags) == "RA":print("Port " + str(sent[TCP].dport) + " of " + target + " is closed!")elif received.haslayer(ICMP) and str(received[ICMP].type) == "3":print("Port " + str(sent[TCP].dport) + " of " + target + " is filtered!")for sent in unans:print(str(sent[TCP].dport) + " is filtered!")

物理机用wireshark抓到了kali发送的目的端口为从1到65535的tcp数据包
在这里插入图片描述
并且open的端口会返回一个SYN+ACK数据包
在这里插入图片描述

看看kali的结果是否正确
在这里插入图片描述

和用nmap的SYN扫描结果相同
在这里插入图片描述


http://chatgpt.dhexx.cn/article/si2ELT5O.shtml

相关文章

Python-Scapy使用介绍

介绍 Scapy可作为python模块运行,也可以单独运行,scapy在kali自带,可以直接输入scapy进入交互命令行。 Scapy可对网络数据包进行发送、监听、解析等操作,类似于python-nmap模块,只不过scapy更偏向于底层操作。 函数 下面简单了解下scapy的基本使用,这里以kali系统为例…

python的scapy基础使用

Scapy库 解决三个问题: 监听流量(与wireshark相同) 分析流量 编辑流量数据包(链路层 网络层 传输层),应用层也可以编辑 意义不大 提供两种操作方式 基于命令进行交互 python代码调用 基于命令进行交…

Python使用scapy和dpkt抓包并解析

scapy scapy是python中一个可用于网络嗅探的非常强大的第三方库,可以用它来做 packet 嗅探和伪造 packet。 scapy已经在内部实现了大量的网络协议。如DNS、ARP、IP、TCP、UDP等等,可以用它来编写非常灵活实用的工具。 scapy安装: pip inst…

Scapy:交互式数据包处理程序

简介 Scapy是一个强大的,用Python编写的交互式数据包处理程序 可以让用户发送、嗅探、分析和伪造网络包,从而用来侦测、扫描和向网络发动攻击 可以轻松地处理扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attac…

Scapy基础学习之一

关于Scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写)。它能够伪造或者解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等等。它可以很容易地处理一些典型操作,比如端口扫描,tracerouting…

Scapy常用操作和命令(1)

 ls() 列出scapy中实现的所有网络协议 >>> ls() ARP : ARP ASN1_Packet : None BOOTP : BOOTP CookedLinux : cooked linux DHCP : DHCP options DHCP6 : DHCPv6 Generic Message) DHCP6OptAuth : DHCP6 Option - …

python+scapy 抓包与解析

最近一直在使用做流量分析,今天把 scapy 部分做一个总结。 python 的 scapy 库可以方便的抓包与解析包,无奈资料很少,官方例子有限,大神博客很少提及, 经过一番尝试后,总结以下几点用法以便大家以后使用。 python scapy 抓包与解析 转载请注明来自:b0t0w1’blog ## 安…

基于Scapy的传统网络攻击实现

基于Scapy的传统网络攻击实现 前言开发环境与工具系统主要功能 系统原理分析协议工作原理ARP工作原理TCP工作原理 攻击原理及实现方法ARP扫描原理ARP欺骗原理SYN Flood攻击原理实现方法 功能设计功能描述 系统功能实现准备(Scapy的下载)ARP扫描的实现ARP…

Python Scapy使用方法

0x01 起航Scapy Scapy的交互shell是运行在一个终端会话当中。因为需要root权限才能发送数据包,所以我们在这里使用sudo $ sudo scapy Welcome to Scapy (2.0.1-dev) >>>123 在Windows当中,请打开命令提示符(cmd.exe)&…

python库:scapy使用

1、安装:sudo pip install scapy 2、查看scapy依赖关系: 2.3.2版本,不依赖任何python库。 3、使用help(scapy)查看帮助 就这么点,任何发送、接受数据包函数都没有看到,和以前的任何显示模块帮助都不一样 正确显示…

Scapy 中文文档:一、介绍

介绍 译者:pdcxs007 来源:Scapy介绍官方文档翻译 原文:Introduction 协议:CC BY-NC-SA 2.5 关于ScapyScapy为何如此特别快速的报文设计一次探测多次解释Scapy解码而不解释快速展示Quick demo合理的默认值学习Python 本人英文水平…

Scapy的介绍(一)

介绍 关于Scapy的 Scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具。 换句话说,Scapy是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据…

scapy基本操作

scapy基本操作 scapy是一款基于Python强大的数据包处理工具。它可以用来发送各类定制的数据包也可以用于数据包解析。 由于毕业论文需要对数据包进行预处理(数据清洗,数据归一化等),使用scapy进行数据处理。 本文是scapy学习过程…

Scapy的基本操作

Scapy模块的使用 Scapy的基本操作Scapy模块中的函数利用Scapy进行端口屏蔽探测 Scapy的基本操作 1.IP()类型数据包 在Scapy中,每一个协议就是一个类。只需要实例化一个协议类,就可以创建一个该协议的数据包。例如,如果要创建一个IP类型的数…

数据包工具--Scapy基础篇

数据包工具--Scapy基础篇 零、前言一、Scapy是什么?二、Scapy基础1 利用pip安装库2 基本使用2.1 conf变量2.2 lsc()方法2.3 ls()方法 3 发送数据3.1 创建数据3.2 发送数据3.3 fuzz()方法3.4 发送与接收数据 三、结尾 零、前言 学习过程中用到Scapy这个工具&#xf…

SCAPY官方教程一

一、Scapy简介 Scapy是一个强大的基于Python的交互式数据包操作程序和库。Scapy 使用 Python 解释器作为命令板,这意味着您可以直接使用 Python 语言(分配变量、使用循环、定义函数等) Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。这种能力…

Python中Scapy使用方法,模块中的常用函数,简单的端口扫描编写

目录 scapy是什么 scapy的使用 IP() src()和dst() Ether() 采用分层的方式来构造数据包 raw()和hexdump() summary()和show() 如何在scapy中发送和接收数据包 send()和sendp() sr()、sr1()和srp() 简单的端口扫描 sniff() 使用scapy编写简单的端口扫描 scapy是什…

斯特林公式、沃利斯公式

目录 一,斯特林公式 1,公式 2,证明 3,更多项 4,变形 二,沃利斯公式 1,公式 2,变形 一,斯特林公式 1,公式 2,证明 3,更多项 …

在谈天津2023年高考压轴题:斯特林公式数列极限

证明单调性,转化为数列极限问题,利用斯特林公式求极限