天王級視頻監控產品某華認證繞過漏洞CVE-2021-330*復現與分析
引言
某華是全球占有率排名第二的視頻監控品牌。2021年10月,多款攝像產品曝光了認證繞過漏洞,攻擊者可利用該漏洞繞過身份驗證,獲得設備管理權限,可對攝像頭進行配置修改、獲取配置信息、修改口令、重啟設備、添加用戶等,危害很高,影響IPC/VTH/VTO/NVR/DVR等主流產品。
漏洞復現
根據github上POC中的`requirements.txt`搭建環境:
sudo pip3 install -r requirements.txt
運行`Console.py`,登陸方式選擇`loopback`,協議選擇`dhip`,端口為攝像頭的web管理端口(通常為80):
./Console.py --logon loopback --rhost IP --proto dhip --rport port

運行后就可以對設備進行管理員操作了,獲得一個合法的`session`會話:

在會話中可以運行各類命令,例如,運行`device`命令可以看到設備的基本配置信息:

漏洞分析
該漏洞可通過某華`DHIP`協議觸發。除了攝像頭web端口支持`http/https`協議外,某華在其web端口上還實現了一套私有協議,命名為`DHIP`協議,實現遠程`RPC`調用的功能。通過抓包分析能夠基本弄清楚這套協議基本規范。
0x01 從協議看表象
`DHIP`實現了一套簡易的RPC調用協議,主要包括`DHIP header`和`DHIP body`兩部分:

其中,`DHIP Header`長度為32個字節,組成如下:

`DHIP body`采用json格式定義,包括`method`、`param`、`id`、`session`四個關鍵字段,以登陸數據包為例,對應的`DHIP`數據包格式為:

其中,`Method`有多種類型,相當于是遠程調用的函數,`param`相當于是給函數傳遞的參數:

如下的`DHIP packet`就是一個獲取設備郵件信息的`RPC`請求:
{ "method": "configManager.getMemberNames", "params": { "name": "Email", },}
該漏洞問題出現在登陸類型的`RPC`請求上。當`method`為`global.login`時代表登陸數據包,但是當傳遞特殊構造的包含`loopback`登陸參數`param`時,能夠繞過認證。`loopback`用于告訴設備采用本地登陸方式登陸,是留給本地其他進程進行設備管理時通信接口。攝像頭服務端`RPC`處理函數遇到這類請求將不予認證,但是并沒有檢查請求發起方的IP地址。因而攻擊者可以通過遠程仿冒本地登陸數據包,直接繞過身份認證。用wireshark抓包可以看到,當`param`中登陸類型為`loopback`時,并設置任意用戶名與口令信息,攝像頭直接返回了認證成功的數據包。

0x02 從固件逆向看本質
但是到底為什么出現這個原因?只能分析固件了,從官網只能下到的最新固件已經被加密了,較難解開。一個直接想法就是找老版本固件,經過不懈努力終于找到了一個能解開的固件,版本為`**_NVR4XXX-4K_Chn_P_V3.210.0005.0.R.20160614`,大家可以自行搜索。偷懶使用了7z解壓大法,直接解壓了固件。

用`grep`命令從解壓的目錄中搜索`loopback`關鍵字:
grep -rn "loopback" ./
定位到`Challenge`這個24.6MB的超大的文件應該是主功能模塊,把它放到IDA里面,分析時間比較久,等一會就出結果了。`Shift+F12`搜索`loopback`字符串,找到相關引用:


通過向上追蹤幾步可以找到一個線程函數用于不斷處理接收數據包,命名為`RPC framework`,該函數為`RPC`框架的總入口:

線程的回調函數此處命名為`ThreadPool`,在其內部有一個關鍵的數據包處理函數,命名為`proc_request_arrive`,用于處理接收數據包:

第29至31行會首先檢查數據包中的`session`字段合法性,繼續往下看,發現71行對`gloabal`類型的數據包進行字段比較,并單獨進行處理:

跟進去看一下,發現當數據包中存在`global.login`,會進入到處理`loopback`類型數據包的函數,這里命名為`Dealloopback`:

可以看到`Dealloopback`函數調用完畢后會直接繞過`checkauthority`函數,跳轉到后面的`RPC`調用:

從控制流圖上也能看出,`loopback`數據包函數調用后沒有進行授權檢查:

最后提取數據包中的`method`,調用`deal_request`函數進行`rpc`調用。可以看出,全過程缺少對網絡連接發起方IP地址的檢查:

思考
從這個漏洞的分析可以看出來,二進制邏輯類漏洞實際上也可以通過fuzz測試分析發現,特別是對于某華協議,其協議格式十分清晰,檢驗是否通過認證只需看返回數據包中result字段是否為true。可以通過梳理登陸數據包各個參數并進行組合構造,爆破找到認證繞過類漏洞。大家可以自行實驗。
由于傳播、利用此文檔提供的信息而造成任何直接或間接的后果及損害,均由使用本人負責,且聽安全團隊及文章作者不為此承擔任何責任。