1.scapy的主要功能
- 可以根据自己的需要定义一系列的报文,并通过scapy发送出去,最后再接收回应。
- scapy的优势一方面是可以自由构造报文,另一方是对接收到的回应只解码而不解释,它只会如实显示响应报文的内容,而不提供结论,如何来判断和利用这些响应报文,完全由我们自己决定。
- 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 参数。