挖洞經驗丨看我如何挖到多個D-LINK高危漏洞
近期,360企業安全集團程式碼衛士團隊安全研究人員發現友訊(D-LINK)公司旗下產品系列DIR-619、DIR-605系列路由器的兩個高危安全漏洞(CVE-2018-20056和CVE-2018-20057),並第一時間向友訊(D-LINK)公司彙報,協助其修復漏洞。
DIR-605及DIR-619系列是友訊公司旗下的家用路由器產品。北京時間2019年1月4日,友訊(DLINK)公司釋出了安全更新公告( https://securityadvisories.dlink.com/announcement/publication.aspx?name=SAP10100 ),公開致謝360企業安全集團程式碼衛士團隊,並且釋出相應的補丁修復漏洞。
圖 致謝360程式碼衛士
本次友訊公司修復的漏洞中,CVE-2018-20056是一個緩衝區溢位漏洞,本文將針對該漏洞進行技術分析。
漏洞概述
CVE-2018-20056
該漏洞是一個無需授權的棧緩衝區溢位漏洞,影響D-LINK DIR-605L 300M wireless cloud routing和DIR-619L 300M wireless cloud routing型號。漏洞出現在 web 伺服器中的一個功能介面中,可被未經驗證的使用者通過 post
請求進行呼叫。請求的URL為:http://[target_ip]/goform/formLanguageChange,其中 POST
資料的 currtime
引數未進行長度校驗通過危險的記憶體拷貝函式寫入棧上,導致精心構造的 currtime
引數可以觸發緩衝區溢位漏洞,甚至直接獲得裝置的 rootshell。
技術分析
通過binwalk解包韌體後分析系統檔案目錄,發現系統中存在boa程式。Boa程式是一個輕量級的web伺服器程式。常見於嵌入式系統中。通過逆向分析發現此程式在boa開原始碼的基礎上新增了很多功能介面以實現路由器上的不同功能。
其中大部分功能介面都需要經過身份驗證後才可以使用,但仍舊存在少部分功能介面如登入登出等可以使用。通過逆向分析boa程式定位至 process_header_end
函式,可以找到未驗證使用者可使用的部分功能。其中部分關鍵程式碼如下,其判斷流程可簡單總結為,若 is_valid_user
函式判斷請求來自於未驗證使用者後, 會再次通過 strstr
函式判斷url請求是否為此使用者可使用的功能介面。 通過分析及實驗發現,除了login功能外,未驗證使用者還可以使用formlanguagechange功能介面來改變web前臺介面顯示的語言。
接下來通過定位分析分發函式 websaspinit
尋找進入此函式的方式,關鍵程式碼如下:
通過分析實驗發現,在 post
請求訪問http://[target_ip]/goform/formLanguageChange時會進入 formLanguageChange
函式流程,函式中通過 websgetvar
函式獲取 post
請求中 config.i18n_language
, currtime
, nextpage
引數的值。
在 websgetvar
函式中,通過 strlen
、 malloc
、 memcpy
函式將引數值儲存至申請出的一塊記憶體空間中,但並未對引數長度進行判斷和限制。這種引數獲取的方式在遇到危險的記憶體拷貝函式時極易產生問題,是後面產生漏洞的根源所在。
圖 websgetvar函式
繼續分析 formLanguageChange
函式,程式將獲取到的 currtime
引數值直接通過危險函式 sprintf
寫入棧上 0x110-0xf8
的位置導致了緩衝區溢位。
通過分析, 函式返回地址儲存在 0x110-0x4
位置,即當引數長度大於 0xf4
時會直接覆蓋函式返回地址,導致程式控制流被劫持。
圖 formLanguageChange函式
結合路由器環境本身防護機制的不足,在攻擊者控制程式流程後,可通過rop技術實現任意程式碼執行。
Rop流程為:1.賦值 a0
引數。
2.呼叫 sleep
函式。
3.賦值某暫存器為棧上地址。
4.通過暫存器跳轉的方式跳入棧中shellcode的位置完成利用。