复现|摄像头固件重打包

首先拿到摄像头后因为没有固件,于是这里直接使用编程器读取Flash芯片的内容[略],接下来就是对固件进行分析、仿真、校验分析及绕过
1 文件系统提取
首先使用Binwalk提取固件,使用如下命令提取,-M参数的意思是以递归扫描提取文件,-e则为自动提取已知文件

从上图中可以看出文件系统类型为squashfs,压缩格式为xz

可以看到0.squashfs的大小为2886212字节
2 固件分析
首先分析一下/etc/init.d/rcS(一般rcS为启动程序)

可以看到他启动了一个goahead服务,并且挂载mtd后,启动了/mnt/mtd/startap
首先分析goahead,使用checksec命令或者file命令,可以看出是mips小端序

分析goahead程序,发现http目录的位置在/etc/webs中

在目录中发现一个可以上传固件升级的地方,他会把我们上传的固件交给cgi去处理:
注: CGI文件是通用网关接口(CGI) 脚本 由Web服务器执行以创建动态页面。 它通常是用Perl或C编程语言编写的。 CGI脚本通常存储在Web服务器上网站目录内的“ cgi-bin”文件夹中,并且只有在未预先编译的情况下才能对其进行编辑。 CGI脚本通常用于运行基本的Web脚本。

尝试访问一下该目录,发现为固件上传目录:

但如果随意上传文件,会提示如下错误:

3 环境搭建
因为提取出固件了,所以我们这使用QEMU仿真运行,首先我们使用qemu启动Debian系统,再使用chroot命令切换到摄像头固件根目录:
内核及镜像下载地址:
挂载dev和proc,并chroot进固件中

启动gohead

访问刚刚我们发现的目录


4 固件上传校验分析及绕过


打开IDA,分析gohead,搜索Bad Magic Number字符串

在校验的过程中,它会获取一个地方取4个字节(Dword)与\x27\x05\x19\x56做一个字符串比较,而0x27051956正是uboot文件头的Magicnumber,与uboot的结构体对比如下

最后还需要将文件名修改为appfw
5 制作后门
这里我们使用OsandaMalith的后门,并使用MIPS的GCC进行交叉编译「建议使用buildroot」

将其移动到固件的/bin目录中

最后在/etc/init.d/rcS里的export之后加上启动脚本,如下所示:

在QEMU中测试后门是否能够正常使用:
6 固件重打包
首先是使用mksquashfs将根目录打包为squashfs文件系统
在默认配置的情况下,squashfs并不支持xz,这里我们修改一下Makefile使其支持XZ格式

另外还需要下载一个支持包并安装,地址如下:
安装squashfs-tools

最后使用如下命令打包文件系统:

其中参数解析如下:

因为文件大小和之前的不相同,这里使用00进行填充

因为我们还缺少一个uImage头,所以还需要mkimage工具帮助我们生成uimage头
生成uImage
但是当尝试升级的时候依旧提示:

猜测可能是load address和entry point地址错误,通过串口调试,可以得到加载内核时的load address 和 entry address,然后使用mkimage重新生成固件


7 总结
感谢w22师傅的耐心指导,在复现该漏洞时,主要难点在于要分析出这是uImage头校验,以及在打包uImage时的load addr和entry point地址
可以看到我们在使用qemu仿真MIPS摄像头时,需要输入很长的命令,并每次都配置挂载点、IP等等,这里推荐一个docker版的qemu:

欢迎star:
Last updated