一 漏洞信息
◆CVE編號:CVE-2022-26258
◆漏洞描述:D-Link DIR-820L 1.05B03 was discovered to contain remote command execution (RCE) vulnerability via HTTP POST to get set ccp.
◆設備型號:D-Link DIR-820L
◆固件版本:1.05B03
◆廠商官網:http://www.dlink.com.cn/
◆固件地址:http://www.dlinktw.com.tw/techsupport/download.ashx?file=2663
◆測試環境:Ubuntu 18.04

根據漏洞描述可得到幾個關鍵詞:遠程命令執行、/lan.jsp頁面、Device Name 參數、HTTP、POST、get set cpp。
二 固件分析
2.1 固件解包
使用binwalk對固件解包,獲取文件系統:
binwalk -Me DIR820LA1_FW105B03.bin

2.2 關鍵信息查找
根據漏洞描述,查看www/lan.asp文件,并在該文件中查找DeviceName和get set ccp相關內容:

通過lan.asp源碼可知在DEVICE_NAME處填入的參數會被拼接到paramStr中,然后函數copyDataToDataModelFormat將paramStr返回為提交參數傳給submitParam.arg,傳遞的URL為get_set.ccp。這里應該是一個POST請求提交數據。在文件系統中查找一下關鍵詞get set ccp:
grep -r "get_set"

在文件系統中查找關鍵詞并沒有發現名為“get_set.ccp”的文件,沒有“get_set.ccp”文件,這個URL應該是交給后端處理,處理好之后將結果返回給用戶。但在許多asp文件中都匹配到了get_set.ccp這個URL且有四個二進制文件中也匹配到了這個URL:
Binary file ./squashfs-root/bin/smbd matches Binary file ./squashfs-root/bin/flash matches Binary file sbin/ncc2 matches Binary file lib/libapmib.so matches
◆bin/smbd程序是Samba服務器的一部分,它允許路由器用戶與Windows客戶端共享文件和打印機。Samba服務器是一個開源軟件,它實現了SMB/CIFS協議,這是Windows操作系統使用的文件和打印機共享協議。bin/smbd程序是Samba服務器的核心組件之一,它提供了文件和打印機共享的功能。
◆bin/flash程序允許用戶升級路由器固件,以獲取最新的功能和安全補丁。它還可以用于還原路由器的出廠設置,以便在出現問題時恢復路由器的正常運行。
◆sbin/ncc2程序主要用于配置路由器的網絡設置和管理路由器的各種功能。通過ncc2程序,用戶可以輕松地設置無線網絡、防火墻、端口轉發等功能,使路由器的使用更加便捷和高效。
◆lib/libapmib.so是D-Link路由器系統中的一個庫文件,它包含了許多重要的API和函數,用于實現路由器的各種功能。用戶可以通過調用這些API和函數來訪問和配置路由器的網絡設置、無線網絡、防火墻、端口轉發等功能。
2.3 FirmAE 固件模擬

模擬成功后訪問http://192.168.0.1,默認無密碼,直接點擊Log In即可。

訪問http://192.168.0.1/lan.asp:

點擊Save Settings 并通過burpsuite抓包查看:

DeviceName和頁面內的其他數據被拼接到一起并POST給/get_set.ccp。根據上述信息逆向分析一下和網絡相關且含get_set字符串的ncc2程序。
2.4 IDA 逆向分析
查找一下關鍵字“Device Name”。通過對比、分析最終定位到如下代碼:

通過分析可知這段代碼的功能是:獲取Obj并判斷Obj是否為含注入的字符串(hasInjectionString),如果有注入則釋放Obj并退出,若沒有注入則將Obj傳給_system函數處理。hasInjectionString和_system函數都是導入函數。在文件系統中搜索一這兩個函數字符串,找到了一個庫文件:lib/libleopard.so。

用IDA逆向分析libleopard.so文件,并直接去導出函數中定位hasInjectionString和_system:

通過偽代碼可知過濾的字符僅5種,過濾不完全,因此我們可以使用其他字符比如換行(%0a)來注入執行命令。

_system函數的功能是拼接字符串并執行。
三 漏洞復現
3.1 根據CVE信息的復現

固件模擬并抓包修改lanHostCfg_DeviceName_1.1.1.0=后的數據為:
lanHostCfg_DeviceName_1.1.1.0=%0atelnetd -l /bin/sh -p 7080 -b 0.0.0.0%0a
含義為:啟動一個telnet服務器并在端口7080上監聽所有網絡接口。該命令可以讓遠程用戶通過telnet協議登錄到該服務器并在/bin/sh shell中執行命令。以下是每個選項的解釋:
◆telnetd: 啟動telnet服務器的程序
◆-l /bin/sh: 指定登錄后執行的shell程序為/bin/sh
◆-p 7080: telnet服務器監聽的端口號為7080
◆-b 0.0.0.0: telnet服務器監聽所有網絡接口(IP地址為0.0.0.0)
◆%0a為換行的ASCII碼。
使用nc連接7080端口獲得shell:

上述是根據CVE漏洞披露的信息所做出的復現。實際在復現過程中發現不僅僅是通過HTTP POST to get set ccp存在遠程命令執行。
3.2 發現新的RCE點
由于是因為字符串過濾不完全導致的命令注入,可以猜想所有HTTP POST且有可能執行的地方都可能存在這個漏洞。在路由后臺中發現有一個ping測試頁面:

通過抓包改包測試,發現同樣存在RCE漏洞,且該漏洞并非存在于CVE所描述的get set ccp而是ping ccp。

在進一步測試中發現直接在ping處輸入%0atelnetd -l /bin/sh -p 7080 -b 0.0.0.0%0a即可獲得shell:

四 復現總結
在復現這個漏洞中發現2022年剛披露的信息和2023年有所不同,2022年的描述更具體,2023的變得模糊一些。剛開始以為是為了保護廠商,避免提示太明顯容易被利用。后來在復現過程中發現應該是后續被驗證漏洞點不僅僅是/lan.jsp頁面、Device Name 參數,其他參數也存在同樣的漏洞,所以2023的描述范圍擴大為HTTP POST 的get set ccp。如果是這樣那么現在發現不僅是get set ccp中存在漏洞點,ping ccp中同樣存在。順便提一下,去廠商的網站查了一下漏洞補丁,在補丁中hasInjectionString的過濾內容修改為:

E安全
安全圈
GoUpSec
安全圈
D1Net
安全圈
系統安全運維
看雪學苑
安全圈
中國網絡空間安全協會
安全圈
E安全