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

article/2025/9/6 5:14:52

目录

scapy是什么

scapy的使用

IP()

src()和dst()

Ether()

采用分层的方式来构造数据包

raw()和hexdump()

summary()和show()

如何在scapy中发送和接收数据包

send()和sendp()

sr()、sr1()和srp()

简单的端口扫描

sniff()

使用scapy编写简单的端口扫描


scapy是什么

scapy是一个可用作网络嗅探,独立运行的工具,它提供了一个和python相同的交互方式命令行环境,可以在kali内单独运行,该类库在网络安全领域有非常广泛用例,可用于漏洞利用开发、流量的分析捕获等等。我们使用这个库实现对网络数据包的发送、监听和解析,编写可以用进行网络探测扫描的脚本

scapy的使用

scapy库pycharm内的导入

file → settings → project:pythonproject → python interpreter

点击“+”,搜索scapy,install package

IP()

在scapy中,使用了”类+属性”的方法来构造数据包,每一个网络协议都是一个类,所以只需要实例化一下这个类,就可以创建一个该协议的数据包,假设我们构造一个IP数据包,如下:

IP() 

导入scapy库构造数据包

from scapy.layers.inet import IPpkt = IP()
print(pkt)

执行结果如图下所示,以字节格式显示了IP数据包的结果,由于bytes保存的就是原始的字节数据,可以直接在网络上进行传输

src()和dst()

对于IP来说,最重要的就是源ip和目的ip,这两个属性分别以src类和dst类来实现

比如我们想构造一个发往“192.168.200.1”的数据包

from scapy.layers.inet import IP
from scapy.all import lspkt = IP(dst="192.168.200.1")
ls(pkt)

执行结果如下图,src为源ip,dst则是目标ip,ls()类用来实现查看一个数据包的详细信息

以上是构造了一个最简单的数据包,IP类的属性非常复杂,除了最重要的源地址和目的地址外,还有TTL值,版本,长度,协议类型,校验等等

在了解了src和dst后,我们可以构造一个TTL值为22,源地址为192.168.200.140且目的地址为192.168.200.1的数据包

from scapy.layers.inet import *
from scapy.all import lspkt = IP(src="192.168.200.140",dst="192.168.200.1",ttl=22)
ls(pkt)

Ether()

scapy采用分层的方式来构造数据包,以最简单的TCP/IP协议簇为例,自顶而下分别为

应用层↓

        传输层↓

                网络层↓

                        链路层

通常最底层的协议为ether协议,⽤于实现链路层的数据传输和地址封装,然后是IP,然后是TCP、UDP,再然后是DNS、DHCP等,例如我们使用Ether(),这个类可以设置发送方和接收方的MAC地址,假设我们产生一个广布数据包,如下:

from scapy.layers.inet import *
from scapy.all import lspkt = Ether(dst="ff:ff:ff:ff:ff:ff")
ls(pkt)

采用分层的方式来构造数据包

分层是通过符号"/"实现的,如果一个数据包由多层协议组成,那么这些协议就需要使用"/"分开,并按照协议由底而上的顺序从左往右排列

构造一个Ether()/IP()/TCP()/数据包

from scapy.layers.inet import *
from scapy.all import *pkt1 = Ether()/IP()/TCP()
ls(pkt1)

构造一个HTTP数据包

from scapy.layers.inet import *
from scapy.all import *pkt2 = IP()/TCP()/"GET HTTP/1.0\r\n\r\n"
ls(pkt2)

raw()和hexdump()

raw()以字节格式来显示数据包的内容

而hexdump()则以十六进制显示数据包的内容

summary()和show()

summary()以不超过一行的摘要来简单描述数据包,而show()与summary()则相反(显示数据包的详细信息)

from scapy.layers.inet import *
from scapy.all import *pkt2 = IP()/TCP()/"GET HTTP/1.0\r\n\r\n"
print(pkt2.summary())
print('--------------------------')
print(pkt2.show())

如何在scapy中发送和接收数据包

send()和sendp()

刚才我们构造了一个IP数据包,不过并没有将其发送出去,scapy内提供了多个用来发送数据包的函数(如:send()和sendp()),而两者的区别在于前者是发送IP数据包的,而后者是发送Ether数据包。

我们在网络中经常会使用到ICMP协议,比如使用的用于检查网络通不通的 Ping命令,这个“Ping”的过程实际上就是ICMP协议工作的过程。那么我们构造一个目标地址为192.168.2.46的ICMP数据包,并且将其发送出去

from scapy.layers.inet import *
from scapy.all import *pkt = IP(dst = "192.168.2.46")/ICMP()
send(pkt)

如下图所示,sent 1 packets为发送成功标记

如果需要将MAC地址作为目标时,则使用sendp()函数

from scapy.layers.inet import *
from scapy.all import *sendp(Ether(dst = "ff:ff:ff:ff:ff:ff"))

以上两个函数的特点是只发不收,也就是说只会将数据包发送出去,但是不会管这个数据包是否会被目的地址接收,同样也不会处理该数据包的应答数据包,在实际应用中,我们不但要将制作好的数据包发送出去,同样需要接收响应数据包

