Scapy基本应用

1.scapy的主要功能

  1. 可以根据自己的需要定义一系列的报文,并通过scapy发送出去,最后再接收回应。
  2. scapy的优势一方面是可以自由构造报文,另一方是对接收到的回应只解码而不解释,它只会如实显示响应报文的内容,而不提供结论,如何来判断和利用这些响应报文,完全由我们自己决定。
  3. scapy主要基于二、三、四层工作。

2.安装scapy

cpp 复制代码
[root@mana ~]# yum install -y python-pip tcpdump

[root@mana ~]# pip install scapy==2.4.3

[root@mana ~]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
>>> exit()

[root@mana ~]# scapy
INFO: Can't import matplotlib. Won't be able to plot.
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
WARNING: IPython not available. Using standard Python shell instead.
AutoCompletion, History are disabled.

                     aSPY//YASa
             apyyyyCY//////////YCa       |
            sY//////YSpcs  scpCY//Pp     | Welcome to Scapy
 ayp ayyyyyyySCP//Pp           syY//C    | Version 2.4.3
 AYAsAYYYYYYYY///Ps              cY//S   |
         pCCCCY//p          cSSps y//Y   | https://github.com/secdev/scapy
         SPPPP///a          pP///AC//Y   |
              A//A            cyP////C   | Have fun!
              p///Ac            sC///a   |
              P////YCpc           A//A   | To craft a packet, you have to be a
       scccccp///pSP///p          p//Y   | packet, and learn how to swim in
      sY/////////y  caa           S//P   | the wires and in the waves.
       cayCyayP//Ya              pY/Ya   |        -- Jean-Claude Van Damme
        sY/PsY////YCc          aC//Yp    |
         sc  sccaCY//PCypaapyCP//YSs
                  spCPY//////YPSps
                       ccaacs

>>>

3.scapy基本用法

  • ls () 可以列出 scapy 支持的所有协议,每个协议都是一个类。
  • lsc () 可以列出 scapy 支持的所有方法。
  • 用 help (ARP) 查看帮助信息。
  • dir(ARP)查看ARP类所有的方法
  • 用 ARP().display () 或 ARP().show () 方法查看属性信息。
  • a=ARP () #将 ARP 类实例化为对象 a。

4.安装wireshark

cpp 复制代码
# 安装 wireshark + 图形界面
yum install -y wireshark wireshark-gnome

# 把你的用户名加入 wireshark 组(替换成你的用户名)
usermod -a -G wireshark root

# 重新读取组权限(或重新登录)
newgrp wireshark

wireshark
cpp 复制代码
>>> a = ARP()
>>> a.show()
###[ ARP ]###
  hwtype= 0x1
  ptype= IPv4
  hwlen= None
  plen= None
  op= who-has
  hwsrc= 00:0c:29:e3:73:a2
  psrc= 192.168.95.138
  hwdst= 00:00:00:00:00:00
  pdst= 0.0.0.0


>>> a.pdst = "192.168.95.139"
>>> a.show()
###[ ARP ]###
  hwtype= 0x1
  ptype= IPv4
  hwlen= None
  plen= None
  op= who-has
  hwsrc= 00:0c:29:e3:73:a2
  psrc= 192.168.95.138
  hwdst= 00:00:00:00:00:00
  pdst= 192.168.95.139

>>>

构造出的ARP对象的参数和抓包软件上的参数一致

5.发送ARP包

cpp 复制代码
>>> res = sr1(a)
Begin emission:
Finished sending 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets

>>> res.show()
###[ ARP ]###
  hwtype= 0x1
  ptype= IPv4
  hwlen= 6
  plen= 4
  op= is-at
  hwsrc= 00:0c:29:a5:72:5f
  psrc= 192.168.95.139
  hwdst= 00:0c:29:e3:73:a2
  pdst= 192.168.95.138
###[ Padding ]###
     load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

>>>

6.构造响应包

cpp 复制代码
>>> Ether().show()
WARNING: Mac address to reach destination not found. Using broadcast.
###[ Ethernet ]###
  dst= ff:ff:ff:ff:ff:ff
  src= 00:0c:29:e3:73:a2
  type= LOOP

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

