[cpp]
//--------------------------------------------------------------------
// 深入理解Aireplay-ng各種攻擊及其原理
// 作者:GaA.Ra(zhoufan#yahoo.cn)
// 隨意轉載,但請保留此部分信息,謝謝
//--------------------------------------------------------------------
這裡主要講常用的攻擊模式(對於-6,-7攻擊並不涉及),深入原理的集中在-2,-4,-5這三種攻擊
[cpp]
/*-------------------------------------------------------------------
Attack modes (numbers can still be used): //攻擊模式(數字仍然可以使用)
--deauth count : deauthenticate 1 or all stations (-0) //解除一個或者全部站的連接
--fakeauth delay : fake authentication with AP (-1) //對AP進行偽連接攻擊
--interactive : interactive frame selection (-2) //交互注入攻擊
--arpreplay : standard ARP-request replay (-3) //標准Arp請求包重放攻擊
--chopchop : decrypt/chopchop WEP packet (-4) //解碼或斷續WEP數據包攻擊
--fragment : generates valid keystream (-5) //產生合法密鑰流
-------------------------------------------------------------------*/
一.-0攻擊
-0攻擊主要是偽造一個disassocate包,讓ap斷開與客戶端的鏈接,此時客戶端會重新連接ap,那麼我們從中可能得到的東西有:1,假如AP不廣播ESSID,那麼我們可以得到這個ESSID;2.如果使用的是WPA/WPA2的加密方式,通過這樣做強迫客戶端重新驗證,我們就能夠獲得握手包;3.再重新連接過程中我們可以獲取到ARP數據包,為-3攻擊做准備.
二.-1攻擊
之前我一直也沒弄明白為什麼能夠進行偽連接,既然我們並不知道WEP密碼,那麼如何進行連接?偽連接的偽主要體現在什麼地方?這個應該是和AP的工作機制有關.我自己的理解是,在客戶端與AP通信的時候,客戶端需要在AP那裡登記自己的MAC地址,這樣AP才會接受這個MAC地址的網卡產生的數據包進行下一步的工作.一般WEP驗證過程為:1.客戶端發給AP認證請求 2.AP發回挑戰字串 3.客戶端利用WEP密碼加密字串返回給AP 4.AP對返回結果進行本地匹配判斷是否通過認證. 偽連接實際上就是進行了第1步,此後AP就登記了客戶端的MAC地址,此時AP等待的是客戶端返回挑戰字串的加密包,對於攻擊者,此時AP已經能夠接受各種偽裝生成的數據包並對其作出反應了.這一步對於無客戶端的-2,-4,-5攻擊相當重要.很明顯,這樣偽連接並不產生任何ARP包,同時也不會獲得正確的WPA/WPA2握手包.
三.-2攻擊
-2攻擊實際上是對特定的數據包進行重放,當AP收到這個數據包的時候對這個數據包進行廣播,進而我們能夠獲得更多的iv以達到破解的要求.這個特定的數據包需要滿足什麼要求,我們需要了解一些相關的IEEE802.1幀控制的知識.如圖
圖中是一個ARP包,可以看到在數據包的開始位置就是幀控制的數據結構,長度是2字節.第一個字節的結構是{Version:4bit,Type:2bit,Subtype:2bit}對於這部分,我們需要的是一個Type為2,也即是Data frame(數據幀),因為只有是數據幀,那麼才有iv,才會用到WEP加密數據.對於flag字節,也就是第二個字節,我們需要設置To DS域為1(圖中設置了From DS域為1),To DS域表示To Distribution System的標志,因為數據使用了WEP加密,所以Protected flag也被置為1,此時加上一個FF:FF:FF:FF:FF:FF的目標地址(廣播地址)則這個就是我們可以重放的數據包.當AP收到這個數據包時,會對他使用新的IV加密後廣播.我們不斷的重放這個數據包以達到收集IV的目的.
這裡產生的疑問是,是否我們沒有抓到這樣的一個數據包我們就不能進行交互注入?答案是否定的.我們常用的是0841注入,通過對一個合法的數據幀進行修改,讓他符合上面的條件從而使AP接收並重新廣播.我們看一下為什麼叫0841,0841的二進制位0000 1000 0100 0001,從剛才的分析看到,1000中的10是Type域,0100中1是Protected flag,0001中的1是To DS,這樣合起來便是0841的含義.等待一個AP自然產生的滿足條件的數據幀有時候需要等待很久,如果我們對於一個合法的數據幀的幀控制進行修改,改成0841,同時修改目標地址為廣播地址(注意幀控制和目標地址等都是以明文形式發送),由於AP並不檢查數據內容,只是從控制字段判斷,所以AP會對收到的這個我們修改過的數據包進行廣播,從而我們也就達到我們的目的--收集IV.當然我們修改的數據幀的長度最好不要太長.
另外,-2攻擊可以配合packetforge-ng產生的偽造數據包進行重放.
四,-3攻擊
ARP請求重放攻擊,當抓取到一個ARP請求包的時候對它進行重放,WEP體系允許IV的重復使用因此AP會對重放的ARP請求包進行應答,從而能夠收集到足夠數量的IV.利用arp請求包的重放效率是最高的.後面的-4,-5攻擊在獲得XOR文件也即是密鑰流之後,也是利用packetforge-ng生成一個arp請求包用以重放.
五,-4攻擊
KoreK的Chopchop攻擊,這個攻擊的理論是基於對CRC算法的數學分析的基礎上,對於數學部分我們這裡不深入探討,只是用到KoreK提到的結論.WEP的核心加密算法是RC4(參考 RC4算法使用的是異或加密(我們用XOR表示異或操作),簡單流程這樣,我們提供一個40位的密鑰,加上IV提供24位,總共64位作為種子,RC4根據這個通過PRGA(偽隨機生成算法)產生密鑰流,這個密鑰流與我們要發送的數據進行異或操作即完成加密.為了保證數據傳送過程中的完整性,WEP使用CRC算法在數據後加上4個字節的校驗碼(這4個校驗碼也要跟密鑰流進行異或加密),我們稱這4個字節為ICV(Integrity check value).現在假設我們要發送的數據明文為P,密鑰流為KeyStream,那麼,加密的數據M=(P + ICV(P)) XOR KeyStream,如果我們知道明文P,那麼我們就能夠得到KeyStream(=M XOR (P+ICV(P))),有了KeyStream我們就能偽造任意的數據包(如ARP請求包),發送給AP從而收集IV.關鍵在於如何得到明文P,KoreK的研究發現,當我們把抓取到的數據包M截去最後的一個字節的時候,此時數據包是無效的數據包(ICV錯誤),但是當與一個掩碼進行XOR運算之後,這個數據包將會恢復為有效的數據包.而這個掩碼的計算取決於我們截去的那個字節的明文(我們截去的字節已經經過加密),一個字節是8位,通過最多2^8=256次嘗試,我們能夠確定截去字節的明文.思路如下:
1,我們抓取一個數據包,然後截去這個數據包加密部分的最後一個字節(注意,數據包包含有用RC4加密的部分和以明文傳輸的幀控制部分兩部分,看上面-2攻擊的圖).
2,我們產生256個掩碼,每個掩碼對應一個明文字節,然後進行異或操作.
3,將這256個數據包的目標MAC地址改為組播地址,格式如01:00:5E:00:00:XX,XX和明文字節相同.
4,發送這256個數據包,通過AP的返回的數據包目標地址最後一個字節判斷明文是什麼,記錄下來.
5,利用返回的數據包重復第1步直到獲得所有明文.
當獲得所有明文之後,將其與原始數據包加密部分異或,得到密鑰流KeyStream.Aireplay-ng將它保存為一個XOR文件.
六,-5攻擊
Fragment攻擊,這個攻擊我個人覺得是所有攻擊裡最具有藝術性的,他利用了IEEE8021機制和WEP算法兩者的漏洞,最終能夠得到最大1500字節的密鑰流.對於Chopchop攻擊,我們得到的密鑰流的長度取決於我們能夠抓取到的數據包加密部分的長度,並且隨著數據包的長度增大,猜測的次數將會增加,使得獲取密鑰流的時間也變長,而Fragment不僅獲取大長度的密鑰流,同時需要用到的時間也大大減少.
對於在無線局域網傳送的數據中都被加入了LLC頭部,而LLC頭部字節是固定的.如圖
這部分就是WEP加密部分的頭8個字節,對於ARP包,??為06,對於IP包,??為00,現在我們有了8個字節的明文,通過對數據包的異或操作,我們得到了8個字節的密鑰流.利用8個字節以及802.1的分片機制,我們可以得到更大長度的密鑰流.先說說分片,無線局域網中,數據包的最大分片數為16,利用8字節密鑰流我們偽造16個加密部分8字節的數據包發送(4字節明文+4字節ICV,明文我們知道),當AP收到16個碎片包之後,AP將其組裝成一個數據包,將其重發,我們抓取這個數據包,一個我們知道是4字節明文,16個就是64字節的明文,加上AP為64字節數據加上的ICV,我們得到了68字節的密鑰流(明文與密文異或得到),重復偽造16個68字節的數據包發送(64字節明文+4字節ICV),最終得到1028字節的密鑰流(64*16+4),再重復發兩個包就能得到1500字節的密鑰流.全部過程我們最少只需要發送34個數據包!!這樣就大大縮短了獲取密鑰流的時間.或者在得到一定長度的密鑰流之後比如36字節,剛好可以用來偽造一個arp包,進行重放,也縮短了收集IV的時間.由於ChopChop是從後向前猜測得到密鑰流,所以ChopChop的效率不太可能提高.
另外,Fragment攻擊也可以用於猜測密鑰.如果AP對分片數據不返回,那麼可以從第9字節處(LLC頭部之後)開始猜測密鑰流,同樣也是256種可能,過程類似Chopchop攻擊,區別只是在於一個從前向後猜的是密鑰流字節,一個從後往前猜的是明文字節.
對於Fragment細節想深入了解的朋友,強烈推薦論文<The Final Nail in WEP's Coffin>
寫了一個下午,很多本來想寫的東西最終發現涉及很多基礎,不想面面俱到,我接觸無線網絡安全也不久,難免有些理解錯誤的地方,希望能和大家交流:)