sr()、sr1()和srp()

scary提供了三个用来发送和接收数据包的核心函数,sr()和sr1()主要用于IP地址,而srp()主要用于MAC地址

这里我们使用sr()函数,对“192.168.2.46”发送一个ICMP数据包,需要注意的是,这里的目的地址需要真实存活。首先当数据包产生后被发送出去,scapy会监听接收到的数据包,然后筛选出需要的。sr1()函数跟sr()函数作用基本一样,但是前者只返回一个应答的包,而后者的返回值是两个列表,第一个列表包含了收到的应答数据包,第二个列表包含未收到的数据包

from scapy.layers.inet import *
from scapy.all import *pkt = IP(dst = "192.168.2.46")/ICMP()
ans,uans = sr(pkt)
ans.summary()
print("------------------------------------------")
ans = sr1(pkt)
ans.summary()

如下图,ans和uans分别保存sr()函数的返回值,使用summary()查看数据包内容,Reveived表示收到的数据包的个数,answers表示发送数据包的应答个数

简单的端口扫描

使用sr1()函数来测试目标的mysql数据库端口是否开放,采用SYN扫描方法

(注意:测试时仍需要3306端口开放)

from scapy.layers.inet import *
from scapy.all import *pkt = IP(dst="192.168.2.46")/TCP(dport=3306,flags="S")
ans = sr1(pkt)
ans.summary()

sniff()

这个函数可以在自己的程序中捕获经过本机网卡的数据包

该函数的完整格式为:

suiff(filter="",iface="",count=""prn="")

第一个参数为filter,可以表示需要过滤或筛选的数据包;第二个参数为iface,表示指定使用的网卡;count表示用来指定监听到的数据包数量;prn表示对捕获的数据包进行处理

例如,我们捕获与192.168.2.46有关的数据包

from scapy.layers.inet import *
from scapy.all import *pkt = sniff(filter="host 192.168.2.46")
pkt.summary()

正常情况下,是不会有去往或者来自192.168.2.46的数据包的,所以这时候可以打开一个新的终端,然后在里面执行命令“ping -c 3 192.168.202.10”

在执行完毕脚本后,按暂停键结束捕获,这时可以看到已经捕获到了三个分别来和往的数据包  

常见的filter实例

  • host 192.168.2.46【筛选源地址或目的地址为192.168.2.46的数据包】

  • dst host 192.168.2.46【筛选目的地址为192.168.2.46的数据包】

  • src host 192.168.2.46【筛选源地址为192.168.2.46的数据包】

  • ether host ff:ff:ff:ff:ff:ff【筛选以太网源地址或目的地址为192.168.2.46的数据包】

  • ether dst ff:ff:ff:ff:ff:ff【筛选以太网目的地址为192.168.2.46的数据包】

  • ether src ff:ff:ff:ff:ff:ff【筛选以太网源地址为192.168.2.46的数据包】

  • dst port 8080【筛选目的地址为8080端口的数据包】

  • src port 8080【筛选源地址为8080端口的数据包】

  • port 8080【筛选源地址和目的地址为8080的数据包,所有port前面都可以加上TCP和UDP】

比如在网卡eth0上监听源地址或目的地址为192.168.2.46的ICMP数据包,当接收到10个及以上时停止监听

使用scapy编写简单的端口扫描

import time
from scapy.layers.inet import IP, TCP
from scapy.sendrecv import sr1def scan(ip):try:packet = IP(dst=ip)/TCP(flags="A", dport=3306)  # 构造标志为ACK的数据包,通过调用TCP将构造好的请求包发送到目的地址,并根据目的地址的响应数据包中的flags字段值判断主机是否存活,若flags字段为R,其整型数值为4时表示接收response = sr1(packet)if response:if int(response[TCP].flags) == 4:time.sleep(0.1)print(ip + ' ' + 'is up')else:print(ip + ' ' + 'is down')else:print(ip + ' ' + 'is down')except:passscan('192.168.2.46')

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

相关文章

斯特林公式、沃利斯公式

目录 一,斯特林公式 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 { "份", "斤",…

自定义popwindow

自定义popwindow 前言:很普通的popwindow,温故下。 1. PopupWindow是一个以弹窗方式呈现的控件,可以用来显示任意视图(View),而且会浮动在当前活动(activity)的顶部。 2. 基本属性: 设置宽的值,可以是W…

Android打造自定义通用popWindow

日常android开发中经常会用到popWindow。因此封装一个可自定义view,可设置弹出动画,可设置大小的通用popWindow显得尤为重要。 效果图如下: 通用PopWindow分为如下3部分: 1.自定义popWindow 2.popWindow的辅助类 3.popWindow的弹出动画 4.…

Android自定义popWindow教程

俗话说没有图说话不硬气! 上图: 说明:演示图最底部的一个红色区域是我在布局文件中添加的.主要是为了说明自定义popWindow的自下而上弹出时,会将原来的根布局进行遮盖,而不是将布局顶上去.了解一下 popWindow在android中的使用其实很常见.本文就带领你无自定义一个popWindo…