我(wǒ)(wǒ)是一(yī)個網絡監控軟件,我(wǒ)(wǒ)被開(kāi)發出來的使命就是監控網絡中(zhōng)進進出出的所有通信流量。這個網絡中(zhōng)所有人的上網内容我(wǒ)(wǒ)都看的清清楚楚,是不是很可怕?
我(wǒ)(wǒ)被一(yī)家公司老闆買來運行在一(yī)個配置極高的Linux服務器上,這台服務器上的網卡可不得了,公司進出的網絡數據包都得流經它,它源源不斷的把數據包抓上來交給我(wǒ)(wǒ)來分(fēn)析。
你們應該也知(zhī)道,網絡通信是分(fēn)層的,最常見的就是那個TCP/IP協議體(tǐ)系了。
拿到數據包後,我(wǒ)(wǒ)就得按照這個協議規範,一(yī)層層的脫去(qù)協議的外(wài)殼,拿到它們的負載數據。
TCP會話(huà)重組
我(wǒ)(wǒ)重點要照顧的是TCP協議,因爲好多應用都要使用TCP來傳輸,像上網沖浪HTTP、發郵件SMTP、微信聊天等等。
我(wǒ)(wǒ)想要掌控網絡中(zhōng)的通信,第一(yī)個就要拿TCP開(kāi)刀,得想辦法把TCP傳輸的一(yī)個個數據包給重組起來,形成一(yī)個完整的會話(huà),這樣我(wǒ)(wǒ)才好知(zhī)道應用層傳了什麽東西,這個步驟叫做會話(huà)重組。
不過這個TCP協議有點複雜(zá),抛開(kāi)我(wǒ)(wǒ)們抓到的包本來就存在亂序的情況不說,它本身還有三次握手、四次揮手、超時重傳、延遲回複等很多機制,有時候還會遇到時間跨度很久的長連接,這無疑都給我(wǒ)(wǒ)想要重組TCP會話(huà)造成了很大(dà)的難度。
而我(wǒ)(wǒ)重組TCP會話(huà)的唯一(yī)線索就是數據包包頭中(zhōng)的序列号SEQ和确認号ACK。
不過我(wǒ)(wǒ)還是死磕RFC規範,把這些問題都攻克了,能夠成功重組出一(yī)個個的TCP會話(huà)數據,成功率還蠻高的。
應用協議識别
TCP會話(huà)重組出來了,我(wǒ)(wǒ)就可以拿到裏面傳輸的數據了。接下(xià)來要做的一(yī)件事就是識别應用層到底是什麽應用在傳輸的呢?
用我(wǒ)(wǒ)們的行話(huà)說,那就是做應用協議識别,這個時候我(wǒ)(wǒ)就得看一(yī)下(xià)端口了。
我(wǒ)(wǒ)根據三次握手數據包的方向,就可以确定出誰是客戶端,誰是服務端。
再看一(yī)下(xià)服務端的端口号(這個在TCP包頭裏面就可以看到),就能知(zhī)道這是一(yī)個什麽服務了。
像常見的有下(xià)面這些:
22: SSH遠程登陸
25: 郵件服務
53: 域名解析服務
80: HTTP Web服務
3306: MySQL數據庫服務
3389: 遠程桌面連接服務
……
最常見的就是80端口的Web服務了,人類每天上網都在用到。有時候Web服務不走80端口,換成了别的,不過這難不倒我(wǒ)(wǒ),我(wǒ)(wǒ)可以通過分(fēn)析TCP的負載數據特征,看看有沒有HTTP協議的特征出現,因爲HTTP協議的特征實在是太明顯啦!
到了後來,根據端口的經驗出錯的概率越來越大(dà)了,我(wǒ)(wǒ)就統一(yī)根據内容來進行識别判斷,不再相信端口。每個應用都有它們各自的協議特征,這個識别我(wǒ)(wǒ)可是下(xià)了點功夫,輕易不會透露。
文件還原
現在我(wǒ)(wǒ)知(zhī)道應用層是什麽協議了,我(wǒ)(wǒ)就可以把應用層協議傳輸的數據給整明白(bái)了。
還是拿最常見的Web服務來說吧,HTTP協議是一(yī)個基于請求—響應的協議,比如下(xià)面的這一(yī)次通信:
請求是一(yī)個GET包,看請求的資(zī)源貌似是一(yī)張JPG圖片。
再看響應包,狀态碼是200 OK,看來沒啥問題。再看看Content-Type,image/jpeg,是個JPG圖片沒跑了。
現在我(wǒ)(wǒ)就可以定位到響應包的負載段,就是在HTTP頭,兩個回車(chē)換行(0D0A)後面就是數據了。
找到數據位置,再根據Content-Length的大(dà)小(xiǎo),把數據摳出來寫成一(yī)個PNG格式的文件就大(dà)功告成了!
上面這個把協議中(zhōng)傳輸的文件提取出來的過程叫做文件還原,除了HTTP協議,我(wǒ)(wǒ)還支持文件傳輸協議FTP、郵件傳輸協議SMTP、文件共享的SMB協議呢。你們通過這些協議傳輸的文件,我(wǒ)(wǒ)都能給你還原出來,是不是很可怕?
HTTPS解密
有一(yī)天,我(wǒ)(wǒ)發現80端口的數據包越來越少了,與此同時,443端口的通信數據不知(zhī)不覺多了起來。後來才知(zhī)道原來爲了防止被我(wǒ)(wǒ)這樣的網絡中(zhōng)間人窺探隐私,他們都用上了一(yī)個叫HTTPS的技術。
HTTPS把數據進行了加密傳輸,這樣我(wǒ)(wǒ)拿到以後都是加密後的,沒辦法知(zhī)道傳輸了什麽内容。
不過這家公司的老闆很聰明,他要求公司的員(yuán)工(gōng)電(diàn)腦上都裝上了一(yī)個“安全軟件”,美其名曰保護電(diàn)腦不被入侵,實際上啊是在他們的電(diàn)腦上做了一(yī)個中(zhōng)間人劫持,進行了HTTPS的證書(shū)替換(你不信可以看看這個:誰動了你的HTTPS流量?)。
這個“安全軟件”作爲中(zhōng)間人把HTTPS證書(shū)和密鑰告訴我(wǒ)(wǒ),我(wǒ)(wǒ)就可以解密HTTPS流量了!你們上網幹了啥我(wǒ)(wǒ)還是能知(zhī)道的一(yī)清二楚!
網絡阻斷
你以爲我(wǒ)(wǒ)隻能在一(yī)旁監聽(tīng)嗎(ma)?圖樣!
要是你們訪問那些敏感的網站,或者嘗試把老闆交代給我(wǒ)(wǒ)重點看護的數據偷偷傳出去(qù),那我(wǒ)(wǒ)就不隻是看着那麽簡單了,這個時候我(wǒ)(wǒ)就要啓動阻斷功能。
爲了不影響公司網絡的運轉,我(wǒ)(wǒ)一(yī)般都是旁路部署的,這樣要是我(wǒ)(wǒ)哪天抽風遇到了bug,還可以立即把我(wǒ)(wǒ)撤下(xià)去(qù)。這個所謂旁路部署呢,就是抓取的包都是一(yī)份拷貝,而不是通過我(wǒ)(wǒ)轉發。
不過這樣一(yī)來也給我(wǒ)(wǒ)阻斷網絡通信帶來了一(yī)些麻煩,如果我(wǒ)(wǒ)是串聯到網絡中(zhōng),那可就簡單了,遇到那些可疑的網絡連接我(wǒ)(wǒ)直接丢掉數據包,不轉發出去(qù)就得了。
可現在我(wǒ)(wǒ)不是串聯,而是旁路部署,怎麽辦呢?
聰明如我(wǒ)(wǒ),怎麽可能被這小(xiǎo)小(xiǎo)的問題難住?我(wǒ)(wǒ)可是深谙TCP協議的行家,在發現可疑的連接建立的時候,就将它掐滅在萌芽狀态!
具體(tǐ)來說,TCP連接的建立是要經過三次握手的:
當我(wǒ)(wǒ)發現可疑的SYN數據包時,在服務端回複第二次握手包之前,以迅雷不及掩耳盜鈴之勢,用服務器IP的名義僞造一(yī)個RST的數據包給客戶端,這樣連接就被我(wǒ)(wǒ)掐斷了!
這一(yī)招雖然不能保證百分(fēn)之百成功,但我(wǒ)(wǒ)離(lí)客戶端更近,我(wǒ)(wǒ)的僞造包一(yī)般都能比真正的服務端響應包早一(yī)步到達客戶端,所以成功率還是蠻高的!
唉,說曹操,曹操就到!發現了一(yī)個可疑的連接來了,先不說了,我(wǒ)(wǒ)要去(qù)忙了~