CVE-2020-24581 D-Link DSL-2888A 远程命令执行漏洞分析

 

D-Link DSL-2888A 授权问题漏洞

CVE-2020-24581 D-Link DSL-2888A 远程命令执行

D-link DSL-2888A是中国D-link公司的一款统一服务路由器,如下图所示:

 

漏洞信息

漏洞描述:

D-Link DSL-2888A AU_2.31_V1.1.47ae55之前版本存在安全漏洞,该漏洞源于包含一个execute cmd.cgi特性(不能通过web用户界面访问),该特性允许经过身份验证的用户执行操作系统命令。
在该版本固件中同时存在着一个不安全认证漏洞(CVE-2020-24580),在登录界面输入任意密码就可以成功访问路由器界面。
通过组合这两个漏洞可以实现未授权的任意代码执行

漏洞编号: CVE-2020-24581、CVE-2020-24579

fofa指纹: body=”DSL-2888A” && server==”uhttpd”

影响版本: AU_2.31_V1.1.47ae55之前版本

固件下载: 固件下载链接

POC:

http://DeviceIP/cgi-bin/execute_cmd.cgi?timestamp = 1589333279490&cmd = ls

 

漏洞分析

下载固件之后,使用Binwalk 将固件解开

binwalk -Me DSL-2888A_AU_2.12_V1.1.47Z1-Image-all.bin

解开是jffs2格式的文件系统,进入jffs2-root 目录,根据poc直接定位execute_cmd.cgi文件

由于漏洞需要web服务触发,因此需要了解固件中组件的位置,这里在/etc/rc.d/rcS中看到有dhttpd

最终dhttpd 定位再/usr/sbin/dhttpd

此漏洞的产生点位于execute_cmd.cgi文件,但是我们需要知道是怎么执行到execut_cmd.cgi.

使用IDA打开dhttpd文件。

根据cgi-bin字符串来最终定位到函数在sub_BEA0中

在函数的56行,可以看到会把访问要访问的文件和cgi-bin拼接成一个可以访问的url,并且在57行进行判断cgi文件是否存在。在67行可以看到会检查访问的文件是否有可执行权限。并且在获取路径中要执行的文件后,会将当前目录更改为文件存在的目录。

在110~114行,可以看到在给v24 传入值,在后面可以发现,v24是文件执行的环境变量,此处是在给execute_cmd.cgi 配置环境变量数组,这里可以看到执行文件可能需要设备登录权限。

紧接着在148行调用sub_BB5C函数,这个函数主要是来执行文件的函数,里面调用了execve()函数,因此参数file、v19、v24 这三个参数会传入到execve()函数中,最终执行execute_cmd.cgi文件。

因此登录设备之后,就可以执行任意的cgi-bin中的文件,对文件没有做任何限制。

接下来分析httpd是如何调用到cgi-bin的

首先在sub_9F24()函数中,初始化web 服务。其中的sub_9C4C()函数就是加载cgi的函数,如下图所示

如下图是sub_9C4C函数中的主要代码,可以明显看到60行加载了cgi-bin组件,并且调用sub_BEA0()函数。

分析execute_cmd.cgi 文件

如下图所示,这个文件会获取QUERY_STRING这个参数,”echo ${QUERY_STRING} | cut -d = -f 3” 这段代码可以获取第二个参数的值,并且在后面执行这个命令。这里们可以看到对参数的值没有限制,甚至对参数都没有做限制。这里下面复现漏洞的时候可以看到。

在dhttpd中可以检索字符串可以看到在sub_144B4中传入了这个字符串QUERY_STRING,

我们在ajax.js(/www/js/ajax.js)中也可以看到querystring 字符串,可以发现url是通过ajax.js 拼接好,发送到dhttpd中进行处理。

漏洞复现CVE-2020-24579+CVE-2020-24581

由于手头上没有设备,只能在fofa中找到一款设备用来复现漏洞。 命令执行的漏洞需在绕过身份验证之后才能进行触发。

下图是设备的登录界面,随便输入密码

在密码框中输入任意字符,点击Login。会重定向到http://xxx/page/login/login.html?error=fail

根据POC所示,再输入http:/xxx/cgi-bin/execute_cmd.cgi?timestamp=1589333279490&cmd=uname -a

可以看到成功的执行了命令。

在分析了设备的execute_cmd.cgi文件之后,发现不管什么参数都会识别,参数没有限制,于是下面这种也可以

http://XXX/cgi-bin/execute_cmd.cgi?taa%20=%20ssss%EF%BC%86aa%20=%20uname%20-a

 

参考:

https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/d-link-multiple-security-vulnerabilities-leading-to-rce/

(完)