monkeysocks開發日志--TCP協議分析及架構規劃
monkeysocks的目標是為開發以及測試提供一個穩定的環境。它使用socks代理,將錄制網絡流量并本地保存,并在測試時將其重放。
jsocks的改造
首先對公司一個項目進行了代理,測試結果:從開始啟動到完成,只有4.7M的網絡流量,本地空間開銷不是問題。
今天把jsocks修改了下,將build工具換成了maven,并獨立成了項目https://github.com/code4craft/jsocks。后來算是把record和replay功能做完了,開始研究各種協議replay的可能性。
replay時候,如何知道哪個請求對應響應包是個大問題。開始的方式是把request報文的md5作為key,response作為value。
TCP協議分析
后來使用wiredshark結合程序日志來進行分析。
TCP協議棧大概是這樣子:
下面是wiredshark抓包的截圖,從ea開始才是應用層協議的內容。
應用層協議分析
實現replay后,拿HTTP協議做了測試,自己用程序寫了個URLConnection,倒是能夠實現replay,但是換到瀏覽器里就很難 了,因為cookie總是會有些不一樣(現在基本上所有站點都會寫cookie吧)。如果不對應用層協議本身進行分析,那么進行包的偽造就很難了。
https協議對于重放攻擊做了處理,每次的請求包都不一樣,也無法replay成功,暫時略過。
后來對于測試中得重點協議--mysql的協議,進行了研究。
這是一個有狀態的協議,狀態轉移圖如下:
詳細介紹http://dev.mysql.com/doc/internals/en/client-server-protocol.html,有點hold不住的感覺啊!
看了Authentication部分,會由server端發送一個隨機數,來避免重放攻擊。這個東西啟發了我,因為主動權一般都是在server端,而我們要對client進行欺騙,難度就小了很多。
架構設計
后來決定把架構解耦了,fake server單獨作為一個模塊,可以單獨啟動成TCP server,也可以加入到jsocks里。最后架構是這樣子:
fake servers的實現必定是個大坑,不過能把常用協議都了解一遍,本身也很有意思不是么?
開發計劃:
-
實現fake servers的TCP框架。
-
研究并實現常用協議的fake server。
-
確定持久化以及報文對應的策略。