您的位置:首页 > 编程语言 > Python开发

python 使用scapy进行帧注入

2015-06-06 20:23 639 查看

1. 描述

  使用scapy进行以太网帧的注入,相对于RAW_SOCKET还是比较简单的。在讲述packet注入之前,先了解一下scapy伪造以太网帧的相关知识。下图为以太网帧格式和scapy对应的封装包格式。

  


2. 示例

2.1 使用scapy构造IP数据包

  进入scapy环境,输入以下代码:

  

>>>

>>> pkt = IP()/ICMP()/”hello”

>>>

>>>

>>> pkt.show()

###[ 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

###[ Raw ]###

load= ‘hello’

  

  

 上面代码的意思是,构造一个pkt的包,在IP层中封装了ICMP包,负载的数据位“hello”。通过
pkt.show()
函数显示包的详细信息。

2.2 发送packet

sendp——在第二层次上发送数据包。需要给定正确的网卡接口。

send——在第三层次上发送数据包。根据本地的路由表来进行路由发送。

循环发送相同的包。

间隔几秒发送一次包。

2.2.1 第三层次上发送包(layer 3)

  首先,我们在第三层次上发送packet来做测试。在这之前先另起一个终端,输入以下命令,对流量做一下监听。

  
tcpdump -i eth0 -XX -vvv icmp


  然后运行
send(pkt)
命令发送数据包,观察结果:



  监听结果:

  



  从结果上看,我们发送了一个ICMP请求包,收到了百度的一个ICMP答复包,还可以看到我们发送的数据。

####2.2.2 第三层次发送包(layer 3)

  使用重构数据包,然后用sendp()函数发送。

  
sendp(Ether()/IP(dst= "www.baidu.com")/ICMP()/"XXX",iface="eth0")


  Ether()构造以太网帧,和第三层次不同的是,在第二层次上发送要指定网卡接口, 这里我使用eth0。执行代码,成功发送一个数据包。如果想要循环发送,可以使用loop选项。

  
sendp(Ether()/IP(dst= "www.baidu.com")/ICMP()/"XXX",iface="eth0",loop=1)


  代码执行后,会快速的循环发送这个数据包,使用ctrl+C结束。

  



  如果想在两次发送数据包之间有一定的时间间隔,使用inter选项。

  
sendp(Ether()/IP(dst= "www.baidu.com")/ICMP()/"XXX",iface="eth0",loop=1,inter=1)


  表示每隔1秒发送一个数据包。

2.3 在层次2和层次3上发送和接收包

层次3

——sr()。返回答复和没有答复的包。

——sr1()。返回仅仅答复或者发送的包。

层次2

——srp()

——srp1()

执行
sr(IP(dst="www.baidu.com")/ICMP()/"XXX")
,观察执行结果:



  成功发送了一个数据包,接收到了2个数据包,其中一个为答复包。这是我要集中注意的地方。将收到的数据赋值给自定义的变量,并查看。

  



  

  使用sr1()函数,效果:

  



  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: