移動安全自動化測試框架MobSF多個版本靜態分析介面存在的任意檔案寫入漏洞復現與分析
*本文原創作者:ForrestX386,本文屬於FreeBuf原創獎勵計劃,未經允許禁止轉載
0×00. 引言
MobSF 一款智慧化、一體化的開源移動應用(Android / iOS/Windows Phone)自動測試框架(詳見: ofollow,noindex" target="_blank">http://www.freebuf.com/terminal/141439.html ),通過框架自帶的Web介面上傳待分析的移動應用包,就可以自動有效、快速地對應用APK 和IPA檔案 及壓縮的原始碼進行審計分析, 並給出分析報告。在研究MobSF 框架使用的過程中,發現github的問題列表上有人曝出0.9.4.2 以下的版本web 上傳介面對上傳的apk包zip解壓的時候存在漏洞可導致任意檔案寫入,引發潛在的程式碼執行漏洞,本文以0.9.3.7 Beta版本為例進行復現與分析,詳文如下。
0×01. 復現
1.安裝MobSF 0.9.3.7
需要事先安裝好JDK1.7。
然後下載MobSF 0.9.3.7,解壓,在其目錄下執行pip install -r requirements.txt。
最後執行:python manage.py runserver 0.0.0.0:8080。
2.漏洞測試
開啟MobSF的web介面(基於Django開發):
選擇事先準備好的漏洞測試驗證壓縮包,上傳分析:
上圖表示任意檔案寫入成功,因為系統處於開發模式下執行,故會自動過載,然後執行__init__.py中的命令(任意檔案寫入成功,下圖,導致程式碼執行,上圖)
檢視/root/MobSF/StaticAnalyzer/__init__.py 確實被寫入了內容:print ‘Webcome to FreeBuf!
0×02. 分析
先來了解一下MobSF的系統程式碼結構:
上傳功能對應的介面/upload:
/upload介面對應的檢視函式:
跟進MobSF.views.upload ,如下:
上傳介面的主要功能就是校驗檔案,然後計算上傳檔案的MD5值,在響應包中指明即將跳轉至靜態掃描介面的完整路徑,也即如下圖所示介面:
開始分析/StaticAnalyzer/ 介面:
靜態分析介面位於StaticAnalyzer 模組的android.static_analyzer.static_analyzer檢視函式中,跟進:
最終回撥用Unzip函式對上傳的apk檔案進行解壓縮,問題就出在這個函式中,這函式位於MobSF安裝路徑/StaticAnalyzer/views目錄下的shared_func.py 模組中(這個路徑對於構造漏洞驗證壓縮包有用), 核心程式碼如下:
看到這裡就知道為啥能任意檔案寫入了,雖然Django 框架中的request.FILES物件會對上傳檔案的檔名進行過濾處理,使得形如../../../的目錄穿越失效(詳見: http://www.freebuf.com/articles/web/183125.html ),導致無法任意目錄寫入檔案,但是request.FILES 不會對壓縮包內的檔案進行過濾,業務程式碼邏輯中也未對壓縮包內的檔名進行過濾,從而導致漏洞的發生。
因為漏洞驗證環境中,MobSF系統處於開發模式下,因為程式碼檔案有變動,導致系統會自動過載,執行寫入到StaticAnalyzer模組__init__.py檔案的程式碼,也即執行:print ‘Webcome to FreeBuf!
如果寫入到__init__.py中的程式碼是一段反彈shell程式碼,那麼就存在任意程式碼執行導致獲取系統shell的可能。
0×03. 不足與突破之策
0×02節中最終分析的結果是:導致任意程式碼執行的前提是:系統處理開發模式,寫入程式碼後會導致系統過載觸發程式碼執行。
不過在正式環境中,系統一般不會處於開發模式,所以被寫入的程式碼不會被執行。
怎麼提高惡意程式碼被執行的概率呢?
換個思路,不一定非要寫入MobSF系統檔案中,也可以寫入到python 安裝包中,比如pip中。
則會將惡意程式碼寫入到pip工具的__init__.py 中,下次執行pip 安裝模組的時候就會觸發惡意程式碼執行。
如果MobSF系統執行的許可權是root,直接寫入/root/.ssh/authorized_keys 獲取root shell 也是完全可能的。
0×04. 如何修復
看下官方是怎麼修復的,看些bug fix 的commit:
直接用z.extract函式將zip壓縮包中的檔案解壓縮儲存至指定目錄,為啥extract 就是安全的呢?看下官方文件說明:
注意紅框中內容,其意思是說extract函式會自動將目錄穿越符和UNC符號過濾掉,所以就沒有任意檔案寫入啥事了。
0×05. 參考
https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.extract
https://ajinabraham.com/blog/exploiting-insecure-file-extraction-in-python-for-code-execution
*本文原創作者:ForrestX386,本文屬於FreeBuf原創獎勵計劃,未經允許禁止轉載