scapy安装及使用

注:以下内容均在linuxroot账户下执行,非root账户自行添加sudo

一、scapy安装

(1)获取scapy项目

git clone https://github.com/secdev/scapy.git

scapy手册:https://scapy.readthedocs.io/en/latest/index.html

(2)安装scapy,进入下载的scapy目录中,执行

python setup.py install

(3)验证安装成功,直接输入scapy,如果出现scapy的命令行标志即安装成果,提示的can't import之类的为scapy拓展功能组件,推荐使用apt install python-xxxx的方式安装,pip也可以安装,但是速度明显较慢。

二、scapy构造数据包

scapy可以非常方便的构造各种类型的数据包,其组织方式按照网络分层,各层之间通过'/'连接,例如可以使用以下方式构造ICMP包:

pkt=Ether()/IP()/ICMP()

对于不同层可以使用的参数可以用ls()方式查看,例如查看数据链路层可选参数可以使用如下方式:

>>> ls(Ether())
dst        : DestMACField                        = 'ff:ff:ff:ff:ff:ff' (None)
src        : SourceMACField                      = '00:0c:29:d8:09:eb' (None)
type       : XShortEnumField                     = 36864           (36864)

可以看到其默认为广播地址,可以在生成数据包时像函数传参一样修改相应参数,例如修改为mac=1发往mac=2可用以下方式:

pkt=Ether(src='00:00:00:00:00:01',dst='00:00:00:00:00:02')

在创建包完成后也可以方便的修改单项参数,方式如下:

pkt[Ether].src='00:00:00:00:00:01'

创建完包后可以直接输入包名查看关键信息,也可以使用数据包.show()查看每一层的信息,还可以使用hexdump(数据包)查看16进制表示的数据包内容。

>>> pkt
>>
>>> pkt.show()
###[ Ethernet ]### 
  dst= 00:00:00:00:00:02
  src= 00:00:00:00:00:01
  type= IPv4
###[ IP ]### 
     version= 4
     ihl= None
     tos= 0x0
     len= None
     id= 1
     flags= 
     frag= 0
     ttl= 64
     proto= icmp
     chksum= None
     src= 127.0.0.1
     dst= 127.0.0.1
     \options\
###[ ICMP ]### 
        type= echo-request
        code= 0
        chksum= None
        id= 0x0
        seq= 0x0

>>> hexdump(pkt)
0000  00 00 00 00 00 02 00 00 00 00 00 01 08 00 45 00  ..............E.
0010  00 1C 00 01 00 00 40 01 7C DE 7F 00 00 01 7F 00  ......@.|.......
0020  00 01 08 00 F7 FF 00 00 00 00                    ..........

Scapy计算校验和,主要有两类计算方式,这里以TCP校验和计算为例,官网有UDP的例子,Scapy每类数据包都包含计算校验和的方式,甚至是拓展的协议类型也是,可以统一用方式一计算

方式一:

先生成chksum=None的数据包,然后将数据包重新套用数据包格式即可

pkt=IP(src='192.168.1.1',dst='192.168.1.2')/TCP()/'abcdefg'
pkt=IP(raw(pkt))

方式二:

目前我了解到只支持UDP和TCP的校验和计算,方式为调用in4_chksum函数,其实查看scapy的源代码就可以看到,UDP和TCP在用一方式计算校验和的时候就是调用了该函数。

先将数据包的chksum设为0,然后调用in4_chksum(协议类型,上层协议,计算内容)进行计算后填回数据包。

pkt=IP(src='192.168.1.1',dst='192.168.1.2')/TCP(chksum=0)/'abcdefg'
chk_str=raw(pkt)[20:]
pkt[TCP].chksum=in4_chksum(socket.IPPROTO_TCP,pkt[IP],chk_str)

你可能感兴趣的:(scapy安装及使用)