D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

  • A+
所属分类:安全文章

作者 | 绿盟科技格物实验室 潘雨晨

一、简述

CVE-2021-27249 存在于 D-Link DAP-2020 中。根据 ZDI 通告描述,该漏洞允许能够接入 D-Link DAP-2020 WiFi 网络的攻击者在受影响版本系统上执行任意命令,且利用无需经过身份验证。D-Link DAP-2020 v1.01 及以下的固件版本受影响。

二、漏洞影响分布

下图是全网暴露设备的全球分布 Top5 :

原创 | D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

数据来源:绿盟科技威胁情报中心

当前网上大概暴露有 1,882,813 潜在脆弱主机。其中分布在哥伦比亚的机器最多。查看当地互联网用户统计信息[1],可以注意到该地使用互联网的人口占总人口的 65%。根据哥伦比亚总人口 4965 万中的65%可以估算大约有 3200 万互联网用户。

三、固件提取与源码获取

由于厂商提供的官方 “固件更新” 镜像没有加密,所以可以直接下载使用而无需通过 UART 或 SPI 闪存转储固件。

固件下载地址:

ftp://ftp.dlink.de/dap/dap-2020/driver_software/DAP-2020_fw_reva_102rc002_ALL_en_20200322.zip

D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

从D-Link的FTP 服务器下载固件后,可以使用binwalk提取文件系统。

binwalk -e DAP-2020_RevA_Firmware_102rc002.bin

D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

提取后得到的

/DAP-2020_fw_reva_102rc002_ALL_en_20200322/_DAP-2020_RevA_Firmware_102rc002.bin.extracted/squashfs-root就是完整固件包。

重要文件存储在

/DAP-2020_fw_reva_102rc002_ALL_en_20200322/_DAP-2020_RevA_Firmware_102rc002.bin.extracted/squashfs-root/usr/www中。

该目录下包含 Web 服务器使用的一些 html 文件以及一个 cgi-bin目录,cgi-bin 中包含两个 mips 二进制文件 webproc  和 webupg 。

webproc:用于处理 Web界面的 Main Binary。

webupg:用于文件上传,固件升级,配置更改。

这些二进制没有被剥离符号表,通过 IDA 就可以很方便的查看到源码。

四、漏洞分析

CVE-2021-27249 存在于 squashfs-root/usr/www/cgi-bin/webproc 文件的WEB_CmdFileList函数中。

该函数会利用管道(popen)的方式,根据用户提供的输入,来检索一个文件是否存在于特定目录下。由于没有对用户输入进行适当的过滤就利用其执行系统命令,导致攻击者可以构造恶意命令进行注入,最终实现命令执行。

D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

WEB_CmdFileList 函数中处理用户输入的过程

如上图所示,需要通过给"var:curdir" 变量赋值才可以让系统执行 WEB_CmdFileList 函数中的某些部分。那么就可以在 POST 请求中附加类似"var:curdir": "/"&& ls / #' 的标签值。此外要触发WEB_CmdFileList函数被调用,还需要满足另一个条件,那就是”filels”标签。

D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

在请求中同时拥有了上述 var:curdir和 files 标签值后,其实还无法看到命令执行后的结果,只能看到返回的“/”,因为这个功能的本意就是展示路径。

不过由于格式字符串将数据从 popen 重定向到 stdout,可以根据返回的结果来猜测命令是否成功。

D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

例如,在请求中加入"var:curdir": "/" && mkdir test || ls-lax / #',若命令执行成功,则会返回一个“/”,否则会通过 ls -lax 返回8个“/”。因此可以进一步将执行的命令结果输出到一个指定的文件:"var:curdir": "/" && mkdir test >/tmp/test || ls -lax / #'。至此,命令执行后的内容就可以在/tmp/test中获得了,然后再配合利用任意文件读取的漏洞(CVE-2021-27250)就可以知道命令执行的结果了。

五、小结

在编码时,应特别注意确保所有提交给popen() 函数的参数,都屏蔽了shell元字符,对用户输入的命令参数尤其要进行shell元字符检测,避免直接使用类似popen() 这样的危险函数。

参考链接:
https://suid.ch/research/DAP-2020_Preauth_RCE_Chain.html
ZDI 通告:
https://www.zerodayinitiative.com/advisories/ZDI-21-204/  
官方通告:
https://supportannouncement.us.dlink.com/announcement/publication.aspx?name=SAP10201
[1]https://data.worldbank.org/indicator/IT.NET.USER.ZS?name_desc=false&locations=CO



转载请注明来源:关键基础设施安全应急响应中心

原创 | D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

本文始发于微信公众号(关键基础设施安全应急响应中心):原创 | D-Link DAP-2020 命令注入漏洞(CVE-2021-27249) 分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: