【安全漏洞】Cisco命令注入漏洞CVE-2021-1414分析
概述
最近關注了Cisco的一個命令注入漏洞CVE-2021-1414,命令注入之后可導致遠程代碼執行:
漏洞存在于固件版本低于V1.0.03.21的RV340系列路由器中,當前最新版本V1.0.03.21已修復了此漏洞。RV340系列路由器可為小型企業提供防火墻和高速上網服務。剛好手頭有一個RV340路由器,固件版本為V1.0.03.18,為存在漏洞版本,故實地分析測試了一下。
漏洞分析
從官網分別下載了V1.0.03.18固件:https://software.cisco.com/download/home/286287791/type/282465789/release/1.0.03.18
固件為.img格式,與常見的.bin文件貌似有一些些區別?直接使用7z一路解壓,當得到fw.gz時繼續解壓,最終結果如下:
可得到一個較大的openwrt-comcerto2000-hgw-rootfs-ubi_nand.img文件,由此可知此型號的路由器固件是基于openwrt開發而來?OpenWRT是一個高度模塊化、高度自動化的嵌入式Linux系統,擁有強大的網絡組件和擴展性,多被用于工控設備、電話、小型機器人、智能家居、路由器以及VOIP設備中。文件系統為ubi,與常見bin格式的Squashfs文件系統相比,Squashfs有更好的壓縮性。
使用binwalk對文件openwrt-comcerto2000-hgw-rootfs-ubi_nand.img文件進行分析,最終可得到文件系統中的全部內容:
可知目標平臺為:ARM 32位小端。
搜索更多關于CVE-2021-1414信息,發現ZDI對漏洞給出了更多信息:
根據漏洞描述可知:由于JSON-RPC處理set_snmp請求中的USMUserPrivKey字段時存在命令注入,于是在解壓的固件文件中尋找與RPC處理相關的文件,定位到rootfs/www/cgi-bin/jsonrpc.cgi文件,使用IDA打開jsonrpc.cgi,定位到處理RPC請求的函數:sub_149FC,函數sub_149FC根據不同的RPC指令進入對應的分支流程:
關鍵點位于else if ( !strncmp(method, “set_”, 4u),這里剛好與set_snmp指令的前4個字節匹配:
該分支首先調用sub_12DB4校驗請求中的“sessionid”是否合法,如果合法則進入sub_13E2C函數,繼續跟進這個函數:
可知此處調用了導出函數jsonrpc_set_config處理set_snmp請求,于是在rootfs根目錄使用grep -r “jsonrpc_set_config” ./ 來定位導出此函數的so文件:
與jsonrpc.cgi依賴的庫文件比較確定 jsonrpc_set_config函數是由libjsess.so文件導出的:
使用IDA打開libjsess.so定位到導出函數jsonrpc_set_config,發現函數被動態調用,而我們又無法動態調試此文件,因此無法獲取到函數的真實地址。
由于已知問題出在 “USMUserPrivKey”字段,通過搜索字符串最終定位到漏洞函數 setpre_snmp,函數定義與上圖中的動態聲明相符,同時與漏洞描述的set_snmp也相符。
分析顯示:程序最終會調用popen執行被sprintf格式化后的v60字符串,v60的最后一段子字符串來自變量v19,v19來自v44,v44來自json_object_get_string中的參數v52,v52正是usmUserPrivKey字段中的值。此函數在調用popen執行命令前未對usmUserPrivKey中的值進行過濾導致了命令注入。
漏洞復現
Web登錄路由器,進入到SNMP設置界面,并全過程Burp抓包:
開啟nc監聽:
Brup重放上一步中抓取到的數據包,在usmUserPrivKey字段注入待執行的命令:
執行后,nc成功反彈shell:
補丁對比
下載修復漏洞之后的固件版本,將存在漏洞的文件和修復漏洞的文件進行對比分析,結果如下:
補丁之前的代碼,未校驗參數,直接調用popen執行命令:
補丁后的代碼,調用popen前使用match_regex正則表達式過濾特殊字符,命令注入漏洞被修復:
最后
我整理了網絡安全相關的學習資料,有需要的可以關注私我哦!!!
【學習資料】
總結
以上是生活随笔為你收集整理的【安全漏洞】Cisco命令注入漏洞CVE-2021-1414分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【建议收藏】这个工具专门用于寻找路由器中
- 下一篇: 你们应该听说过”w8ay“这个ID吧!一