无线局域网的渗透与入侵作者Waterwave“The truth is out there.”---------The X Files And this document is for my dear.前言本文的写作目的并非是在现今的WLAN渗透研究上再做出新的突破,因为现今流行的无线网络设备,无论是从家用无线路由器,到商用的中型无线交换设备,所构建的WLAN几乎都使用了WEP或WPA方式进行信号的加密——并非没有更加安全的加密方式——但无线网络的开放性本身就决定了其脆弱性,无线信号这个脆弱的载体与强悍的加密算法的搭配未免显得有些不伦不类,在真正需要高度保密的网络环境中,带有电磁屏蔽的有线传输或光缆传输远比无线网络安全和稳定。
1.无线局域网的加密方式概述正如前言中所提到的,不管是无线路由器还是无线AP、无线中继,其信号范围几乎是不可控的,因此外界只要进入其信号范围,则有很大可能访问到该无线网络,而一旦成功访问,则网络内所有数据包的交换对其来说都是透明的,则可能通过嗅探抓包对其进行分析与破解。
无线设备本身提供WEP和WPA加密方式,有加密就有密钥的生成和分发,有分发就有用户的识别,除去对数据包本身的加密过程之外,对合法用户的识别也是一个重要的方面,这将在稍后提到。
WEP加密方式使用了RSA开发的rc4 prng算法,即“有线对等保密”(Wired Equivalent Privacy,WEP),用于提供等同于有线局域网的保护能力。
利用该加密方式,所有客户端与无线接入点的数据都会以一个共享的密钥进行加密,密钥的长度为40位至256位,其长度也自然决定了其破解难度,但就从这上面两句描述中就可以发现其脆弱性所在——“一个共享的密钥”,静态密钥总是会被重复的,这也就提供了被破解的可能。
WPA加密方式,即Wi-Fi Protected Access,本身就是WEP的一个升级版,换言之其基本工作机理与WEP一致,但却修正了WEP的致命弱点——密钥单一性。
WPA除了包括802.11 X 机制外,还包含了“暂时密钥完整性协议”(Temporal Key Integrity Protocol,TKIP),TKIP与802.11 X一起为接入终端提供了动态的密钥加密和相互认证。
同时提供了一系列的安全机制来防止黑客在WEP上常用的入侵渗透方式,使其更加安全。
2.WEP的安全性分析2.1WEP的数据帧结构首先来分析WEP的数据帧结构,它包含了三个数据项:32位的IV数据项,传输数据项和32位的ICV循环校验码,其中IV为明文传输,后两者为加密传输。
IV数据项中又包含了三个数据项:24位的初始向量值(Init Vector),2位的Key ID 和6位的纯填充数据(以0填充)。
自然而然,构成WEP SEED的是那24位的Init Vector;而Key ID则用来标识可选的该帧的四个密钥。
2.2WEP的加密算法再来看加密算法,WEP是采用RSA的RC 4算法,该算法包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。
由于该算法的核心部分S-box长度可为任意(虽然一般为256字节),因此被归类于“流加密算法簇”范畴。
我们用类C的伪代码来描述该算法的初始化部分(KSA):假设S-box长度和密钥长度都为n。
for (i=0; i;<n; i++){j=(j+s+k)%256;swap(s, s[j]);}在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。
而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:i=j=0;while (明文未结束){++i%=n;j=(j+s)%n;swap(s, s[j]);sub_k=s((s+s[j])%n);}由此得到子密码sub_k,将该子密码与明文进行xor运算,得到密文。
由于加密使用的异或,所以一旦子密码序列发生重复,密文则可能通过比对被破解。
而该算法的缺陷则直接导致了WEP加密的脆弱性,这将在后面的内容中提到。
2.3WEP的数据加解密过程WEP一般使用64位密钥,由共享密钥和IV直接连接而成。
在2.1部分中提到,IV中的2位Key ID被用来标识WEP的四个加解密缺省密钥Default Key,其标识号为0,1,2,3。
加密过程示意图如下:解密过程则相反,分为以下三个过程:1.生成密钥流;2.将密文与密钥流进行异或运算,解密生成明文;3.通过校验码对信息的完整性进行校验,若校验通过则接收解密后的明文数据帧,否则丢弃错误的帧。
2.4WEP的身份认证过程由于WEP采用的是基于共享密钥的认证机制,所以共享密钥在用户与接入点的传递与验证成功与否决定了身份认证的正确性。
其主要过程如下:首先由用户客户端自行搜索无线网卡接收范围内的Wi-Fi信号,并显示出公开了SSID的接入点的情况;若接入点选择不公开自己的SSID,则在默认情况下无法取得该接入点的SSID信息,也就无法进行连接。
然后客户端向期望连接的接入点发送申请认证的数据帧,接入点的识别是由SSID完成的。
接入点收到申请认证的数据帧后,用WEP加密算法中的伪随机数生成一个128位的Challenge Text加载到管理数据帧,再将其返回给客户端。
客户端再将该Challenge Text加载到管理帧,用共享密钥与新的IV向量对该帧加密,再传送给接入点。
最后接入点校验该帧的信息正确性与CRC正确性判断该用户是否为合法用户。
2.5WEP的本质缺陷由前面几节对WEP的分析,我们可以看出WEP本身存在以下的缺陷:1.密钥的重复问题如2.2节里所示,WEP的加密算法是基于RC 4的。
一旦攻击者获得了由相同的密钥流序列加密后所得的两段密文,再将两段密文异或,则得到的也是两段明文的异或,由此密钥则失效。
2.IV冲撞问题现在大多数的WEP破解工具都是利用本缺陷工作的。
由于不同的数据帧加密时使用的IV值都是同一个,数据帧加密密钥本身是由基密钥与IV值串联得来的,而用户们常常使用Key ID为0的default key,因此数据帧加密密钥也是不安全的。
另外,IV值是明文发送的,攻击者可以通过观察来获得相同数据帧加密密钥的数据帧来获得密钥。
WEP里规定IV长度为24位,即IV数值的可选范围值只有224个,这样在理论上只要传输224个数据帧以后就会发生一次IV重用。
而由于IV是明文传输的,在攻击者得到两个或多个使用相同密钥的数据帧时,还能通过静态分析更快地取得明文。
3.由WEP破解工具原理看入侵思路国内外破解WEP的工具软件较多,大致的入侵思路仍是根据前文中提到的WEP漏洞,使用以下步骤入侵:A.使用Netstumbler(Windows下)或kismet(Linux下)等软件,将无线网卡配置为混杂模式,扫描周边Wi-Fi信号,并获得其ESSID和BSSID、IP以及频道ID。
但根据我的测试,Netstumbler对于不公开ESSID的接入点则无法发现;而Linux下的kismet在通常模式(即无其他客户端连接接入点)下也能发现不公开ESSID的接入点,虽然也无法获得其ESSID,但是能获得接入点的MAC地址和频道号,也便于为后面的注入攻击做好准备。
因此,WEP的破解,仍然是在Linux系统下为最好。
B.不管是在Windows平台还是在Linux平台,WEP的破解渗透首选工具仍然是Aircrack-ng系列工具包。
在Windows下,也有WinAircrack这种GUI版本,但包含工具较少,且功能较单一。
在Linux下,Aircrack工具包包含以下工具:1)Airodump-ng:802.11数据包截取工具2)Aireplay-ng:802.11数据包注入工具3)Aircrack-ng:WEP 及WPA-PSK key 破解主程序4)Airdecap-ng:WEP/WPA 数据包解密程序5)Airmon-ng:802.11 网络监听程序6)Packetforge-ng:802.11 数据包制造程序7)Airtun-ng:802.11 加密数据包集及数据包注入程序C.根据WEP的IV冲撞缺陷,使用Airodump截取足够多(通常在10,0000以上)的数据包,并生成cap所得的ivs文件,再利用aircrack做算法破解,这算是正统的做法。
在AP没有客户端连接,或者有客户端连接但数据流量较小的情况,为了增加单位时间内数据包的数量,采用Aireplay不断发送ARP包给AP。
D.但由于AP中经常内建防止攻击的机制,所以在用Aireplay的攻击模式3一段时间后,AP很可能主动地阻断来自于攻击者MAC的ARP包,导致数据包数量下降。
因此Aireplay也提供了另一种攻击模式0,此种攻击模式直接对已经成功连接上AP的合法无线客户端(其MAC可以由kismet扫描得到)进行ARP攻击,导致其掉线。
然后该合法客户端再次向AP发送带有SSID以及包含共享密钥和IV的数据帧,再次取得连接。
如此反复,则可以更加直接和大量地取得数据包。
当然,这种方式的缺陷也很明显,反复频繁地掉线很可能引起对方的警觉E.Aircrack工具包还有其他数种注入攻击模式,可以应对多种情况,在此我不再赘述。
附录:由Aircrack源代码看原理的实践过程由于单纯的解密算法与实现代码阅读快感实在太差,所以我并不打算对aircrack的源代码做分析,而只是针对该工具组里最核心的注入程序aireplay-ng 的源程序,拣取比较有独创性和特殊意义的几段作简要分析(源代码将附于附件):以上是aircrack-ng的LINUX版本源代码,可以看出aircrack的几个主要组件aircrack, aireply, airodump都在其中。
其中的主要部分包括算法破解的aircrack——这一部分我不打算讲解,如对算法有兴趣可自行阅读源代码;另一部分是注入入侵的aireplay,我将重点分析一下这个程序。
int n, i, ret;/* check the arguments */memset( &opt, 0, sizeof( opt ) );memset( &dev, 0, sizeof( dev ) );opt.f_type = -1; opt.f_subtype = -1;opt.f_minlen = -1; opt.f_maxlen = -1;opt.f_tods = -1; opt.f_fromds = -1;opt.f_iswep = -1; opt.ringbuffer = 8;opt.a_mode = -1; opt.r_fctrl = -1;opt.ghost = 0; opt.npackets = -1;opt.delay = 15; opt.bittest = 0;opt.fast = 0; opt.r_smac_set = 0;opt.npackets = 1; opt.nodetect = 0;/* XXX */#if 0#if defined(__FreeBSD__)/*check what is our FreeBSD version. injection worksonly on 7-CURRENT so abort if it's a lower version.*/if( __FreeBSD_version < 700000 ){fprintf( stderr, "Aireplay-ng does not work on this ""release of FreeBSD.\n" );exit( 1 );}首先是一段程序对*nix系统的自检,以检查该程序是运行环境是否正确,一般来说现在的主流*nix在gcc编译环境正确的情况下,不会出什么问题。