PCManFTP v2.0(CVE-2013-4730)漏洞分析報告

1. 軟件簡介

PCMan's FTP Server是洪任諭程序員所研發的一套FTP服務器軟件。該軟件具有體積小、功能簡單等特點。建立連接1所示:

 

1連接說明圖

2. 漏洞成因

PCMan's FTP Server 2.0.0版本中存在緩衝區溢出漏洞。遠程攻擊者可藉助USER命令中的長字符串利用該漏洞執行任意代碼。通過在recv函數上下斷點持續跟蹤,發現服務端在接收到登錄請求之後,會將收到的信息進行字符串拼接,而在字符串拼接的地方,並未進行長度控制.因此導致緩衝區溢出

3. 利用過程

3.1  環境搭建

 

(1) 首先要安裝WDK,WDK是WinDbg自帶(虛擬機中已有)

(2) 安裝Python2.7.2(虛擬機已有)

(3) 安裝Visual C++ 2008運行庫(手動安裝)

01_Tools這個文件夾中==》02_vcredist_x86雙擊安裝,運行庫2所示:

 

2運行庫說明圖

 

(4) 安裝WinDbg的Python插件”Pykd”(手動安裝)

安裝PKY :C:\Program Files\Windows Kits\8.1\Debuggers\x86\winext這個安裝路徑,pky3所示:

 

 

 

3pky說明圖

(5) 運行WinDBG開始調試後,輸入一下命令(手動安裝)

在把mon.py windbg;ib.py方放到windbg運行目錄下

打開windbg.exe 輸入:.loadpky.pyd    !py mona,安裝4所示

 

4安裝說明圖


加載完符號後,打開工具中02__vcredist_x86.exe是加載visual C ++2008

不斷的退出windbg在附加   虛擬機要是橋接模式,符號5所示

 

5符號說明圖

3.2  溢出測試

1)用Mon2生成一段3000字節長度的測試代碼(字符串)用於確定溢出點,30006所示



6 3000說明圖

找到文件夾pattern :在C:\Program Files\Windows Kits\8.1\Debuggers\x86這個路徑下搜索 pattern,然後把這個文件夾複製(到桌面上)出來,pattern7所示

 

7 patter說明圖

4. PoC

首先用windbg的mona2工具生成0x3000大小的有規律數據” A0A1A2A3A4A5A6A7A8A9一直到E0E1E2E3E4E5E6E7E8E9”,然後編寫FTP登陸程序給軟件傳送這段數據,得到溢出偏移值是2002。構建一個的字符串:"USER "(5字節)+垃圾指令(2005字節)+ 跳板指令(4字節)+ shellcode代碼(不含0x00,0x0A,0x0D,0x20特殊ASCII)+ "\r\n"(2字節)。demo源代碼:有一份能與FTP進行交互的代碼才能受控的觸發此漏洞。理論上講,只要我們編寫的代碼符合RFC959標準,就可以與任何一個FTP服務器進行交互 ,不過FTP客戶端的實現非常簡單,我們完全沒必要去閱讀RFC959文檔,我們只需作如下幾步:

(1) 建立Socket鏈接,連接目標FTP

(2) 接受FTP服務器的歡迎語

(3) 發送“USER XXXX”登錄請求

(4) 接受請求結果(不會走到這一步,此時FTP服務器已被攻擊完)  

4.1  構造測試

1)打開pattern複製裏面十六進制數字到vs中充當測試代碼測試shellcode8所示

 

8測試說明圖

 

2然後打開vs開始編寫發送測試數據包 數據包9所示

 

9數據包說明圖

3然後打開vs開始編寫發送測試數據包 虛擬機中每一次都要加載換環境.load pykd.pyd   !py mona     g了以後,再用vs發送這個數據包,  觸發異常後如圖所示,證明需要在一個不存在的位置執行代碼,命令10所示

 

10命令說明圖

 

4vs發送完以後虛擬機上結果

py mona po 0x6f43376f   知道eip被覆蓋,使用mon2測出溢出點,知道溢出點在偏移2002位置,偏移11所示

 

11偏移說明圖

4.2  jmp esp

(1)查找esp在所有模塊中命令,指令12所示

 

12指令說明圖

(2)查找espkernel32.dll模塊中命令,指令13所示

 

13指令說明圖

 

4.3 實現

(1)vs中指定命令,指定14所示

 

 

14指定說明圖

(2)建立套接字,socket15所示

 

15socket說明圖

(3)運行結果,彈出個MessageBox窗口,窗口16所示

 

16窗口說明圖

 

 

5. 結語

漏洞是由於將客戶端的命令使用sprintf連上時間日期等信息後儲存到局部變量,再寫到日誌文件中,而沒有進行命令長度的檢測,導致緩衝區溢出的發生緩衝區溢出一般是沒有進行邊界檢查,或使用了不安全的函數,避免這個情況能大大提高安全性。

6. 參考資料

[1] 0day安全:軟件漏洞分析技術(第2版)》 王清      

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章