1. 程式人生 > >可怕!公司部署了一個東西,悄悄盯著你···

可怕!公司部署了一個東西,悄悄盯著你···

我是一個網路監控軟體,我被開發出來的使命就是監控網路中進進出出的所有通訊流量。這個網路中所有人的上網內容我都看的清清楚楚,是不是很可怕?

我被一家公司老闆買來執行在一個配置極高的Linux伺服器上,這臺伺服器上的網絡卡可不得了,公司進出的網路資料包都得流經它,它源源不斷的把資料包抓上來交給我來分析。

你們應該也知道,網路通訊是分層的,最常見的就是那個TCP/IP協議體系了。

拿到資料包後,我就得按照這個協議規範,一層層的脫去協議的外殼,拿到它們的負載資料。

TCP會話重組

我重點要照顧的是TCP協議,因為好多應用都要使用TCP來傳輸,像上網衝浪HTTP、發郵件SMTP、微信聊天等等。

我想要掌控網路中的通訊,第一個就要拿TCP開刀,得想辦法把TCP傳輸的一個個資料包給重組起來,形成一個完整的會話,這樣我才好知道應用層傳了什麼東西,這個步驟叫做會話重組。

不過這個TCP協議有點複雜,拋開我們抓到的包本來就存在亂序的情況不說,它本身還有三次握手、四次揮手、超時重傳、延遲迴復等很多機制,有時候還會遇到時間跨度很久的長連線,這無疑都給我想要重組TCP會話造成了很大的難度。

而我重組TCP會話的唯一線索就是資料包包頭中的序列號SEQ和確認號ACK。

不過我還是死磕RFC規範,把這些問題都攻克了,能夠成功重組出一個個的TCP會話資料,成功率還蠻高的。

應用協議識別

TCP會話重組出來了,我就可以拿到裡面傳輸的資料了。接下來要做的一件事就是識別應用層到底是什麼應用在傳輸的呢?

用我們的行話說,那就是做應用協議識別,這個時候我就得看一下埠了。

我根據三次握手資料包的方向,就可以確定出誰是客戶端,誰是服務端。

再看一下服務端的埠號(這個在TCP包頭裡面就可以看到),就能知道這是一個什麼服務了。

像常見的有下面這些:

  • 22: SSH遠端登陸

  • 25: 郵件服務

  • 53: 域名解析服務

  • 80: HTTP Web服務

  • 3306: MySQL資料庫服務

  • 3389: 遠端桌面連線服務

  • ······

最常見的就是80埠的Web服務了,人類每天上網都在用到。有時候Web服務不走80埠,換成了別的,不過這難不倒我,我可以通過分析TCP的負載資料特徵,看看有沒有HTTP協議的特徵出現,因為HTTP協議的特徵實在是太明顯啦!

到了後來,根據埠的經驗出錯的概率越來越大了,我就統一根據內容來進行識別判斷,不再相信埠。每個應用都有它們各自的協議特徵,這個識別我可是下了點功夫,輕易不會透露。

檔案還原

現在我知道應用層是什麼協議了,我就可以把應用層協議傳輸的資料給整明白了。

還是拿最常見的Web服務來說吧,HTTP協議是一個基於請求-響應的協議,比如下面的這一次通訊:

請求是一個GET包,看請求的資源貌似是一張JPG圖片。

再看響應包,狀態碼是200 OK,看來沒啥問題。再看看Content-Type,image/jpeg,是個JPG圖片沒跑了。

現在我就可以定位到響應包的負載段,就是在HTTP頭,兩個回車換行(0D0A)後面就是資料了。

找到資料位置,再根據Content-Length的大小,把資料摳出來寫成一個PNG格式的檔案就大功告成了!

OMG,這是哪個血氣方剛的小夥子又在看美女圖片了!

上面這個把協議中傳輸的檔案提取出來的過程叫做檔案還原,除了HTTP協議,我還支援檔案傳輸協議FTP、郵件傳輸協議SMTP、檔案共享的SMB協議呢。你們通過這些協議傳輸的檔案,我都能給你還原出來,是不是很可怕?

HTTPS解密

有一天,我發現80埠的資料包越來越少了,與此同時,443埠的通訊資料不知不覺多了起來。後來才知道原來為了防止被我這樣的網路中間人窺探隱私,他們都用上了一個叫HTTPS的技術。

HTTPS把資料進行了加密傳輸,這樣我拿到以後都是加密後的,沒辦法知道傳輸了什麼內容。

不過這家公司的老闆很聰明,他要求公司的員工電腦上都裝上了一個“安全軟體”,美其名曰保護電腦不被入侵,實際上啊是在他們的電腦上做了一箇中間人劫持,進行了HTTPS的證書替換(你不信可以看看這個:誰動了你的HTTPS流量?)。

這個“安全軟體”作為中間人把HTTPS證書和金鑰告訴我,我就可以解密HTTPS流量了!你們上網幹了啥我還是能知道的一清二楚!

網路阻斷

你以為我只能在一旁監聽嗎?圖樣!

要是你們訪問那些敏感的網站,或者嘗試把老闆交代給我重點看護的資料偷偷傳出去,那我就不只是看著那麼簡單了,這個時候我就要啟動阻斷功能。

為了不影響公司網路的運轉,我一般都是旁路部署的,這樣要是我哪天抽風遇到了bug,還可以立即把我撤下去。這個所謂旁路部署呢,就是抓取的包都是一份拷貝,而不是通過我轉發。

不過這樣一來也給我阻斷網路通訊帶來了一些麻煩,如果我是串聯到網路中,那可就簡單了,遇到那些可疑的網路連線我直接丟掉資料包,不轉發出去就得了。

可現在我不是串聯,而是旁路部署,怎麼辦呢?

聰明如我,怎麼可能被這小小的問題難住?我可是深諳TCP協議的行家,在發現可疑的連線建立的時候,就將它掐滅在萌芽狀態!

具體來說,TCP連線的建立是要經過三次握手的:

當我發現可疑的SYN資料包時,在服務端回覆第二次握手包之前,以迅雷不及掩耳盜鈴之勢,用伺服器IP的名義偽造一個RST的資料包給客戶端,這樣連線就被我掐斷了!

這一招雖然不能保證百分之百成功,但我離客戶端更近,我的偽造包一般都能比真正的服務端響應包早一步到達客戶端,所以成功率還是蠻高的!

唉,說曹操,曹操就到!發現了一個可疑的連線來了,先不說了,我要去忙了~

彩蛋

悄悄告訴你們,上次公司HR給我匯入了一批URL列表,讓我重點關注下都是誰在訪問:

  • www.lagou.com

  • www.zhipin.cpm

  • www.liepin.com

  • www.geekxh.com(重中之重)

往期TOP5文章

太慢不能忍!CPU又拿硬碟和網絡卡開刀了!

因為一個跨域請求,我差點丟了飯碗

完了!CPU一味求快出事兒了!

雜湊表哪家強?幾大程式語言吵起來了!

一個HTTP資料包的奇幻之旅