中间人攻击

**中間人攻擊**（英語：**M**an-**i**n-**t**he-**m**iddle attack，縮寫：**MITM**）在密碼學和電腦安全領域中是指攻擊者與通訊的兩端分別建立獨立的聯絡，並交換其所收到的資料，使通訊的兩端認為他們正在通過一個私密的連接與對方直接對話，但事實上整個對談都被攻擊者完全控制。在中間人攻擊中，攻擊者可以攔截通訊雙方的通話並插入新的內容。在許多情況下這是很簡單的（例如，在一個未加密的 Wi-Fi 無線存取點的接受範圍內的中間人攻擊者，可以將自己作為一個中間人插入這個網路）。

一個中間人攻擊能成功的前提條件是攻擊者能將自己偽裝成每一個參與對談的終端，並且不被其他終端識破。中間人攻擊是一個（缺乏）相互認證的攻擊。大多數的加密協定都專門加入了一些特殊的認證方法以阻止中間人攻擊。例如，SSL 協定可以驗證參與通訊的一方或雙方使用的憑證是否是由權威的受信任的數位憑證認證機構頒發，並且能執行雙向身分認證。

## 特性

中間人攻擊需要通過一個安全的通道做額外的傳輸。與連鎖協定不同，所有能抵禦中間人攻擊的加密系統都需要通過一個安全通道來傳輸或交換一些額外的資訊。為了滿足不同安全通道的不同安全需求，許多金鑰交換協定已經被研究了出來。

## 攻擊範例

假設愛麗絲（Alice）希望與鮑伯（Bob）通信。同時，馬洛里（Mallory）希望攔截竊對談以進行竊聽並可能在某些時候傳送給鮑伯一個虛假的訊息。

首先，愛麗絲會向鮑伯索取他的公鑰。如果 Bob 將他的公鑰傳送給 Alice，並且此時馬洛里能夠攔截到這個公鑰，就可以實施中間人攻擊。馬洛里傳送給愛麗絲一個偽造的訊息，聲稱自己是鮑伯，並且附上了馬洛里自己的公鑰（而不是鮑伯的）。

愛麗絲收到公鑰後相信這個公鑰是鮑伯的，於是愛麗絲將她的訊息用馬洛里的公鑰（愛麗絲以為是鮑伯的）加密，並將加密後的訊息回給鮑伯。馬洛里再次截獲愛麗絲回給鮑伯的訊息，並使用馬洛里自己的私鑰對訊息進行解密，如果馬洛里願意，她也可以對訊息進行修改，然後馬洛里使用鮑伯原先發給愛麗絲的公鑰對訊息再次加密。當鮑伯收到新加密後的訊息時，他會相信這是從愛麗絲那裡發來的訊息。

1. 愛麗絲發送給鮑伯一條訊息，卻被馬洛里截獲：

> **愛麗絲** _「嗨，鮑伯，我是愛麗絲。給我你的公鑰」_ --> **馬洛里** **鮑伯**
> 
> 

2. 馬洛里將這條截獲的訊息轉送給鮑伯；此時鮑伯並無法分辨這條訊息是否從真的愛麗絲那裡發來的：

> **愛麗絲** **馬洛里** _「嗨，鮑伯，我是愛麗絲。給我你的公鑰」_ --> **鮑伯**
> 
> 

3. 鮑伯回應愛麗絲的訊息，並附上了他的公鑰：

> **愛麗絲** **馬洛里**<-- _[鮑伯的公鑰]_-- **鮑伯**
> 
> 

4. 馬洛里用自己的金鑰替換了訊息中鮑伯的金鑰，並將訊息轉發給愛麗絲，聲稱這是鮑伯的公鑰：

> **愛麗絲**<-- _[馬洛里的公鑰]_-- **馬洛里** **鮑伯**
> 
> 

5. 愛麗絲用她以為是鮑伯的公鑰加密了她的訊息，以為只有鮑伯才能讀到它：

> **愛麗絲** _「我們在公共汽車站見面！」--[使用馬洛里的公鑰加密]_ --> **馬洛里** **鮑伯**
> 
> 

6. 然而，由於這個訊息實際上是用馬洛里的金鑰加密的，所以馬洛里可以解密它，閱讀它，並在願意的時候修改它。他使用鮑伯的金鑰重新加密，並將重新加密後的訊息轉發給鮑伯：

> **愛麗絲** **馬洛里** _「在家等我！」--[使用鮑伯的公鑰加密]_ --> **鮑伯**
> 
> 

7. 鮑伯認為，這條訊息是經由安全的傳輸通道從愛麗絲那裡傳來的。

這個例子顯示了愛麗絲和鮑伯需要某種方法來確定他們是真正拿到了屬於對方的公鑰，而不是拿到來自攻擊者的公鑰。否則，這類攻擊一般都是可行的，在原理上，可以針對任何使用公鑰 —— 金鑰技術的通訊訊息發起攻擊。幸運的是，有各種不同的技術可以幫助抵禦 MITM 攻擊。

## 防禦攻擊

許多抵禦中間人攻擊的技術基於以下認證技術：

* 公鑰基礎建設
  * 在 PKI 方案中，主要防禦中間人攻擊的方案就是 PKI 的相互認證的機制。使用這樣的機制並由應用程式驗證使用者，使用者裝置驗證應用程式。但在某些流氓應用的情況下，這不是很有用，所以需要注意對流氓軟體應與正規軟體進行區分。
* 更強力的相互認證，例如：
  * 金鑰（通常是高資訊熵的金鑰，從而更安全），或
  * 密碼（通常是低的資訊熵的金鑰，從而降低安全性）