>>> pkt = Ether()/ARP()
>>> pkt.show()
###[ Ethernet ]###
  dst= 00:50:56:e6:3c:3c
  src= 00:0c:29:e3:73:a2
  type= ARP
###[ ARP ]###
     hwtype= 0x1
     ptype= IPv4
     hwlen= None
     plen= None
     op= who-has
     hwsrc= 00:0c:29:e3:73:a2
     psrc= 192.168.95.138
     hwdst= 00:00:00:00:00:00
     pdst= 0.0.0.0

>>>
cpp 复制代码
[root@mana ~]# arp -a
? (192.168.95.2) at 00:50:56:e6:3c:3c [ether] on ens32
? (192.168.95.1) at 00:50:56:c0:00:08 [ether] on ens32
? (192.168.95.254) at 00:50:56:e5:5e:cc [ether] on ens32
? (192.168.95.139) at 00:0c:29:a5:72:5f [ether] on ens32
[root@mana ~]# 
cpp 复制代码
>>> pkt[Ether].dst="00:0c:29:a5:72:5f"
>>> pkt[ARP].op=2
>>> pkt[ARP].hwdst="00:0c:29:a5:72:5f"
>>> pkt[ARP].pdst="192.168.95.139"
>>> pkt.show()
###[ Ethernet ]###
  dst= 00:0c:29:a5:72:5f
  src= 00:0c:29:e3:73:a2
  type= ARP
###[ ARP ]###
     hwtype= 0x1
     ptype= IPv4
     hwlen= None
     plen= None
     op= is-at
     hwsrc= 00:0c:29:e3:73:a2
     psrc= 192.168.95.138
     hwdst= 00:0c:29:a5:72:5f
     pdst= 192.168.95.139

>>> sendp(pkt)
.
Sent 1 packets.
>>>
cpp 复制代码
sendp(Ether(dst="00:0c:29:a5:72:5f")/ARP(op=2,hwdst="00:0c:29:a5:72:5f",pdst="192.168.95.139"))
cpp 复制代码
>>> sr1(ARP(pdst="192.168.95.111"),timeout=1,verbose=1)
Begin emission:
WARNING: Mac address to reach destination not found. Using broadcast.
Finished sending 1 packets.

Received 5 packets, got 0 answers, remaining 1 packets

>>> sr1(ARP(pdst="192.168.95.111"),timeout=1,verbose=0)
WARNING: Mac address to reach destination not found. Using broadcast.
>>>

timeout=1:等待 1 秒,没收到回复就放弃
verbose=1:显示发送 / 接收过程(能看到:发送了 1 个包、收到 0 个 / 1 个包)
verbose=0:安静模式,不打印任何过程

7.scapy 中的发包和收包

只发不收

  • send (),在第三层发包,不关心第二层的封装,第二层采用默认值;

  • sendp (),在第二层发包,需要手动指定第二层如何封装

发包且接收回复

  • sr () 和 sr1 () 都是在第三层发包,sr1 表示只接收第一个回复。

  • srp () 和 srp1 () 都是在第二层发包,srp1 表示只接收第一个回复。

默认情况下,如果目标主机不通,那么将一直发包,所以可以加上 timeout 参数。

相关推荐
lljss20201 小时前
1. NameServer 域名服务器---NS
linux·服务器·前端
@insist1232 小时前
信息安全工程师-入侵检测核心技术、APT 应对与工程实践
网络·安全·软考·信息安全工程师·软件水平考试
H_unique2 小时前
LangChain:调用工具Ⅲ
python·langchain
萧行之2 小时前
Ubuntu+Windows双系统:解决GRUB不显示Windows启动项、一闪而过问题
linux·windows·ubuntu
醉舞经阁半卷书12 小时前
深入掌握LangChain
python·langchain
CDN3602 小时前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python
kybs19912 小时前
springboot视频推荐系统--附源码72953
java·spring boot·python·eclipse·asp.net·php·idea
数智顾问3 小时前
(123页PPT)华为流程管理体系精髓提炼(附下载方式)
运维·华为
凯瑟琳.奥古斯特3 小时前
DNS解析全流程详解
网络·网络协议