CVE-2019-16057 Dlink DNS320 NAS网盘 无需认证 命令注入漏洞分析

漏洞概述

Dlink DNS320 是一款NAS网络存储 ,双盘位,市场价格大概在三四百多元。

CVE-2019-16057漏洞的触发无需认证,可以最高权限执行任意命令,根据漏洞纰漏信息,适用于 2.05.B10及以下的版本。

漏洞分析

下载固件

$ wget ftp://ftp2.dlink.com/SECURITY_ADVISEMENTS/DNS-320/DNS-320_REVA_FIRMWARE_PATCH_2.05.B10.ZIP
$ unzip DNS-320_REVA_FIRMWARE_PATCH_2.05.B10.ZIP

解压后文件DLINK_DNS320.2.05b10(2.13.0226.2016)便是我们需要的固件。

固件解压

$ binwalk -e ./DLINK_DNS320.2.05b10(2.13.0226.2016)

解开的固件如下:

静态分析

根据漏洞纰漏信息,漏洞点登录过程中,IDA打开/cgi/login_mgr.cgi,检索字符串login,查找引用:

可以找到具体的登录函数process_login,在登录函数process_login中,首先使用函数cgiFormString取出了post的几个字段的数据:

下面又进行了认证操作:

认证函数是将post的用户名密码与/etc/shadow中存储的账户比较,身为一个攻击者,不知道正确的用户名密码认证失败后,会执行以下流程(以下else便是认证失败的分支):

可以看到会执行一个函数vuln_func,参数是获取到的post的参数port,仔细查看一下这个函数:

可以看到很明显的一个命令注入,port的参数值会被拼接到变量s中然后被传入system函数执行,并且这个参数值并没有被严格的检查。如果使用一些绕过字符,便可造成任意命令执行。

一个成功的poc如下:

补丁对比

获得修复版本固件:

$ wget ftp://ftp2.dlink.com/SECURITY_ADVISEMENTS/DNS-320/REVA/DNS-320_REVA_FIRMWARE_v2.06B01.zip
$ unzip DNS-320_REVA_FIRMWARE_v2.06B01.zip

固件解压:

$ binwalk -e DLINK_DNS320.2.06b01\(2.13.0322.2019\)

使用IDA打开我们关心的login_mgr.cgi文件:

可以看到在修复版本中将port的值转换为了一个整形,规避了特殊字符,因而避免了注入的可能。

小结

之前分析过这个设备发现了一些问题,这次在分析的时候除了这个注入点外也看到了其它的一些不严谨的地方。这个设备还是有一些挖掘空间的。

参考链接

  1. Flaw Gives Hackers Remote Access to Files Stored on D-Link DNS-320 Devices
  2. D-Link DNS-320 ShareCenter <= 2.05.B10 - Unauthenticated Remote code execution
  3. DNS-320 :: H/W Rev. Ax :: F/W 2.05b10 and Lower (older) :: CVE-2019-16057 :: Remote Command Execution / RCE

点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