[Security] 用 Taof 作 web service 的 fuzzing testing
今天的訓練課程中講到的是 Fuzzy testing,
基本上就是用一些隨機產生的資料,來測試軟體或服務會不會出現問題~
今天是用 Taof 這套 Windows 上的工具,來對 3CDaemon 這個 FTP server 測試~
1. 先開啟被測試的對象 3CDaemon
在課程裡面,我們已經知道 3CDaemon 在 FTP protocol 那邊是有 vulnerability 的,
先把它執行起來,確定 FTP server 有在 port 21 運作:
2. 使用 Taof 取得網路封包資料
在做 fuzzing 之前,Taof 需要先知道有哪些資料,這樣才有辦法修改資料做 fuzzing~
因此先開始 Taof 程式,按下 Data Retrieval 按鈕:
在跳出的視窗裡,再按下 Network Settings:
在網路設定這邊,Local settings 指的是 Taof 會開一個 port 給我們連,
Remote settings 則是要被測試的對象,基本上就是 port forwarding 的概念。
依下面的設定來說,就是我們去連 port 2121 時,就會被自動導向到本地端的 port 21,
而這個 port 21 就是 3CDaemon (被測者) 所開的 FTP port~
按下 OK 後,接著按 Start,就會開始 port forwarding,
同時 Taof 也會在中間偷聽網路封包,給待會的 fuzzing 做使用:
這時開啟瀏覽器,瀏覽到 ftp://127.0.0.1:2121,
就會透過 Taof 連到本地端 3CDaemon 開的 FTP port,
在這邊隨便輸入個帳號密碼,或是選擇 Logon on anonymously 都可以,
反正只是要讓 Taof 聽到這個連線的資料而已:
回到 Taof 那邊按下 Stop,就可以看到 Taof 已經記錄下好幾組網路封包,
像是第一個是 FTP 的 USER 請求,第二個是 FTP 的 PASS 請求~
3. 決定要 fuzzing 的資料範圍
這邊我們想對 USER 的部分作 fuzzing (意思就是想要亂填一些資料到 USER 欄位),
因此選擇 USER 的那個 Request,再按下 Set fuzzing points 按鈕~
接著跳出來的小視窗會有點看不懂…不過去點文字框裡的文字時會比較清楚…
舉例來說,在 anonymous 那邊點兩下將 anonymous 這個字選取了,
會看到下面的 From 和 To 自動變成了 5 和 14,
這其實就是 anonymous 這個字串在整個字串中的位置 (從 0 開始),
而設定成 5 到 14 代表的是要將字元 5~14 隨機替換掉,因此就會送出各種的名稱了,
當然你也可以修改 From/To 的值,讓它只隨機產生部分的字元~
剛剛的設定裡面,還可以點下 Set variable length field,
來決定要隨機填入的字串長度,不過其實一般不用設定,Taof 自己就會用各種不同長度的字串丟進去試~
設定好後,按下 Add 將這個規則存起來,最後按下 OK:
4. 開始送出 fuzzing 資料
回到 Taof 的主視窗後,按下 Fuzzing 按鈕就會顯示下面的視窗,
表示 Taof 將要開始將資料直接餵給 127.0.0.1 的 port 21~
按下 Start 就可以開始了:
開始沒幾秒,就看到 3CDaemon 掛掉了…
這代表 3CDaemon 在處理輸入資料時有問題,蠻可能是出現了 buffer overflow,導致程式當掉:
到 Taof 的目錄下,可以看到一些像是 xxx_sessions_yyy 的目錄,
裡面有個 debugging 的文字檔,打開就可以看到 Taof 曾經送出了哪些 fuzzing 資料,
例如它送出了 33 和 128 個字元的 A,成功地收到了 3CDaemon 送回來的回應:
*************************<REQUEST>*********************** - 33 characters USER AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA *************************<REQUEST/>*********************** +++++++++++++++++++++++++<RESPONSE>+++++++++++++++++++++++++ 220 3Com 3CDaemon FTP Server Version 2.0 +++++++++++++++++++++++++<RESPONSE/>+++++++++++++++++++++++++ *************************<REQUEST>*********************** - 128 characters USER AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA *************************<REQUEST/>*********************** +++++++++++++++++++++++++<RESPONSE>+++++++++++++++++++++++++ 331 User name ok, need password
在送出 511 字元時,3CDaemon 似乎就有一些問題,遇到了 Recv timed out 錯誤,
沒辦法從 3CDaemon 那邊取得回應:
*************************<REQUEST>*********************** - 511 characters USER AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA *************************<REQUEST/>*********************** ----------------------------<EXCEPTION>------------------------- Recv timed out ----------------------------<EXCEPTION/>-------------------------
送出 512 字元時,發現 3CDaemon 掛掉了,導致接下來的請求都不會成功,
表示 3CDaemon 在收到 512 字元的輸入時,很可能出現了 buffer overflow:
*************************<REQUEST>*********************** - 512 characters USER AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA *************************<REQUEST/>*********************** ----------------------------<EXCEPTION>------------------------- Recv timed out ----------------------------<EXCEPTION/>------------------------- *** Check this out carefully. This request killed the service. Request - 512 characters *************************<BUFFER>*********************** USER AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA *************************<BUFFER/>*********************** [*] I have to give up. I can not connect to the server
當發現 buffer overflow 時,就可以再更進一步去測試是否這個問題可以被轉化成一個 exploit,
不過當然以 RD 的立場來說,是可以利用這個工具,
來看看自己寫的程式的是不是能好好的處理各種輸入囉~