scapy发送80211 probe探测报文

日行一记-2017-7-10

修改2017-7-26 插上代码,及遇到的部分的解决方法。

基于scapy嗅探性能测试脚本程序。

公司需要一个发包程序测试嗅探设备采集性能。

找个好久,发现了scapy构包工具,用Python写的,没用过Python,只能边学边用。

scapy能够自定义构造各种类型的包,最重要的能够构造80211 prboe request报文。

代码先不写,因为目前写得比较简单且还要 改。

预留一块地方:

代码已带上,新接触python写得不好,请原谅!

#!/usr/bin/env python
#coding:utf-8
#this script generates high volume of 802.11 Probe Requests frames.
#Each frame have uniq random source MAC.
#author:heguijin 2017年7月26日15:32:18
#You need injection supported device.

import logging,sys,getopt,time
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 

from scapy.all import *
from scapy.all import RandMAC

#my sendp function
def my_sendp(x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs):
	__my_gen_send(conf.L2socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime)

def __my_gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs):
    if type(x) is str:
        x = conf.raw_layer(load=x)
    if not isinstance(x, Gen):
        x = SetGen(x)
    if verbose is None:
        verbose = conf.verb
    n = 0
    if count is not None:
        loop = -count
    elif not loop:
        loop=-1
    try:
        while loop:
            last_time = 0
            for p in x:
				# '''
				now_time = time.clock()
				while (now_time - last_time < inter):
					now_time = time.clock()
				last_time = now_time
				# '''
				s.send(p)
				n += 1
            if loop < 0:
                loop += 1
    except KeyboardInterrupt:
        pass
    s.close()
    if verbose:
        print "\nSent %i packets." % n
#main
def main():
	iface = 'wlan0mon'
	interval = 0.1
	count = 100
	# machead='80:00:00'
	machead='da:a1:19'
	#opts
	try:
		opts,args = getopt.getopt(sys.argv[1:],"i:n:t:m:")
	except getopt.GetoptError as e:
		print '-i  -n  -m  -t '
		sys.exit(-1)
	
	for opt, arg in opts:
		if opt == '-i':
			iface = arg
		elif opt == '-n':
			count = int(arg)
		elif opt == '-t':
			interval = float(arg)
		elif opt == '-m':
			mac = arg
		elif opt == '-h':
			print '-i  -n  -m  -t '
			sys.exit(1)
	print "iface=%s, packs=%d, machead=%s, interval=%f" %(iface,count,mac,interval) 
	
	s_time = time.time()
	
	print "start time:%f" % s_time
	print "Press CTRL+C to Abort"
	
	my_sendp(RadioTap()/
		  Dot11(type=0,subtype=4,
		  addr1="ff:ff:ff:ff:ff:ff",
		  addr2=RandMAC(mac),
		  addr3="ff:ff:ff:ff:ff:ff"),
		  iface=iface,count=count,inter=interval,verbose=1)
	e_time = time.time()
	print "end time=%f, spend time=%f" %(e_time, e_time - s_time)
	
if __name__ == "__main__":
	main()


遇到的坑:

1.因为之前要用omnipeek抓取无线帧,我搞了专门抓包的驱动。

然后网上找了很多scapy发送probe报文的代码,测试发现另一台电脑和嗅探都抓不了发送的报文。

纠结1天多,以为是代码问题,换了几套代码。

后来换了张网卡,配置为监听模式,居然就好了。蛋蛋的忧伤~~

发包程序用一般的驱动(默认安装的驱动)就行,配置为监听模式。

2.scapy每秒发包性能问题,在公安三所测时,他的程序每秒能够5000个,虽然是beacon包。

而发送1000个包要1至2秒。

可能是用虚拟机,也可能是网卡性能,或者scapy最小发包间隔为1毫秒。

原因还没有确认,待验证。

经测试性能主要卡在sendp函数,scapy sendp函数内部inter时间用了time.sleep函数。

time.sleep函数,时间最大精确单位位毫秒,而且time.sleep用越久越容易产生误差。

阻塞方式不适合频繁大量发包。

我自己修改sendp函数,time.sleep方式改为 time.clock方式。

============================================================================
报错现象1:
Traceback (most recent call last):
File "./pr.py", line 55, in
iface=iface,count=count,inter=interval,verbose=0)
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 259, in sendp
__gen_send(conf.L2socket(iface=iface, *args, **kargs), x, inter=inter, loop=loop, count=count, verbose=verbose, realtime=realtime)
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 234, in __gen_send
s.send(p)
File "/usr/lib/python2.7/dist-packages/scapy/supersocket.py", line 34, in send
return self.outs.send(sx)
socket.error: [Errno 100] Network is down
解决方法:
socket.error: [Errno 100]报错,网卡接口错误或者网卡没启动导致,确认发包接口名称及是否启动。
# ifconfig wlan0 up
============================================================================
报错现象2:
Traceback (most recent call last):
File "./pr.py", line 55, in
iface=iface,count=count,inter=interval,verbose=0)
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 259, in sendp
__gen_send(conf.L2socket(iface=iface, *args, **kargs), x, inter=inter, loop=loop, count=count, verbose=verbose, realtime=realtime)
File "/usr/lib/python2.7/dist-packages/scapy/arch/linux.py", line 406, in __init__
self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))
File "/usr/lib/python2.7/socket.py", line 191, in __init__
_sock = _realsocket(family, type, proto)
socket.error: [Errno 1] Operation not permitted
解决方法:
socket.error: [Errno 1] 权限不够,使用root用户权限。
============================================================================
错误现象3:
网卡接口和权限没问题,执行脚本发送报文没有提示错误,但是没有接收到报文。
解决方法:
即使发包成功ifconfig查看接口tx也不会变化。
首先,将设备设置为监视模式。可以使用airmo-ng或iw。
# iw dev wlan0 interface add mon0 type monitor# ifconfig mon0 up
必须要将监听模式接口启动, ifconfig能够看到接口,用此接口发包。
用omnipeek抓包时,抓包信道要与发包信道一样。
信道越接近,收包数量越多。

如何大家有什么建议和问题的,欢迎留言。


你可能感兴趣的:(openwrt,scapy,80211,probe探测帧)