加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSS
您当前的位置:首页 > 教程文章 > 网络技术

交互式数据包处理程序scapy

时间:2014-01-02 22:28:39  来源:  作者:

 交互式数据包处理程序scapy

scapypython写的一个功能强大的交互式数据包处理程序,可用来发送、嗅探、解析和伪造网络数据包,常常被用到网络攻击和测试中。它可以代替hping,arpspoof.ARP SK,arping,p0f,甚至是部分nmap,tcpdumptshark

协议测试是网络编程中一个重要环节,通过协议测试确保通信双方对协议的理解和实现是一致的。wireshark是强大的网络协议分析工具,能够捕获网络数据并进行协议解析,可是光有这个还不够,还需要能够生成指定内容的网络数据包的工具(packet forging / generation / crafting tool)。在wiresharkwiki中列出了一些traffic generation tool,尝试了scapy,还是挺不错的。

scapy
的项目主页是http://www.secdev.org/projects/scapy/,它是强大的交互式数据包操作工具,支持对广泛的网络协议解码和生成,进行数据包发送、捕获、请求匹配应答等等。scapywindows平台的安装见http://www.secdev.org/projects/scapy/doc/installation.html#platform-specific-instructions。不知何故,用firefox下载scapy源码包总是出错,总是没有下载完所有数据就停止了,用flashget等支持断点续传的下载工具是没有问题的。

一个简单的例子(Python脚本)如下:

import sys
import struct
from scapy.all 
import *

data = struct.
pack('=BHI'0x12201000)
pkt = IP(src='192.168.1.81', dst='192.168.1.10')/UDP(sport=
12345,dport=5555)/data
send(pkt, inter=1, count=5)

上面的代码由192.168.1.81:12345192.168.1.10:5555发送UDP包,用户数据为:
0x12 : unsigned short
20   : unsigned char
1000 : unsigned int
间隔1 s,发送5次。

关于scapy的更多用法可以参考其项目文档:

http://www.secdev.org/projects/scapy/doc/

一、scapy安装

1、下载

http://www.secdev.org/projects/scapy/下载release版本。

2、安装

LINUX平台:

将下载的压缩文件进行解压,转到解压后的目录,然后运行安装。具体步骤如下:

$cd scapy-2.X (解压后的目录)

$sudo python setup.py install

 

windows平台:

python2.6为例,安装时,需要安装以下库:

1Scapy,最新版本,解压后,运行“”“python setup.py install”进行安装

2pywin32:pywin32-214.win32-py2.6.exe

3winpcap:WinPcap_4_1_1.exe

4pypcap pcap-1.1-scapy-20090720.win32-py2.6.exe

5libdnetdnet-1.12.win32-py2.6.exe

6pyreadline pyreadline-1.5-win32-setup.exe

具体下载地址请见:http://wikicode.net

 

3、升级

如果总是希望得到最新的版本,可以scapyMercurial库:

1)安装Mercurial

$ sudo apt-get installl mercurial

2)检测scapy

$ hg clone http://hg.secdev.org/scapy

3)安装Scapy

$ cd scapy

$ sudo python setup.py install

邂逅,你就能够总是升级到最新版本:

$ hg pull

$ hg update

$ sudo python setup.py install

 

二、运行

1、启动

$ sudo scapy

或者

运行python import scapy

但要注意:

>>> from scapy import conf

会提出错误,要使用

>>> from scapy.all import conf

 

2.简单的利用

生成四个IP的包,其中/30得到子网掩码。如下:

 

Python 2.7.3 (default, Apr 10 2013, 05:09:49)

