通過偽造Tor隱藏服務實現網絡釣魚的技術分析
一、寫在前面的話
SMS Privacy(一個使用比特幣購買匿名手機號的服務)現在已經成為了一種Tor隱藏服務,但現在大約只有不到10%的用戶會以這種隱藏服務的方式來使用它。在這篇文章中,我將跟大家分析一下攻擊者如何使用Tor隱藏服務來創建一個釣魚網站。
二、概述
今天故事的主人公是Charlie,當時他用Google搜索了“site:*.onion.to smsprivacy”的相關信息,并且得到了意想不到的結果。
smspriv6fynj23u6.onion是一個合法的隱藏服務名稱,但是在搜索結果中卻出現了另一個看起來非常相似的網站:smsprivyevs6xn6z.onion。
經過簡單的分析調查之后,他發現該網站只是一個簡單的代理:頁面請求首先會發送給一個釣魚網站,然后最終被轉發到真正的隱藏服務,最終返回響應數據。但是,這里還存在一些奇怪的地方。
1. 缺少Content-Length 頭
Content-Length 頭可以告訴HTTP客戶端需要接收多少個字節的內容。對于一個配置不當的代理服務器,如果傳遞的內容沒有改變的話,那么Content-Length 頭就不會發生變化。因為它知道內容不變的話數據的長度肯定不會變。
這也就意味著,如果代理服務器認為內容的長度可能會發生變化的話,那么就說明在某些情況下,服務器已經準備好去修改數據包的內容了。
但是為什么不可以根據修改版的數據包內容來寫入相應的Content-Length呢?
原因很可能是為了降低頁面的加載時間:如果代理不需要事先知道數據包的長度,那么它就可以在修改完數據包的內容之后直接將內容發送給客戶端了。如果它還要讀取所有的內容,然后進行修改,最后再將所有數據進行轉發的話,這樣就會增加頁面的加載時間并引起不必要的懷疑。
2. Connection 頭錯誤
下面給出的是合法網站與釣魚網站響應頭之間的對比:
合法網站:
- $ torsocks curl -Ihttp://smspriv6fynj23u6.onion/
- HTTP/1.1 200 OK
- Server: nginx/1.10.2
- Date: Fri, 13 Oct 2017 05:37:49 GMT
- Content-Type: text/html;charset=UTF-8
- Content-Length: 7387
- Connection: keep-alive
- Set-Cookie: [...]
- X-Frame-Options: DENY
釣魚網站:
- $ torsocks curl -Ihttp://smsprivyevs6xn6z.onion/
- HTTP/1.1 200 OK
- Server: nginx/1.10.2
- Date: Fri, 13 Oct 2017 05:37:57 GMT
- Content-Type: text/html;charset=UTF-8
- Connection: [object Object]
- Set-Cookie: [...]
- X-Frame-Options: DENY
Connection 頭會從keep-alive被重寫成[objectObject]。當你將一個對象(如果這個對象沒有實現toString()方法)轉換成字符串的時候,你將會在JavaScript中看到這種轉換的發生,這對于我們分析代理服務器運行的是哪一種軟件提供了非常有幫助的線索。
經過分析之后,我認為它很有可能使用的是NodeJS。我在node-http-proxy或Harmon(用于修改響應信息的中間件)中都沒有發現任何可以觸發該漏洞的地方,所以這很有可能是攻擊者自己實現的。如果你知道有哪一款軟件中的漏洞可以允許將Connection頭修改為[object Object]的話,請一定要告訴我。
除此之外,我還添加了一些Javascript腳本來對這個釣魚網站進行了進一步的分析,并且發現該網站采用了一種額外的緩存機制,其目的應該還是為了降低頁面的加載時間。
3. 隱藏服務的地址發生了改變
代理似乎會將smspriv6fynj23u6.onion的所有實例全部重寫到smsprivyevs6xn6z.onion,但有意思的是大小寫會發生變化。
4. 比特幣地址發生了改變
比特幣是這個釣魚網站真正的目的,一般來說,釣魚網站的目標是為了竊取用戶的帳號憑證,但是這個網站的目的似乎更加直接,它就是要騙用戶的比特幣。(注:其中的一個比特幣地址:
1GM6Awv28kSfzak2Y7Pj1NRdWiXshMwdGW)
當用戶首次訪問支付頁面的時候,頁面的加載會有一定的延遲,這很可能是后臺正在生成新的比特幣地址。所有新生成的比特幣地址會以文本形式顯示出來,但支付頁面上的二維碼卻沒有發生變化,掃描之后出來的仍然是原本合法的地址。
三、網站如何分發給用戶
我在分析的過程中還發現了另外兩個隱藏服務:
- 7cbqhjnpcgixggts.onion:”The onion crate”:這是一個Tor隱藏服務列表,類似于以前的“Web目錄”,但這是針對Tor的。其中的釣魚版本會被專門標記為“釣魚鏈接”。
- hss3uro2hsxfogfq.onion:”not Evil”:這是一個針對Tor隱藏服務的搜索引擎。搜索“sms privacy”后,返回的第一條結果是合法網站,而第二條結果就是釣魚網站。我點擊了釣魚網站下面的“report abuse”按鈕,但是現在這個網站還是沒有被移除。
這跟我想的完全不一樣,我一開始以為攻擊者可能會在Twitter、博客或者其他諸如此類的地方放置一條釣魚鏈接的,而不是直接通過搜索引擎顯示給用戶。如果我想讓用戶去訪問我的釣魚網站,我肯定不會將其標記為“釣魚鏈接”。我不認為“The onion crate”的管理人員與此事件有關,我感覺“not Evil”搜索引擎的運營者會是此次事件背后的始作俑者,不過我現在也無法確定。因為如果我要開發一個專門給用戶發送釣魚鏈接的搜索引擎,那我根本不會給用戶返回非釣魚網站的鏈接,尤其是第一個結果就是合法網站。
還有一種可能,就是這一網絡釣魚活動并沒有正式開始,但“The onion crate”在2017年5月17日就將其標記為了釣魚鏈接,說明它的存在已經有一定的時間了。
四、用戶如何保護自己
SMS Privacy的用戶首先要確保自己在瀏覽smsprivacy.org時使用的是HTTPS,或者說如果用戶使用的是Tor,那么smspriv6fynj23u6.onion是唯一的合法隱藏服務地址,其他所有類似的地址都是釣魚網站。
進一步研究
我猜測,運行這個代理的軟件同時還代理了很多其他的隱藏服務。當你想自己編寫一些代碼來代理一個隱藏服務時,你只需要重寫域名和比特幣地址,基本上就可以搞定了。
接下來,我又進行了一些深入研究。我查看了“The onion crate”并尋找其他的釣魚鏈接,然后我找到了一個在響應頭中給出了Connection: [object Object]并將網絡數據轉發給偽造的SMS Privacy隱藏服務地址的釣魚網站。分析后發現,這個隱藏服務與SMS Privacy合法服務毫不相關,但它能夠給用戶提供偽造的SMS Privacy內容!這也就意味著,這兩個釣魚網站很可能是跟同一個黑客或黑客組織有關的。HTTP數據如下所示:
- $ torsocks curl -I -H 'Host:smsprivyevs6xn6z.onion' http://cboc66yz75virnj7.onion
- HTTP/1.1 200 OK
- Server: nginx/1.10.2
- Date: Fri, 13 Oct 2017 16:26:10 GMT
- Content-Type: text/html;charset=UTF-8
- Connection: [object Object]
- Set-Cookie: mojolicious=eyJsYW5kaW5nX3VybCI6Ii8iLCJhYnRlc3RzIjp7ImxhbmRpbmdfdXJsIjoiLyIsInNpZ251cGxpbmsiOiJvcmlnaW5hbCIsInJlZmVyX3NyYyI6Im5vbmUiLCJoaWRkZW5fc2VydmljZSI6ImhpZGRlbiJ9LCJleHBpcmVzIjoxNTA3OTE1NzE1LCJjc3JmX3Rva2VuIjoiZmQzNjc4NzcyMjRiNDZkZWZhYjNhM2ViZDIwMDY0ZmRmMDliZmQ0NCIsImFidGVzdHNfc2Vzc2lvbmlkIjoiOGM4NWQxMTZjMmE1MTBkOSJ9--785fbe83dce1217e74543ed831eb4c18c1cd6105;expires=Fri, 13 Oct 2017 17:28:35 GMT; path=/; HttpOnly
- X-Frame-Options: DENY
五、總結
實際上,攻擊者可以輕而易舉地利用這項技術來發動大規模攻擊,因為只需要一個周末的時間就可以開發出一個可以正常使用的版本。而且我相信在不久的將來,會有更多的攻擊者使用其他的Tor隱藏服務來制作釣魚網站。