Scapy的基本操作

article/2025/9/6 4:22:18

Scapy模块的使用

  • Scapy的基本操作
  • Scapy模块中的函数
  • 利用Scapy进行端口屏蔽探测

Scapy的基本操作

1.IP()类型数据包

在Scapy中,每一个协议就是一个类。只需要实例化一个协议类,就可以创建一个该协议的数据包。例如,如果要创建一个IP类型的数据包,就可以使用如下命令。

ip = IP()
ip.show()

运行结果:
在这里插入图片描述

IP数据包最重要的属性就是源地址和目的地址,这两个属性可以使用src和dst来设置。

例如,要构造一个发送“192.168.43.1”的IP数据包,可以使用下面代码:

ip = IP(dst="192.168.43.1")
ip.show()

运行结果:
在这里插入图片描述

这个目标的dst的值可以是一个IP地址,也可以是一个IP范围,例如192.168.43.0/24,这时产生的就不是1个数据包了。而是256个其中包括了192.168.43.0 最后以 192.168.43.255 结束。

ip_range = "192.168.43.0/24"
ip = IP(dst=ip_range)
for i in ip:i.show()

部分运行结果:
在这里插入图片描述
2.Ether协议
Scapy采用分层的形式来构造数据包,通常最下面的一个协议为Ether,然后是IP,再之后是TCP或者UDP。

IP()函数无法用来构造ARP请求和应答数据包,所以这时可以使用Ether(),这个函数可以设置发送方和接收的MAC地址。

那么现在来产生一个广播数据包,执行的命令如下:

data = Ether(dst="ff:ff:ff:ff:ff:ff")
data.show()

运行结果如下:
在这里插入图片描述

当我们想要构造一个TCP数据包时。
我们可以用Ether()/IP()/TCP()来完成一个TCP数据包。

data = Ether()/IP()/TCP()
data.show()

在这里插入图片描述

想要查看Ether()类和IP()类的属性可以使用ls(Ether())和ls(IP())进行查看

在这里插入图片描述

Scapy模块中的函数

Scapy中提供了多个用来完成发送数据包的函数,首先来看一下其中的send()和sendp()。

这两个函数的区别在于send()工作在第三层,而sendp()工作在第二层。

简单来说,send()是用来发送IP数据包的,而sendp()是用来发送Ether数据包的。

例如,构造一个目的地址为“192.168.43.1”的ICMP数据包,并将其发送出去,可以使用下面的代码进行发送。

data = IP(dst="192.168.43.1") / ICMP()
send(data)

当我们发送成功时就会显示“Sent 1 packets”等字样。
在这里插入图片描述
当我们使用Ether()时就需要使用sendp()进行发送了。

data = Ether(dst="5a:0e:ec:04:59:d3")
send(data)

这个里的目的地址我填写的是MAC地址。

同样也会回显“Sent 1 packets”等字样
在这里插入图片描述

值得注意的是,这两个函数的特点是只发不收,也就是说只会将数据包发送出去,但是没有能力处理该数据包的回应包。

在网络的各种应用中,需要做的不仅是将创建好的数据包发送出去,也需要接收这些数据包的应答数据包,这一点在网络扫描中尤为重要。

在Scapy中提供了三个用来发送和接收数据包的函数,分别是sr(),sr1(),srp(),其中,sr()和sr1()主要用于第三层,例如IP和ARP等,而srp()用于第二层。

这里仍然向192.168.43.1发送一个ICMP数据包来比较一下sr()和send()的区别。

1. sr()

data = IP(dst="192.168.43.1") / ICMP()
sr(data)

运行结果:
在这里插入图片描述

data = IP(dst="192.168.43.1") / ICMP()
print(sr(data))

运行结果:
在这里插入图片描述
我们用print进行输出时会发现有两个元素,所以我们需要使用两个变量进行存储。

data = IP(dst="192.168.43.1") / ICMP()
ans, unans = sr(data)
ans.summary()

使用summary()进行查看数据包里的内容

在这里插入图片描述

2. sr1()

data = IP(dst="192.168.43.1") / ICMP()
sr1(data)

运行结果:
在这里插入图片描述

这里我们可以发现使用sr()和sr1()回显的结果都是相同的,同样都是有4个应答。

使用summary()进行查看数据包里的内容

data = IP(dst="192.168.43.1") / ICMP()
print((sr1(data).summary()))

在这里插入图片描述
例如,我们想要探测某个主机的端口是否开放,采用半开扫描(SYN)的办法

data = IP(dst="192.168.43.1") / TCP(dport=80,flags="S")
ans, unans = sr(data)
ans.summary()

运行结果:
在这里插入图片描述
我们运行之后可能对下列的输出结果有些不太明白,其实这里的整体意思是本地20端口向目标80端口发起一个SYN,当目标收到时就会回应一个SYN+ACK给我们本地,这里很明显它是收到了,并且还回复了,证明目标端口是打开的,关闭的不会有任何回应。

