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))

运行结果:

Scapy的基本操作相关推荐

  1. Scapy 网络数据包构建

    随着Python越来越流行,在安全领域的用途也越来越多.比如可以用requests 模块撰写进行Web请求工具:用sockets编写TCP网络通讯程序:解析和生成字节流可以使用struct模块.而要解 ...

  2. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  3. pytorch方法,Tensor及其基本操作_重点

    由于之前的草稿都没了,现在只有重写-. 我好痛苦 本章只是对pytorch的常规操作进行一个总结,大家看过有脑子里有印象就好,知道有这么个东西,需要的时候可以再去详细的看,另外也还是需要在实战中多运用 ...

  4. Gradle安装使用以及基本操作

    转自:https://www.cnblogs.com/linkstar/p/7899191.html Gradle安装使用以及基本操作 阅读目录 简单介绍 安装 使用idea创建一个web的Gradl ...

  5. scapy windows install

    最近有点扫描网络的需求,都说scapy好,但是安装是个事(当然指的是windows安装) 有个scapy3k,支持python3,可惜需要powershell,也就是说windows xp是没有戏了. ...

  6. c++文件读取空格_程序员术与道:术—C语言对文件进行处理,文件处理的基本操作...

    各种编程语言都实现了文件的基本操作,提供了对应的接口,本篇文章先为你介绍C语言对文件进行处理和文件处理的基本操作.主要从以下几个方面进行介绍: 读取文件 写入文件 重命名文件 读取目录 读取目录下的文 ...

  7. 【Pandas库】(3) DataFrame的创建方法及基本操作

    各位同学好,今天给大家介绍一下Pandas库中DataFrame类型数据的创建方法和基本操作. 文章内容如下: (1)使用字典类创建. 字典类有:①数组.列表.元组构成的字典:②Series构造的字典 ...

  8. python中的数据包处理模块scapy调研笔记

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

  9. 【MySQL】缩略语PK NN UQ BIN UN ZF AI G、基本操作语句

    一.缩略语 PK:primary key 主键 NN:not null 非空 UQ:unique 唯一索引 BIN:binary 二进制数据 UN:unsigned 无符号整数(非负数) ZF:zer ...

最新文章

  1. ELK 性能优化实践
  2. java设置可信任站点_通过网页修改activex安全设置,添加信任站点,禁用弹出窗口阻止程序...
  3. php计算机基础知识,计算机基础知识①
  4. 使用powermock 测试static 方法,jacoco统计覆盖率问题
  5. 万能驱动xp离线版_教你用SC封装软件来封装XP系统
  6. java多级目录文件是否存在_Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析)...
  7. python 用pip安装python库下载超时的解决办法
  8. SPOJ QTree【树链剖分】
  9. 云钉一体,支撑5亿用户1900万企业背后的技术复盘
  10. Load Runner:了解软件安装后目录http://www.boobooke.com/bbs/thread-1959-1-1.html
  11. 英雄联盟轮播图手动轮播
  12. 怎样把音频文件转换成mp3格式?
  13. Python生成n位随机数字字符串
  14. 怎样学习Peoplesoft -byl vhonglei
  15. Android -- 广播
  16. OpenLayers画点、画圆、画线方法
  17. C#windows竞赛管理系统
  18. 天猫精灵控制Zigbee设备
  19. 早期 计算机网络只是包括,计算机网络-判断题.docx
  20. LED背光驱动IC 支持32通道 PIN艾瓦特7039,7088

热门文章

  1. 数学袖珍电子版与数学传播互联网
  2. unity shader入门(1)unity shader的结构
  3. 武汉理工大学计算机学院分流,2018考生来信——我在读的武汉理工大学
  4. 深度解读Webpack中的loader原理
  5. java手游+纹章,龙之谷手游纹章怎么获得 纹章获取途径一览
  6. 外贸为什么需要ERP系统?
  7. 技术专题:几个子网通过一个公网IP上网的WAYOS设置方法
  8. 【coarse-to-fine:基于频谱和空间损失约束】
  9. GBase 8s与Oracle对比分析
  10. 代码chaid_SPSS术语中英文对照详解