环境搭建

附件下载:http://download.vivotek.com/downloadfile/downloads/firmware/cc8160firmware.zip

固件解包

binwalk -Me .pkg文件
解包完后,发现文件系统存在路径为_CC8160-VVTK-0113b.flash.pkg.extracted/_31.extracted/_rootfs.img.extracted/squashfs-root

查找漏洞程序httpd:sudo find . -name httpd
查看文件类型:file httpd
32位的arm程序,小端,动态链接,没有符号表

运行服务

qemu-arm-static复制到当下目录;cp /usr/bin/qemu-arm-static .

由于是arm架构下的程序,我们不能直接运行,需要使用qemu模拟。
依次输入以下指令,设置好运行环境:

# 程序挂载
sudo mount -o bind /dev ./dev
sudo mount -t proc /proc ./proc

# 更换程序运行的根目录
chroot . ./qemu-arm-static ./usr/sbin/httpd

这里解释一下chroot . ./qemu-arm-static ./usr/sbin/httpd:这个命令的含义是在当前目录(.)下使用chroot命令将根目录切换为当前目录,然后在这个新的根目录中执行qemu-arm-static ./usr/sbin/httpd这个命令。

报错1:

当我运行服务会报错:

我们用IDA定位一下报错位置,用shift + F12,字符串搜索功能。

发现我们没有v1这个文件,在文件系统中查看一下:这是一个软链接,指向../mnt/flash/etc/conf.d,但是我们发现根本就没有../mnt/flash/etc/conf.d

经过一系列尝试发现,etc被存放在了其他包里:

将其中的etc文件夹复制到文件系统下的 /mnt/flash/中覆盖原本的etc文件夹。

报错2:

iot@attifyos ~/D/a/_/_/_/squashfs-root> sudo chroot . ./qemu-arm-static ./usr/sbin/httpd
sendto() error 2
gethostbyname:: Network is unreachable

同样的方法在IDA中定位错误:gethostbyname:

这部分主要涉及两个函数。gethostname():返回本地主机的标准主机名,如果函数成功,则返回 0。如果发生错误则返回 -1。gethostbyname():用域名或主机名获取IP地址。

Linux 操作系统的 hostname 是一个 kernel 变量,可以通过 hostname 命令来查看本机的 hostname。也可以直接 cat /proc/sys/kernel/hostname 查看。

我们只需要用echo将二者改为一致就行:可以看到再次运行chroot就没有报错了。

调试