作者 | 绿盟科技格物实验室 潘雨晨
CVE-2021-27249 存在于 D-Link DAP-2020 中。根据 ZDI 通告描述,该漏洞允许能够接入 D-Link DAP-2020 WiFi 网络的攻击者在受影响版本系统上执行任意命令,且利用无需经过身份验证。D-Link DAP-2020 v1.01 及以下的固件版本受影响。
下图是全网暴露设备的全球分布 Top5 :
数据来源:绿盟科技威胁情报中心
当前网上大概暴露有 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的FTP 服务器下载固件后,可以使用binwalk提取文件系统。
binwalk -e DAP-2020_RevA_Firmware_102rc002.bin
提取后得到的
/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)的方式,根据用户提供的输入,来检索一个文件是否存在于特定目录下。由于没有对用户输入进行适当的过滤就利用其执行系统命令,导致攻击者可以构造恶意命令进行注入,最终实现命令执行。
WEB_CmdFileList 函数中处理用户输入的过程
如上图所示,需要通过给”var:curdir” 变量赋值才可以让系统执行 WEB_CmdFileList 函数中的某些部分。那么就可以在 POST 请求中附加类似”var:curdir”: “/\”&& ls / #’ 的标签值。此外要触发WEB_CmdFileList函数被调用,还需要满足另一个条件,那就是”filels”标签。
在请求中同时拥有了上述 var:curdir和 files 标签值后,其实还无法看到命令执行后的结果,只能看到返回的“/”,因为这个功能的本意就是展示路径。
不过由于格式字符串将数据从 popen 重定向到 stdout,可以根据返回的结果来猜测命令是否成功。
例如,在请求中加入”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() 这样的危险函数。
转载请注明来源:关键基础设施安全应急响应中心