* 延遲測試，例如使用複雜加密雜湊函式進行計算以造成數十秒的延遲；如果雙方通常情況下都要花費 20 秒來計算，並且整個通訊花費了 60 秒計算才到達對方，這就能表明存在第三方中間人。
* 第二（安全的）通道的校驗
* 一次性密碼本可以對中間人攻擊免疫，這是在對一次密碼本的安全性和信任上建立的。公鑰體系的完整性通常必須以某種方式得到保障，但不需要進行保密。密碼和共享金鑰有額外的保密需求。公鑰可以由憑證頒發機構驗證，這些公鑰通過安全的管道（例如，隨 Web 瀏覽器或作業系統安裝）分發。公共金鑰也可以經由 Web 線上信任進行線上驗證，可以通過安全的途徑分發公鑰（例如，通過面對面的途徑分發公鑰）。

檢視金鑰交換協定以了解不同類別的使用不同金鑰形式或密碼以抵禦中間人攻擊的協定。

## 中間人攻擊的取證分析

從被懷疑是中間人攻擊的連結中捕捉網路封包並進行分析可以確定是否存在中間人攻擊。在進行網路分析並對可疑的 SSL 中間人攻擊進行取證時，重要的分析證據包括：

* 遠端伺服器的 IP 位址
* DNS 域名解析伺服器
* X.509 憑證伺服器
  * 憑證是自簽章憑證嗎？
  * 憑證是由信任的頒發機構頒發的嗎？
  * 憑證是否已被吊銷？
  * 憑證最近被更改過嗎？
  * 在網際網路上的其他的客戶端是否也得到了相同的憑證？

## 其他的非加密的中間人攻擊

一個著名的非加密中間人攻擊的例子是貝爾金無線路由器 2003 年的某一個版本所造成的。它會周期性地接管通過它的 HTTP 連接，阻止封包到達目的地。並將它自己對請求的回應作為應答返回。而它傳送的回應，則是在使用者原本應該顯示網頁的地方，顯示一個關於其他貝爾金產品的廣告。在遭到了解技術詳情的使用者的強烈抗議後，這個功能被貝爾金從路由器後續版本的韌體中刪除。

另一個典型的非加密中間人攻擊的例子是「圖靈色情農場」。布賴恩・華納說，這是垃圾郵件傳送者用來繞過驗證碼的「可以想像的攻擊」。垃圾郵件傳送者設定了一個色情網站，而存取這個色情網站需要使用者解決一些驗證問題。這些驗證問題實際上是其他網站的驗證問題。這樣就可以達到繞開網站驗證傳送垃圾郵件的目的。然而，Jeff Atwood 指出，這次襲擊僅僅是理論上的 —— 沒有任何證據指出垃圾郵件傳送者曾經在 2006 年建立了圖靈色情農場。然而，2007 年 10 月有新聞報導稱，垃圾郵件傳送者確實建立了一個 Windows 遊戲，當使用者鍵入從雅虎收到的註冊電子信箱驗證碼後，程式將獎勵使用者色情圖片。這將允許垃圾郵件傳送者建立臨時的免費電子郵件帳戶以傳送垃圾郵件。

## 實現

* dsniff - 一個實現 SSH 和 SSL 中間人攻擊的工具
* Cain and Abel - Windows 圖形介面的工具，它可以執行中間人攻擊，嗅探和 ARP 投毒
* Ettercap - 一個基於區域網路的中間人攻擊工具
* Karma - 一個使用 802.11 Evil Twin 以執行 MITM 攻擊的工具
* AirJack - 一個演示 802.11 MITM 攻擊的工具
* SSLStrip 一個基於 SSL 的 MITM 攻擊的工具。
* SSLSniff 一個基於 SSL 的 MITM 攻擊的工具。原本是利用一個在 Internet Explorer 上缺陷實現的。
* csploit - 一個在 android 系統上實現的 MITM 攻擊工具包。
* Mallory - 一個透明的 TCP 和 UDP MiTMing 代理。擴充到 MITM SSL，SSH 和許多其他協定。
* wsniff - 一個 802.11HTTP / HTTPS 的基於 MITM 攻擊的工具
* 安裝在自動取款機銀行卡插槽上的附加讀卡機和安裝在鍵盤上的附加密碼記錄器。
* zanti - 一款在 android 系統上的多功能網路滲透包。

## 參見

* 瀏覽器中間人攻擊 - 一種網頁瀏覽器中間人攻擊
* Boy-in-the-browser - 一個簡單的 Web 瀏覽器中間人攻擊
* Aspidistra transmitter - 英國二戰「入侵」行動中使用的無線電發射器，早期的中間人攻擊。
* 電腦安全 - 安全的電腦系統的設計。
* 安全性分析 - 在不完全知道加密方法的情況下破解加密後的資訊。
* 數位簽章 - 一個加密文字的真實性擔保，通常是一個只有筆者預計將能夠執行計算的結果。
* 聯鎖協定 - 一個特定的協定，在金鑰可能已經失密的情況下，規避可能發生的中間人攻擊。
* 金鑰管理 - 如何管理金鑰，包括生成，交換和儲存金鑰。
* 金鑰協商協定 - 又稱金鑰交換協定，一個協商如何建立適合雙方通信的金鑰的協定。
* 相互認證 - 如何溝通各方的信心建立在彼此的身分。
* 密碼認證金鑰協定 - 建立使用密碼鑰匙的協定。
* 量子密碼 - 量子力學的使用提供安全加密（老方法，而依靠單向函式）。
* 安全通道 - 一種在通信中防截獲和防篡改的方式。
* 欺騙攻擊
* HTTP 嚴格傳輸安全
* HTTP 公鑰固定
* 哈薩克斯坦政府實行的中間人攻擊

## 參考資料