IP / TCP 192.168.43.156:ftp_data > 192.168.43.1:https S ==> IP / TCP 192.168.43.1:https > 192.168.43.156:ftp_data RA

利用Scapy进行端口屏蔽探测

在此之前我们先看看这几个图
在这里插入图片描述
在这里插入图片描述

使用Scapy来实现一次ACK类型的端口扫描,例如对192.168.43.1的21、23、135、443、445这5个端口是否被屏蔽进行扫描,注意是屏蔽而不是关闭,采用ACK扫描模式,可以构造如下的代码:

from scapy.all import *port = [21, 23, 135, 443, 445]
data = IP(dst="192.168.43.1") / TCP(dport=port, flags="A")
ans, unans = sr(data)
ans.summary()
for s, r in ans:print("发送:" + s.summary())print("回复:" + r.summary())
for s, r in ans:if s[TCP].dport == r[TCP].sport:print("未过滤端口:" + str(s[TCP].dport))

运行结果:
在这里插入图片描述


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

相关文章

数据包工具--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年高考压轴题:斯特林公式数列极限

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

斯特林公式应用

51nod1058 这题让求n的阶乘长度,n范围到1e6,很明显会爆long long,那么就需要一个公式直接算出结果–斯特林公式,这个公式的作用就是求n阶乘的近似值。 我们知道求一个十进制数x的位数,log10(x) 1, 用斯特…

【高等数学】伽马函数与斯特林公式

伽马函数的背景 1728年,哥德巴赫在考虑数列插值的问题,通俗的说就是把数列的通项公式定义从整数集合延拓到实数集合,例如数列1,4,9,16…可以用通项公式n自然的表达,即便 n 为实数的时候,这个通项公式也是良好定义的。直…

数论 斯特林公式

斯特林公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用。从图中可以看出,即使在n很小的时候,斯特灵公式的取值已经十分准确。 公式为: 从图…

求N的阶乘长度(斯特林公式)

输入N求N的阶乘的10进制表示的长度。例如6! 720,长度为3。 求N的阶乘长度 计算n!的公式是斯特林公式: 计算一个数的长度为 log10(n) 1 AC代码: /***  ┏┓   ┏┓ * ┏┛┻━━━┛┻┓ * ┃       ┃  * ┃…

阶乘问题——斯特林公式

1、计算n!的位数 2、估计lg(n!)的大小 斯特林公式:(n越大越精确) 更加精确地: 或者: 相关题目:假的数学游戏 1、计算n!的位数 对于整数x,我们知道其位…

斯特林公式的证明

斯特林公式的证明 0.引言 斯特林公式(Stirling’s approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,阶乘的计算复杂度为线性。当要为某些极大大的n求阶乘时,常见的方法复杂度不可接受。斯特林公式能够将求解阶乘…

斯特林公式(Stirling's approximation)

斯特林公式(Stirlings approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林…

斯特林公式

斯特林公式 定义: 斯特林公式是用来求N的阶乘近似值的公式: 公式为: n ! 2 π n ( n e ) n n!\sqrt{2\pi n}(\frac{n}{e})^n n!2πn ​(en​)n 公式的应用:求n!的位数 大家都知道,求一个十进制数n的位…

斯特林公式 ——Stirling公式(取N阶乘近似值)

斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用。从图中可以看出,即使在n很小的时候,斯特灵公式的取值已经十分准确。 公式为: 从图…

popwindow的封装

popwindow使用中还是遇到几个问题,记录一下 1、popwindow弹出位置,还未解决弹出在控件上方的办法(目前高度写死) 2、popwindow弹出时背景变灰(类似dialog的效果) 3、popwindow与Listview使用时&#xff…

Andorid PopWindow使用总结

popwindow 经常使用的一个底部弹框 简单的几行代码实现 public class InflateActivity extends AppCompatActivity {private PopupWindow popupWindow;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentV…

android自定义popwindow,Android应用开发Android 自定义PopWindow的简单使用

本文将带你了解Android应用开发Android 自定义PopWindow的简单使用,希望本文对大家学Android有所帮助。 下面用一个简单的自定义布局来讲解PopWindow的使用 先看效果图: 1.popwidow的类实现: import android.content.Context; import android.graphics.drawable.BitmapDrawa…

popwindow详解

我上一篇文章讲解截安卓动画的最基本的东西,而怎么实现它们是要一个载体的。我这篇文章讲的就是其中一中实现方 式:popwindow. popwindow直译过来就是突然出现的弹框,比如我们在任何一款app当中基本都有个头像,你点击它就会出现个弹框让你选…

popWindow的使用方法

popWindow的使用方式 今天说的是比较简单的popwindow,弹出框,这个其实挺简单的主要是有个地方比较可能会出问题就是点击事件 [java] view plain copy private void initPopWindow(final TextView tview) { final String[] name { "份", "斤",…