CVE-2020-24581+CVE-2020-24579
2022-05-07 16:02:38

CVE-2020-24581 + CVE-2020-24579

漏洞介绍:

在 AU_2.31_V1.1.47ae55 之前固件的 D-Link DSL-2888A 设备上发现了一个问题。它包含一个 execute_cmd.cgi 功能(无法通过 Web 用户界面访问),该功能允许经过身份验证的用户执行操作系统命令。

固件获取:

https://www.dlink.com.sg/dsl-2888a/#firmware

固件提取:

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

提取获得jffs2格式的文件系统

漏洞分析:

由于此漏洞需要由web服务触发==》

需要先了解固件中组件的位置==》路由器开机自启脚本:/etc/rc.d/rcS

启动了dhttpd==》/usr/sbin/dhttpd

对dhttpd进行分析:

漏洞点发生于execute_cmd.cgi ==》需要知道怎么执行至execute_cmd.cgi

execute_cmd.cgi :

在cgi-bin组件中

静态分析:

通过对cgi-bin字符串搜索:

查看交叉引用:

此处所在函数:sub_9C4C

==》该处加载了goform,cgi-bin等多种组件

查看调用sub_9C4C函数的函数:sub_9F24

sub_BEA0函数

首先是使用cgi-bin:

函数会将要访问的文件和cgi-bin拼接成一个可以访问的路径==》

53行判断该cgi是否存在==》63行判断该cgi是否有可执行权限==》

在确定获取路径中要执行的文件后,将当前目录更改为文件存在的目录

又一次使用cgi-bin:

首先为v22申请一个空间,其中存放文件执行的环境变量

sub_B934:申请空间

a1 = 256
if a1:
    a1 = (a1-1) >> 4
print(a1)

v2 = 0
while a1:
    v2 = v2 + 1
    a1 >>= 1
print(v2)

v3 = 1 << (v2 + 4)
print(v3)

15
4
256

接下来运行至sub_BB5C:

该函数调用了路径,环境变量等重要参数,并且进行execve来执行文件==》:

sub_BEA0函数总结

只要登陆了设备,就可以执行cgi-bin下的任意文件,且没有对文件做出任何限制

分析execute_cmd.cgi

#!/bin/sh
. /usr/syscfg/api_log.sh
cmd=`echo ${QUERY_STRING} | cut -d = -f 3` #取出cmd=后面的内容
cmd=`echo ${cmd} |tr "%20" " "` #将%02转化为空格

result=`${cmd}`   #运行命令
TGP_Log ${TGP_LOG_WARNING} "cmd=${cmd}, result=${result}"

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

===》获取QUERY_STRING的值,在没有对参数进行过滤的情况下进行运行

在dhttpd中搜索QUERY_STRING:

==》查看引用sub_144B4

通过一番搜索:

在js/ajax.js中发现该字符串:

在ajax.js中拼接好字符串,再发送至dhttpd中进行处理

复现:

漏洞介绍中需要用到绕过身份验证:

在路由器登陆界面随便输入密码,进行登录

此时会重定向至http://xxxx/page/login/login.html?error=fail

根据ajax.js中的拼接进行命令执行

1、http:/xxx/

2、http:/xxx/cgi-bin/execute_cmd.cgi?timestamp=exp&cmd=uname -a