暗網?不,是“蜜罐”
最近發生在美國一個華人綁架事件把“暗網(Darknet或Dark Web)”帶入到公眾的視野,本文從技術角度分析暗網的工作原理和安全性。
什么是暗網
我們日常使用的互聯網(Internet)被稱為“明網”,與之對應的借助互聯網而形成的“隱藏”的網絡被稱為“暗網”。所以“暗網”其實是還是屬于互聯網,只不過它不為我們所知。暗網相對于“明網”最大的特點是——匿名,通過一些技術手段保證通訊雙方的匿名性。最著名的匿名技術叫“洋蔥路由(Onion routing)”,Tor是基于這種技術實現的一套軟件。除此之外還有一個叫“大蒜路由(Garlic routing)”的技術,I2P是基于這種技術實現的一套軟件。Tor的用戶群更大幾乎成了暗網的代名詞所以我們主要關注Tor。利用Tor可以實現兩種匿名方式
- 作為客戶端匿名訪問某個明網的服務器,此時Tor保護客戶端的匿名性,明網的服務器是無法獲知躲在暗網的客戶端的IP地址。比如一些黑客在入侵的時候會利用Tor隱藏自己的身份。
- 作為服務器端在暗網提供服務,此時Tor保護服務器端的匿名性,暗網的客戶端可以訪問服務器端資源但是不知道服務器端資源的IP地址。 這種服務器一般以.onion這樣的域名結尾,比如著名的WannaCry(比特幣勒索軟件)提供的付款地址就是位于暗網的一臺服務器(以.onion域名結尾)。
Tor鏈路原理
在講解Tor原理之前必須先要搞清楚傳輸層安全協議(Transport Layer Security,TLS)TLS的前身是安全套接層(Secure Sockets Layer,SSL)目的是為了防止數據被竊聽、篡改、冒充。TLS的工作原理非常簡單,客戶端通訊的時候會先向服務器端索要公鑰,然后通過公鑰加密要發送的數據,服務器端收到數據后利用私鑰解密。
Tor有兩種主要服務器角色,中繼服務器是負責中轉數據包的,可以理解為代理;目錄服務器保存中繼服務器的列表(保存中繼服務器地址、公鑰)。當客戶端訪問目標服務器的時候會先通過查詢目錄服務器獲取中繼服務器列表(圖中紅色部分);客戶端從中繼服務器列表中選擇三個延時最低的作為中繼服務器并建立鏈路(Tor稱為Circuit),客戶端后續的所有請求都通過這條鏈路到達目標服務器以達到匿名的目的。在整個通訊過程,客戶端<->目錄服務器,客戶端<->中繼服務器,中繼服務器<->中繼服務器,雖然這三次通訊是建立在TLS之上的(圖中的紅色和藍色),但是DPI(深度數據包檢測)還是能探測到TCP的包頭——目標地址、源地址、目標端口、源端口(TLS只會加密TCP、UDP的Data部分,畢竟路由尋址需要依靠IP頭部和TCP、UDP頭部的)。這里的源地址是用戶訪問公網的真實地址,一般運營商提供上網服務都會有備案,所以是可以通過這個IP地址追查到具體某個用戶的。所以Tor在TLS之上疊加了一層鏈路,通過這個鏈路來轉發數據已達到匿名的目標。
匿名原理
Tor中相互通訊所采用的數據包叫Cell,它是固定長度的。
CircID是客戶端產生的一個隨機數,用于區別不同的鏈路(Circuit),我們可以理解為一個目標服務器代表一條鏈路;CMD是一個枚舉值表示數據包的含義(比如建立鏈路、關閉鏈路)。Tor選擇3個中繼服務器后會先嘗試和第一個服務器“握手”(OR1是指第一個中繼服務器也叫入口路由,OR2是第二個,OR3是第三個也叫出口路由)
- 客戶端會生成一對密鑰(一個公鑰client-publicKey,一個私鑰client-privateKey)構建一個Cell,CircID=隨機數N,CMD=create,Data=加密(OR1,client-publicKey)。注意Data部分傳遞的是客戶端的的公鑰,這個數據會用目標中繼服務器的公鑰加密。(每臺中繼服務器都會產生一對密鑰,公鑰發布到目錄服務器上,私鑰自己保存)
- OR1收到數據包后檢查CMD部分發現是create,然后用私鑰解開data部分保存client-publicKey。然后生成一對密鑰(公鑰or1-circuit-publicKey,or1-circuit-privateKey)構建一個返回數據包,CircID=N(客戶端產生的),CMD=created,Data=加密(client-publicKey, or1-circuit-publicKey)。Data部分是中繼服務器為這次會話(circuit)產生的臨時密鑰對,通過client的公鑰加密。
- 客戶端收到數據后檢查CMD部分是created,用私鑰解開data部分保存中繼服務器1的臨時公鑰。接下來客戶端要和OR2建立連接,這次連接是通過OR1建立的所以數據包還是發送給OR1的。
- 客戶端構建“擴展數據包”,CircID=N,CMD=relay,Data部分是OR2的地址信息、公鑰信息。當然Data部分用or1-circuit-publicKey加密。
- OR1收到數據包,發現是relay,用私鑰解開data部分拿到OR2的地址信息和公鑰,利用上面的握手過程(和客戶端到OR1一樣)完成OR1和OR2之間的握手。
- 同樣的道理OR2也和OR3完成握手
整個握手過程就是鏈路建立過程,首先是客戶端和OR1建立鏈路然后通過“擴展”指令讓OR1<->OR2、OR2<->OR3之間建立鏈路。鏈路建立成功后客戶端會發送CMD=data的數據包,其中DATA部分是經過三層公鑰加密的or1-circuit-publicKey(or2-circuit-publicKey(or3-circuit-publicKey(data))),OR1收到數據包后會解密第一層然后交給OR2,解密第二層以此類推。就像剝洋蔥一樣,剝了一層又一層,這就是“洋蔥路由”名稱的來歷。通訊過程中看似OR1是知道客戶端的公網IP的,其實不然。有兩種方法保證了匿名性:1. OR服務器來源于互聯網用戶自己提供的,客戶端使用的時候是隨機選擇的,所以隨機性很大。2. OR1服務器并不知道自己是“入口路由”,它僅僅知道有一個請求需要建立鏈路,因為客戶端的建鏈過程和OR1到OR2的建鏈過程是一樣的。每個OR服務器僅僅知道建立鏈路而沒有辦法判斷請求者是實際用戶還是其他OR服務器。
Tor安全嗎
首先我們要搞清楚Tor的目標不是提供代理服務器而是實現匿名,所以它的設計其實是很脆弱的。攻擊它的方式有兩種:
- 釜底抽薪,Tor屬于集中式設計,它正常工作完全依賴于目錄服務器。為了防止目錄服務器被冒充所有的目錄服務器IP地址都被硬編碼在客戶端一共9個主用的,151個備用的。禁用這些IP地址或者直接干掉這些服務器那么Tor網絡就徹底癱瘓了,所謂的“暗網”就永遠從世界上消失了(^_^,厲害的我都害怕了)。
- 破除匿名,釜底抽薪的方式最徹底但是對于技術流是沒有挑戰性的,“暗網”是一個魚龍混雜的地方美帝的FBI、五角大樓之類的機構還指望從上面收集信息呢,如果直接把網絡干掉了屬于“同歸于盡”的做法。破除Tor匿名的唯一辦法是加入到Tor之中——成為一臺OR服務器,因為Tor會選擇延時比較低的OR作為服務器所以對于“美帝”來說他們可以利用網絡優勢讓服務器更容易被選中。
成為OR之后就可以收集數據里,記錄每條鏈路建立的時間,前驅后繼,然后再通過在明網收集到客戶端訪問目錄服務器(目錄服務器是固定的)的證據就可以“基于時間”判斷出他訪問了暗網從而破除匿名。更牛逼的是通過“強制”解開數據包還有更大的驚喜——如果解包成功說明這臺OR服務器承擔了“出口”的角色,出口到目標服務器數據是不經過加密的,據說維基解密的很多資料都是通過這種方式獲取的。
總結
Tor的Cell是over在TCP、UDP之上的(作為TCP、UDP的data部分)而TCP、UDP鏈路是經過TLS保護的所以DPI是識別不了Tor Cell,也就沒有辦法判斷用戶是否在訪問暗網。通過握手機制建立起來的鏈路保護了用戶訪問時的匿名性,即便是中間參與轉發數據的代理服務器也沒有辦法判斷誰訪問了暗網。當然再狡猾的狐貍也斗不過獵手,Tor的安全性其實沒有想想的那么高反而很容易就被攻擊。更加要命的是可以輕而易舉的徹底摧毀Tor網絡,而美帝之所以不這么做是想通過暗網獲取更多信息,監控更多的人(好比一個天然的大“蜜罐”系統)。
【本文是51CTO專欄作者“邢森”的原創文章,轉載請聯系作者本人獲取授權】