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
的值转换为了一个整形,规避了特殊字符,因而避免了注入的可能。
之前分析过这个设备发现了一些问题,这次在分析的时候除了这个注入点外也看到了其它的一些不严谨的地方。这个设备还是有一些挖掘空间的。