本文首發自【程式猿石頭】微信公眾號:可怕,原來 HTTPS 也沒用 其他相同內容均為未授權轉載抄襲。
用 HTTPS 摸魚,你以為就安全了?
工作時間上網摸魚,你以為公司就不知道了?
背景
最近發生了幾個事情,想必你已經看到過了:
-
網傳 某PDD員工在某匿名社群釋出同事被抬上救護車的照片被抓出來並辭退?
-
某運營同學在試用期期間因為在工作期間上了某 1024 網站,導致試用期不過。(恰好今天瀏覽到一個知乎問題)
試用期不過因在公司瀏覽 1024 網站
- 前兩天還看到不少公眾號推文,大意是:看小電影前一定要注意網址是不是 HTTPS 的,因為 HTTPS 是加密的,別人就不知道了。
看到上面幾個問題,我不禁想問(這腦回路也是……):
- 通過瀏覽器訪問 HTTPS 站點,其他人知道嗎?
- 通過 App 訪問匿名論壇(HTTPS),公司知道麼?(他是不是接入了公司 WiFi?)
總之就是,上班時間上網摸魚嗎?哪怕用 HTTPS 問,如果公司知道,是通過什麼手段?
本文談談我的看法,主要分為以下幾個方面:
- HTTPS 為什麼安全。
- HTTPS 真的安全嗎?
- App 如何保證資訊保安,不被爬走?
- 公司可能的監控手段有哪些?我們應該怎麼做?
HTTPS 為什麼安全
HTTPS,也稱作 HTTP over TLS,TLS 前身是SSL,會有各個版本。
TLS協議在TCP/IP協議棧中的關係
上圖描述了在TCP/IP協議棧中TLS(各子協議)和 HTTP 的關係。HTTP+TLS 也就是 HTTPS,和 HTTP 相比,HTTPS的優勢:
- 資料完整性:內容傳輸經過完整性校驗
- 資料隱私性:內容經過對稱加密,每個連線生成一個唯一的加密金鑰
- 身份認證:第三方無法偽造服務端(客戶端)身份
上面內容參考了HTTPS工作原理[1]。(石頭在N 久前用印象筆記收藏的,現在好多原文訪問不了了)
HTTPS 原理
上圖就是大致介紹了 HTTPS 的握手流程,感興趣的同學可以用 WireShark 抓包詳細看看其中的每一個步驟,有助於理解 HTTPS 的完整流程。這裡,我就不詳述了,可以參考下小林的這篇圖解 HTTPS,很詳細;石頭在 14 年也寫過一篇抓包分析的文章。 Mac/Windows Wireshark/tcpdump抓包TCP 3次握手,4次揮手例項[2]
大致就是客戶端和服務端通過“握手會談”商量出一個雙方支援的加密演算法和相應隨機引數,得到一對金鑰,後續的傳輸的內容都通過這對金鑰進行加解密。
這對金鑰很牛皮,比如要加密傳輸訊息『tangleithu』,客戶端通過公鑰加密得到的密文『xyyaabbccdd』進行傳輸,服務端用自己的私鑰對密文解密,恰好能得到『tangleithu』。中間錯一位都不行,這樣就保證了資料完整和隱私性。
這個過程比較複雜,本文不詳述,類似的原理可參考石頭多年前寫的這篇文章 —— RSA演算法。
因此,你在通過 HTTPS 訪問網站的時候,就算流量被擷取監聽,獲取到的資訊也是加密的,啥實質性的內容也看不到。
例如,如下圖所示,當我訪問某個網站,此時通過 wireshark 抓包得到的資訊,能獲得僅僅是一些通訊的IP地址而已。
HTTPS加密傳輸
這下放心了嗎?
摸魚的過程中,就算訪問的 IP 地址被知道了,好像也無關緊要?
其實,有了 IP 地址也能獲取不少資訊了。
還好這個 IP 搜出來是 github,而不是……
你或許會高興,連個網站域名都看不到,可以放心摸魚了。不過,這是真的嗎?
HTTPS 真的安全嗎?
HTTPS 真的完全安全嗎?連訪問的域名都獲取不到?答案是否定的。
上述 HTTPS 在握手階段有一個很重要的東西 —— 證書。
SNI —— 域名裸奔
當訪問 HTTPS 站點時,會首先與伺服器建立 SSL 連線,第一步就是請求伺服器的證書。
當一個 Server IP 只對應一個域名(站點)時,很方便,任意客戶端請求過來,無腦返回該域名(服務)對應的證書即可。但 IP 地址(IPv4)是有限的呀,多個域名複用同一個 IP 地址的時候怎麼辦?
伺服器在傳送證書時,不知道瀏覽器訪問的是哪個域名,所以不能根據不同域名傳送不同的證書。
因此 TLS 協議升級了,多了 SNI 這個東西,SNI 即 Server Name Indication,是為了解決一個伺服器使用多個域名和證書的 SSL/TLS 擴充套件。
現在主流客戶端都支援這個協議的。別問我怎麼知道這個點的,之前工作上因為這個事情還費了老大勁兒……
它的原理是:在與伺服器建立 SSL 連線之前,先傳送要訪問站點的域名(Hostname),這樣伺服器會根據這個域名返回一個合適的證書。此時還沒有辦法進行加解密,因此至少這個域名是裸奔的。
如下圖所示,上面的截圖其實是訪問我的個人部落格(www.tanglei.name)的抓包情況,客戶端傳送握手請求時,很自覺帶上了自己的域名。
HTTPS SNI
因此,即便是 HTTPS,訪問的域名資訊也是裸奔狀態。你上班期間訪問小電影網站,都留下了痕跡,若接入了公司網路,就自然而然被抓個正著。
除了域名是裸奔外,其實還有更嚴重的風險,那就是中間人攻擊。
中間人攻擊
前面也提到 HTTPS 中的關鍵其實在於這個證書。從名字可以看出來,中間人攻擊就是在客戶端、伺服器之間多了個『中介』,『中介』在客戶端、伺服器雙方中偽裝對方,如下圖所示,這個『MitmProxy』充當了中間人,互相欺騙:
中間人攻擊,來源 evil0x
可以安裝 MitmProxy 或者 Fiddler 之類的抓包軟體嘗試一把,然後開啟代理。
此時用手機訪問百度,得到的資訊如下:
證書信任前
提示,連線不是私密連線,其實就是瀏覽器識別了證書不太對勁,沒有信任。而如果此時手機安裝了 Fiddler 的證書,就會正常訪問。
證書信任後可正常訪問
因此,當你信任證書後,在中間人面前,又是一覽無餘了。
而如果你用了公司電腦,估計你有相應的操作讓信任證書吧,或者手機上是否有安裝類似的客戶端軟體吧?
抓緊時間看看手機的證書安裝明細。
我前任公司在資訊保安這塊做得就非常謹慎,手機會有工作手機,未授權的任何 App 都不能安裝,誰知道 App 會悄悄幹些什麼事情呢。(最新熱點,QQ掃描瀏覽器歷史記錄,你可知道)
當然各種 App 肯定也不是吃素的,不會讓『中間人攻擊』這麼容易就得逞的,我們們接著看。
如何防止資訊保安,反爬
前面提到,要實施中間人攻擊,關鍵在於證書是否得到信任。瀏覽器的行為是證書可以讓使用者授權是否信任,而 APP 就可以開發者自己控制。
比如我嘗試通過類似的方式對某匿名社群進行抓包解密 HTTPS,但最終失敗了,為什麼呢?
這就要談到『SSL Pinning』技術。
App 可以自己檢驗 SSL 握手時服務端返回的證書是否合法,“SSL pinning” 技術說的就是在 App 中只信任固定的證書或者公鑰。
因為在握手階段服務端的證書必須返回給客戶端,如果客戶端在打包的時候,就把服務端證書放到本地,在握手校驗證書的環節進行比較,服務端返回的證書和本地內建的證書一模一樣,才發起網路請求。否則,直接斷開連線,不可用。
當然,一般情況下,用這種技術也就能防止 HTTPS 資訊被解密了。
不過,也還有其他的技術能夠破解這種方法,比如 Android 下的一些 Hook 技術,具體而言就是繞過本地證書強校驗的邏輯。感興趣的同學可以抱著學習目的研究一下。不過據說這種方式需要對系統進行 Root、越獄等,需要一些更高許可權的設定。
因此,也告誡我們,一定不要亂安裝一些軟體,稍不注意可能就中招,讓自己在網際網路上進行裸奔。一方面個人隱私資訊等洩露,另外一個方面可能一些非常重要的如賬戶密碼等也可能被竊取。
可能的監控手段有哪些?
辦公電腦當然要接入公司網路,通過上面介紹的內容,你也應該知道,你在什麼時候瀏覽了哪些網站,公司其實都是一清二楚的。
若自己的手機如果接入了公司網路也是一模一樣(連 Agent 軟體都不需要裝)。這就提醒我們,私人上網儘量用自己的行動網路呀。
瀏覽記錄,來源知乎
上面提到,如一些涉及隱私的敏感資訊,如一些 PC 軟體、手機 App 自己內部加密傳輸的話,內容加密(包括但不限於 HTTPS)不被破解也問題不大。
不過,這當然依賴這些軟體設計者的水平了。比如同一個匿名使用者對外展示的 ID 不能相同,如果是同一個的話也恰好暴露了邏輯漏洞。
當然,我們還是不要抱有僥倖心理,在監管的要求下,如果確實有一些違法等不恰當的言論等,始終還是有門路找到你的。
耗子尾汁
更何況,一般辦公電腦都會預安裝一些公司安全軟體,至於這些軟體究竟都幹了些什麼,有沒有進行傳說中悄悄截圖什麼的,這就因人(公司)而異了。(不討論類似行為是否涉及到侵犯了員工隱私等問題)
圖源知乎
不過,個人認為,我們也沒必要過度擔心。一般公司也不會因為你上班偶爾摸個魚,逛逛淘寶、看看微博來找你麻煩的。畢竟沒必要這麼點芝麻事情來『大動干戈』。
但最好是不是對照員工手冊來看看,是否有明令禁止的行為?自己的行為是不是太過了,免得被抓住把柄,正所謂『常在河邊走哪有不溼鞋』,『欲加之罪、何患無辭』。
石頭才疏學淺,文章難免有所疏漏,如有相應問題,還望大家指教。最後,祝大家一輩子都不要因為這種事情掉坑裡。
後記
本文重點強調了 HTTPS 的知識點(中間人攻擊、SNI等),其實早在域名解析階段就已經暴露了。
對域名發起請求前,要知道域名的IP地址,就要訪問DNS伺服器,公司只需網路中指定DNS伺服器,截獲不加密的 DNS 報文分分鐘就瞭解“摸魚”的情況。
DNS
這裡引用下公眾號文章發出後,某個讀者的評論,覺得有收穫,特此補充如下:
想要“偷偷”的摸魚不被監控,除了上文中提到的 HTTPS,不要忘了安全的DNS,DoH(DNS over HTTPs, DoH)或DoT(DNS over TLS, DoT)。
目前比較好的方式還是,自己搭建DoH的DNS server,連上網路後設定DNS伺服器為你的server IP,原生Android甚至在設定裡提供了“私人DNS”選項。
當然如果還能跑一個代理服務,前面提到的SNI洩露訪問域名的問題也一起解決了。抓包只能發現你一直在訪問你自己的server。為了再真一點,甚至可以在你的server上再搭一個web server,放上一些內容,這樣就算有人追蹤到這個IP,開啟看也是一個正常的站點。
參考資料:
- HTTPS工作原理: https://cattail.me/tech/2015/11/30/how-https-works.html
- 如何評價網際網路公司監控員工日常上網的行為?: https://www.zhihu.com/question/46818840/answer/103329958
- 網傳拼多多員工因在網上釋出同事被抬上救護車的照片,被管理層逼迫主動辭職、趕出公司?事件真實性如何?: https://www.zhihu.com/question/438581129/answer/1670519587
- HTTPS工作原理: https://cattail.me/tech/2015/11/30/how-https-works.html
- 淺析HTTPS中間人攻擊與證書校驗: http://www.evil0x.com/posts/26569.html
- Mac/Windows Wireshark/tcpdump抓包TCP3次握手,4次揮手例項: https://www.tanglei.name/blog/example-show-3-times-handshaking-of-tcp-in-mac-or-windows.html