DIR-820 CVE-2022-26258漏洞复现
字数 1163 2025-08-22 12:23:25

DIR-820 CVE-2022-26258漏洞分析与复现指南

漏洞概述

CVE-2022-26258是D-Link DIR-820路由器中的一个命令注入漏洞,存在于/lan.asp页面中,通过操纵"Device Name"参数可实现任意命令执行。该漏洞影响DIR820LA1_FW105B03及更早版本。

漏洞分析

漏洞位置

漏洞位于/lan.asp页面,具体与lan_device_name参数的处理有关:

  1. lan_device_name的值被传入并拼接成paramStr
  2. paramStr通过copyDataToDataModelFormat函数返回
  3. 最终提交给get_set.ccp处理

后端处理机制

通过分析发现:

  1. 系统中不存在"get_set.cpp"文件,说明该URL由后端处理
  2. 使用grep -r "get_set"命令发现四个二进制文件调用了相关功能
  3. 通过分析开机自启文件,确定ncc2二进制是主要处理程序

关键函数分析

ncc2二进制中:

  1. 程序首先进行fork子进程检测
  2. 设置信号量和信号处理函数
  3. 通过ncc_load_hw_cfg设置PIN码
  4. 然后配置其他服务

重点分析_system函数(而非标准system函数),发现存在两条执行路径:

  1. 第一条路径:通过a2参数,但分析发现不可控
  2. 第二条路径
    • 通过getObj(0x60u, (int)v9)获取对象
    • 需要绕过hasInjectionString函数的过滤
    • 过滤不完善,未过滤冒号和换行符

过滤绕过

hasInjectionString函数的过滤存在缺陷:

  • 未过滤\n(换行符)
  • 未过滤:(冒号)
  • 可使用%0a(URL编码的换行符)绕过过滤

漏洞复现步骤

环境准备

  1. 使用FIRMAE模拟环境:

    sudo ./run.sh -r DIR820L /path/to/DIR820LA1_FW105B03.bin
    
  2. 模拟成功后,访问路由器Web界面(默认无密码,直接登录)

利用过程

  1. 访问/lan.asp页面

  2. 修改"Device Name"参数为注入payload:

    %0atelnetd -l /bin/sh%0a
    

    注意:必须直接在原始请求包上修改,不能通过重放修改后发送,否则会导致多次发送使服务崩溃

  3. 发送修改后的请求

  4. 等待约10秒让命令执行

  5. 使用telnet连接路由器:

    telnet [路由器IP]
    
  6. 成功获取shell

额外漏洞发现

通过分析tools_vct.asp页面发现类似漏洞:

  1. 该页面通过POST指令传入参数
  2. 处理逻辑与主漏洞类似
  3. 同样在ncc2中处理
  4. 存在相同的命令注入风险

注意事项

  1. 该漏洞已被CNVD收录,提交前需确认是否已被报告
  2. 复现时需注意请求发送方式,避免服务崩溃
  3. 测试应在授权环境下进行,遵守法律法规

防护建议

  1. 升级到最新固件版本
  2. 在防火墙中限制对路由器管理界面的访问
  3. 设置强密码
  4. 禁用不必要的服务(如telnet)
DIR-820 CVE-2022-26258漏洞分析与复现指南 漏洞概述 CVE-2022-26258是D-Link DIR-820路由器中的一个命令注入漏洞,存在于 /lan.asp 页面中,通过操纵"Device Name"参数可实现任意命令执行。该漏洞影响DIR820LA1_ FW105B03及更早版本。 漏洞分析 漏洞位置 漏洞位于 /lan.asp 页面,具体与 lan_device_name 参数的处理有关: lan_device_name 的值被传入并拼接成 paramStr paramStr 通过 copyDataToDataModelFormat 函数返回 最终提交给 get_set.ccp 处理 后端处理机制 通过分析发现: 系统中不存在"get_ set.cpp"文件,说明该URL由后端处理 使用 grep -r "get_set" 命令发现四个二进制文件调用了相关功能 通过分析开机自启文件,确定 ncc2 二进制是主要处理程序 关键函数分析 在 ncc2 二进制中: 程序首先进行fork子进程检测 设置信号量和信号处理函数 通过 ncc_load_hw_cfg 设置PIN码 然后配置其他服务 重点分析 _system 函数(而非标准 system 函数),发现存在两条执行路径: 第一条路径 :通过 a2 参数,但分析发现不可控 第二条路径 : 通过 getObj(0x60u, (int)v9) 获取对象 需要绕过 hasInjectionString 函数的过滤 过滤不完善,未过滤冒号和换行符 过滤绕过 hasInjectionString 函数的过滤存在缺陷: 未过滤 \n (换行符) 未过滤 : (冒号) 可使用 %0a (URL编码的换行符)绕过过滤 漏洞复现步骤 环境准备 使用FIRMAE模拟环境: 模拟成功后,访问路由器Web界面(默认无密码,直接登录) 利用过程 访问 /lan.asp 页面 修改"Device Name"参数为注入payload: 注意 :必须直接在原始请求包上修改,不能通过重放修改后发送,否则会导致多次发送使服务崩溃 发送修改后的请求 等待约10秒让命令执行 使用telnet连接路由器: 成功获取shell 额外漏洞发现 通过分析 tools_vct.asp 页面发现类似漏洞: 该页面通过POST指令传入参数 处理逻辑与主漏洞类似 同样在 ncc2 中处理 存在相同的命令注入风险 注意事项 该漏洞已被CNVD收录,提交前需确认是否已被报告 复现时需注意请求发送方式,避免服务崩溃 测试应在授权环境下进行,遵守法律法规 防护建议 升级到最新固件版本 在防火墙中限制对路由器管理界面的访问 设置强密码 禁用不必要的服务(如telnet)