[GCC 4.7.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> from scapy.all import *

WARNING: No route found for IPv6 destination :: (no default route?)

>>> IP()

<IP  |>

>>> target="www.baidu.com"

>>> target="www.baidu.com/30"

>>> ip=IP(dst=target)

>>> ip

<IP  dst=Net('www.baidu.com/30') |>

>>> [p for p in ip]

[<IP  dst=61.135.169.104 |>, <IP  dst=61.135.169.105 |>, <IP  dst=61.135.169.106 |>, <IP  dst=61.135.169.107 |>]

>>> 

三、使用

3.1 启动

接执行scapy启动交互式CLI界面。

在脚本中:from scapy.all import *

3.2 常用命令

l  ls()

         可以显示所有支持的数据包对象。ls()可以不带参数,也可以带参数,参数可是任何一个具体的包。常用的有ARPEtherICMPIPUDPTCP,也支持SNMPDHCPSTP等。

示例:

>>> ls(ICMP)                        查看ICMP包结构

type       : ByteEnumField        = (8)

code       : MultiEnumField       = (0)

chksum     : XShortField          = (None)

id         : ConditionalField     = (0)

seq        : ConditionalField     = (0)

ts_ori     : ConditionalField     = (52480245)

ts_rx      : ConditionalField     = (52480245)

ts_tx      : ConditionalField     = (52480245)

gw         : ConditionalField     = ('0.0.0.0')

ptr        : ConditionalField     = (0)

reserved   : ConditionalField     = (0)

addr_mask  : ConditionalField     = ('0.0.0.0')

unused     : ConditionalField     = (0)

>>> ls(UDP)

sport      : ShortEnumField       = (53)

dport      : ShortEnumField       = (53)

len        : ShortField           = (None)

chksum     : XShortField          = (None)

>>> ls(IP)

version    : BitField             = (4)

ihl        : BitField             = (None)

tos        : XByteField           = (0)

len        : ShortField           = (None)

id         : ShortField           = (1)

flags      : FlagsField           = (0)

frag       : BitField             = (0)

ttl        : ByteField            = (64)

proto      : ByteEnumField        = (0)

chksum     : XShortField          = (None)

src        : Emph                 = (None)

dst        : Emph                 = ('127.0.0.1')

options    : PacketListField      = ([])

>>>a=IP(dst=”1.1.1.1”)                     

>>> ls(a)                                 查看具体的数据包格式和字段值

version    : BitField             = 4               (4)

ihl        : BitField             = None            (None)

tos        : XByteField           = 0               (0)

len        : ShortField           = None            (None)

id         : ShortField           = 1               (1)

flags      : FlagsField           = 0               (0)

frag       : BitField             = 0               (0)

ttl        : ByteField            = 64              (64)

proto      : ByteEnumField        = 0               (0)

chksum     : XShortField          = None            (None)

src        : Emph                 = '192.168.159.129' (None)

dst        : Emph                 = '1.1.1.1'       ('127.0.0.1')

options    : PacketListField      = []              ([])

 

l  lsc()

>>>lsc()               #查看支持的命令

3.3 构造和查看报文内容

scapy的包创建是按照网络接口层,互联网层,传输层,应用层四层参考模型来完成,各个层都有各自的创建函数,比如IP(),TCP(),UDP()等等,不同层之间通过“/”来连接。

Scapy中,scapy为各个层都写了类,使用时,只需要将其实例化,调用类的方法或者改变类的参数取值。如IP()没有传给它参数,那么它的参数就是默认的,如果传了就覆盖了默认值:

// 查看特定字段

>>> a=IP(dst="172.16.1.40")

>>> a.dst

'172.16.1.40'

 

//查看IP全部字段

>>> a.show()

###[ IP ]###

  version=4

  ihl= None

  tos=0x0

  len= None

  id=1

  flags=

  frag=0

  ttl=64

  proto= ip

  chksum= None

  src=10.1.159.51

  dst=172.16.1.40

  options

 

// 多层报文

>>> a= Ether(dst='001122334455')/IP(dst='2.2.2.2')/TCP(dport=23)

>>> a.show()

###[ Ethernet ]###

  dst=001122334455

  src=00:1c:c4:aa:c9:36

  type=0x800

###[ IP ]###

     version=4

     ihl= None

     tos=0x0

     len= None

     id=1

     flags=

     frag=0

     ttl=64

     proto= tcp

     chksum= None

     src=10.1.159.51

     dst=2.2.2.2

     options

###[ TCP ]###

        sport= ftp_data

        dport= telnet

        seq=0

        ack=0

        dataofs= None

        reserved=0

        flags= S

        window=8192

        chksum= None

        urgptr=0

        options= {}

 

3.4 发送报文

>>> send(a,iface="eth1")

.

Sent 1 packets.

3.5 接收报文

>>> a=sniff(filter="icmp and host 10.1.159.71", count=2)

>>> a.show()

0000 Ether / IP / ICMP 10.1.159.71 > 10.1.159.51 echo-request 0 / Raw

0001 Ether / IP / ICMP 10.1.159.51 > 10.1.159.71 echo-reply 0 / Raw

>>> a[1]

<Ether  dst=00:1f:29:63:41:62 src=00:1c:c4:aa:c9:36 type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=84 id=523 flags= frag=0L ttl=64 proto=icmp chksum=0x2622 src=10.1.159.51 dst=10.1.159.71 options=[] |<ICMP  type=echo-reply code=0 chksum=0xf549 id=0x597b seq=0x1 |<Raw  load='xdcx1bx82Qx00x00x00x00x86xf9rx00x00x00x00x00x10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1f !"#$%&'()*+,-./01234567' |>>>>

3.6 发送和接收报文

// 发送ICMP请求,接收应答

>>> a = sr(IP(dst="10.1.159.71")/ICMP())

Begin emission:

....Finished to send 1 packets.

*

Received 5 packets, got 1 answers, remaining 0 packets

>>> a[0]

<Results: TCP:0 UDP:0 ICMP:1 Other:0>

>>> a[1]

<Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>

>>> a[0].show()

0000 IP / ICMP 10.1.159.51 > 10.1.159.71 echo-request 0 ==> IP / ICMP 10.1.159.71 > 10.1.159.51 echo-reply 0 / Padding

3.7 读取cap内容

>>> d = rdpcap("./test.cap")               

>>> d

<test.cap: TCP:2 UDP:0 ICMP:0 Other:1>

>>> d.show()

0000 Ether / IP / TCP 10.1.159.51:ssh > 10.7.244.6:65464 PA / Raw

0001 Ether / IP / TCP 10.7.244.6:65464 > 10.1.159.51:ssh A / Padding

0002 802.3 00:25:83:b8:8f:83 > 01:00:0c:cc:cc:cd / LLC / SNAP / STP / Raw

 

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
在CentOS下搭建Android 开发环境
在CentOS下搭建Androi
轻松搭建属于自己的Ubuntu发行版
轻松搭建属于自己的Ub
利用SUSE Studio 打造自己的个性化Linux发行版
利用SUSE Studio 打造
那些采用PHP技术的IT大企业
那些采用PHP技术的IT大
相关文章
    无相关信息
栏目更新
栏目热门