1. 简介
本篇我们继续分享一些关于华为智联旗下小豚AI摄像头的研究内容,在上一篇文章中,我们已经通过串口顺利登录设备的Linux操作系统,接下来我们还会介绍两种登录设备系统的方法,可以在串口无法使用时发挥作用。
下文中,我们需要编译可以在摄像头设备中正常运行的程序,所以开始之前,先要把SDK开发环境配置好,比如说交叉编译器等。好在我们买到的SDK还不错,该有的文档、必要的脚本一个都不差,按照指示步骤逐步操作即可。在开发文档中,可以找到配置SDK相关的章节,如下图:
图1-1 配置SDK开发环境
按照上图中的SDK安装方法,逐步配置完成安装SDK。在安装过程中可能需要下载一些文件,别担心,在正常的网络环境下,都是可以顺利下载到的,不需要额外的辅助工具。配置完毕之后,开始本篇的正题。
2. telnet分析
串口虽然可以登录摄像头设备,但毕竟还需要硬件电路连接,使用起来比较麻烦,而如果能通过telnet登录则会更加方便快捷。启动摄像头的telnetd也需要两步操作:其一是重新编译busybox,增加telnetd功能;其二是在linux启动脚本中挂载设备文件。
在binwalk提取的squashfs文件系统中,可以找到telnetd软链接,链接到了busybox程序。逆向分析busybox程序之后,就可以发现固件中的busybox程序并没有实现telnetd功能,如下图所示:
图2-1 busybox支持的命令列表
上图中, busybox支持的命令中没有telnetd。为解决此问题,需要重新编译SDK中的busybox程序,我们之前已经完成了开发环境的SDK部署工作。 SDK中包含了编译busybox所需要的代码以及相关的makefile文件,我们只需要调整.config文件,确定编译出的busybox程序包含telnetd、tftpd等需要的功能,然后执行make hibusybox即可,如下图所示:
图2-2 编译busybox时的.config文件
编译完成之后,用编译得到的busybox替换固件文件系统中的原有busybox程序,就可以保证摄像头有了telnetd功能。接下来还需要挂载devpts设备文件,否则telnetd在建立第一个telnet连接后就会崩溃。将挂载devpts设备文件的两条指令放在linux的启动脚本(big_run.sh和small_run.sh)中,并加上启动telnetd的指令,就完成了对文件系统的全部调整,如下图:
图2-3 调整Linux启动脚本
最后,将文件系统重打包并烧录到Flash中,再次上电后即可通过telnet登录摄像头设备。
3. 反向shell分析
虽然通过前文的两个方法已经能够顺利登录linux操作系统了,但是Flash已经被热风枪吹下来了,就再多准备一种后备措施,这样可以避免因为前两种方法都失效而翻来覆去地吹焊Flash。在本节中,我们准备了一个简单的反向(reverse) shell作为后备措施,反向shell代码有很多,我们随便选择一种就好,下面的代码段即为我们将要编译的reverse shell代码:
图3-1 反向shell小程序
代码比较简单,建立tcp连接之后,将输入和输出重定向到tcp连接。
用SDK中包含的交叉编译器编译该程序,然后用qemu进行本地测试,测试通过后将其放入固件的文件系统中,然后在linux启动脚本中,增加启动反向shell的指令,最后打包文件系统,烧录固件至Flash中。待摄像头正常启动之后,在主机使用nc监听设置的端口,即可通过反向shell登录设备linux系统中,如下图所示:
图3-2 通过reverse shell登录
4. hilink程序分析
在正常登录设备Linux系统之后,我们就开始分析和调试设备中运行的程序,在前文提到的3种登录方式之中,telnet是最简单易用的,所以我们在后文中统一使用telnet作为登录方式。
首先使用ps指令查看系统中正在运行的关键进程,如下图所示:
图4-1 摄像头设备中正在运行的程序
上图中,有三个关键进程:hilink是负责华为智联的关键模块、ipc是负责摄像头主要逻辑功能的模块而monitor看起来是负责监控设备运行状态的模块。我们在上一篇中提到摄像头和云端的TLS通信就是由hilink程序产生的,接下来我们就分析分析这个hilink程序。
照惯例,先开启该程序的运行日志。通过逆向分析该程序,可以找到用于判断是否打印日志的函数,如下图所示:
图4-1 打印日志前的判断
上图中,logLevel函数即为判断当前等级(R0=3)的日志是否需要打印,我们只需要修改logLevel函数的返回值永远为1,即可打印出所有日志。
通过运行日志可以大体上掌握程序的执行流程。在程序启动后,首先会在云端注册登录,由关键字符串“LoginToCloud”找到关键代码段,如下图:
图4-2 hilink登录到云端
根据上图中的内容,推测其通信内容除了TLS加密外,还有一次应用层加密。此时,仅仅做静态分析有些困难,我们编译一份gdbserver传到设备上调试一下。在SDK中,包含了gdb项目,只要正常编译出来就可以直接使用。我们编译的busybox包含了tftp功能,可以用来传输文件。关于gdbserver调试相关的内容,可以参考海康萤石的那篇分析文章,这里不再复述。调试截图如下:
图4-3 调试hilink程序
通过调试可以确定,有很大一部分请求并没有执行hilink_encrypt_coap_buf函数,这意味着并没有进行应用层加密。
接下来,我们试着给程序打个补丁,修正一下其TLS证书,然后做一个中间人攻击,看看是否能够拿到通信数据,用于打补丁的脚本如下:
图4-4 给hilink程序打补丁
这个脚本功能也很简单,只是把程序中的TLS证书更改为我们自己生成的TLS证书。
最后再写一个实施中间人攻击的脚本,将通信内容进行简单的整理,即可获得下图中的内容:
图4-5 获取hilink程序通信内容
上图中的这些通信内容,可以帮助我们继续深入分析,但这里就不做过多的陈述,感兴趣的读者可以自行尝试。
5. 小结
关于小豚AI摄像头的分析文章到此就结束了,在这两篇分析中,我们介绍了3种登录linux操作系统的常用方式,分别是串口、telnet和reverse shell,各位读者在分析其他设备时可以根据实际情况选择其中一种合适的方法。此外,经由这两篇对这个摄像头进行的各种尝试,设备已经处于一个可调试的状态,文章中我们只对摄像头中运行的hilink程序进行了初步分析,感兴趣的读者完全可以在此基础上继续探索,挖掘潜在的漏洞。最后,希望各位读者能够有所收获,后续我们还会继续分享更多的案例。
Yimi Hu & Light @ PwnMonkeyLabs