前言

拿到一個iot設備,筆者比較喜歡先去看一下它的歷史漏洞,也許可以從中得到一些啟發。發現Cisco之前修補過這個系列設備的命令注入漏洞。

https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-rv-command-inject-BY4c5zd

1day分析

因為漏洞通告中有相關固件版本,于是我就去diff了一下修補前和修補后兩個固件。

2

ssi.cgi這個文件當中,筆者發現修復之后的固件比修復前的固件多出了兩個函數,那么大概率就是通過這兩個函數對存在命令注入的地方加上了檢查以修復命令注入漏洞。直接看一下修復之后的固件里的NK_CHECK_LANGUAGE函數。很明顯,這個函數的作用是對參數進行了判斷和設置,和我們預想的一致。那么舊版本固件中存在的命令注入漏洞大概率出現在這個函數的上層函數中。

3

通過交叉引用,我們可以很輕松地找到其上層函數是NK_UiLanguageChange,我們看一下修補前的固件中的這個函數實現了什么功能。通過函數名,大體可以判斷出這個函數的作用應該是切換界面的語言。這個函數首先獲取了submitStatuschangelanguage的值,經過一些判斷后,把changelanguage的值作為參數傳進CreateFormatFile函數中。

4

我們繼續去看一下CreateFormatFile函數。很明顯,這個函數由于傳進來的參數param_1沒有進過任何檢查,存在一個命令注入漏洞。

5

這個漏洞的修復方式也很簡單,直接用NK_CHECK_LANGUAGE函數對參數進行了過濾。

捕獲0day

漏洞分析

知道這個漏洞的前因后果之后,筆者就在想這個被修復之后的固件當中是否依舊可能存在一些沒有過濾或者過濾不完整的地方。就去看了一些感覺可能存在漏洞的函數,后來就找到了NK_UiSetPassword這個函數,這個函數的作用是更改用戶的密碼。

6

雖然這個函數中對參數進行了一定的過濾,但是這里對于危險字符過濾的并不是很嚴謹,所以這里也存在一個命令注入漏洞。

7

其它地方應該也會存在不少類似的漏洞,但是筆者這里就沒有繼續去看了,感興趣的師傅也許可以去找看看。Poc就幫師傅刪了

Notices

目前該漏洞已經提交給了思科廠商,思科已確認了該漏洞。https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sb-rv01x_rv32x_rce-nzAGWWDD