公司悄悄部署了一個東西,盯著你···
圖片來自 Pexels
這個網絡中所有人的上網內容我都看的清清楚楚,是不是很可怕?
我被一家公司老板買來運行在一個配置極高的 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
作者:軒轅之風
編輯:陶家龍
出處:轉載自公眾號編程技術宇宙(ID:xuanyuancoding)