dajiang_Android固件分析&漏洞审计
背景
在开发复杂的Android 应用程序时,service 工具可以用于ADB shell 中通过命令行与Binder 进行交互。使用service list 可以看到设备内所有使用Binder 的服务。
1 |
|
升级包分析与提取
查看固件的格式,可以看到是POSIX tar 的格式。
这种格式的文件可以使用tar进行解压和提取
所以需要更改bin包的拓展名为 .tar 。
使用 “tar -xvf” 进行解压之后,可以看到 “ rm500_0205_v00.00.11.98_20221031.pro.fw.sig “ 这个文件特别大,那么文件系统就在这里面了,因为下载下来的固件的大小大约也是1.7G。
使用binwalk 查看文件的格式,由于固件太大, 所以binwalk 输出了很多信息,这里摘出部分固件描述的信息,可以看到大部分的内容是zip格式的压缩格式,并且从输出的信息来看,这就可能是android 固件中的内容,并且由于下载的这个固件是更新包,所以里面有很多app 的res 资源还有assets资源,也有boot.img 以及 recovery.img 等镜像文件。
1 |
|
所以可以直接使用unzip 进行解压,解压的前提是重命名为zip 拓展名便于unzip识别。
1 |
|
根据解压出来的信息,并且固件是升级包,因此大量的文件系统应该在system.new.dat 内,这个文件在Android 升级包中,用于描述系统分区更新的内容,通常和 system.transfer.list 和 system.patch.dat 一起使用,共同描述系统分区的更新内容和差异,从Android 5.0 开始,Google 采用了新的打包方式,不再提供system.img文件,而是通过system.new.dat 等文件实现更新。
system.new.dat 实际上是由system.transfer.list 描述的稀疏数组,需要使用特定的工具 sdat2img 转换成可挂载的 ext4 image 文件。对于想要自定义或修改ROM的用户来说,理解这些文件的作用和使用相应的工具进行操作是非常重要的。例如,使用sdat2img工具可以将system.new.dat文件转换为system.img,这样就可以对其进行修改或定制。
有关sdat2img 的信息: https://github.com/xpirt/sdat2img (将稀疏 Android 数据映像 (.dat) 转换为文件系统 ext4 映像 (.img))
1 |
|
然后就可以直接挂载到对应的目录下了
在 bin 目录下看到这个文件。
1 |
|
漏洞审计
tinycap & setMicStatus
sub_1B3D4() 函数中可以看到格式化字符串然后调用 system函数来执行,其中的 tinycap 可执行文件在 /bin/tinycap ,而这个可执行文件主要用于调试录音功能,比如使用命令 “tinycap /sdcard/test.pcm -D 0 -d 0 -c 4 -r 48000 -b 32 -p 768 -n 10” 是用于指定各种参数然后保存到/sdcard/test.pcm 中。但看从下面的代码中可以判断其中存在命令拼接执行的问题。
sub_1B3D4() 这个函数在 sub_4A9E4() 进行调用,根据log_print 大概知道这是一个 测试的功能。
函数表
so 文件都是32位了,之前用IDA64打开,可以识别出函数符号,但是没有办法生成伪代码。
可以看到这里会调用parcel 构造binder 的数据包,根据write函数的调用,可以知道会写入四个int32 类型的数值,然偶再写入一个string16 的值,调用的 service 服务是1030 。
为了方便触发 djilink 提供的service ,可以使用 “service call djilink 1030 i32 1 i32 1 i32 1 i32 1 s16 “;echo hhhh > /sdcard/hack ;” “ 来触发。
ti_audio & setTiAudioStatus
在进行审计的过程中,还发现了其中的ti_audio 也存在同样的问题,在如下的sub_1B52C() 函数中,有关ti_audio 的作用猜测是TI 音频操作命令。
同样的,在sub_4AA6C() 可以看到 setTiAudioStatus的方法
这个setTiAudioStatus方法会在 libdijilink.so 中定义传参的方法,可以看到传入了一个int32 的值,和两个string16 的值。而这两个string16 对应的是 ti_audio 需要的两个字符串。
可以使用 “ service call djilink 1031 i32 1 s16 “; reboot ;” s16 “; reboot ;” “ 来触发root命令。
start_active_request_auth
在 sub_1B90C()函数中 存在堆栈溢出的漏洞,其中可以看到v5的值是可以是由外来输入字符决定的,另一方面 v22 局部变量会被分配到 48字节的内存。
在这里虽然使用了 strlen_chk 函数来对溢出的问题来处理,但是 -1LL 表示的是对 a1 字符串的长度检查被禁用了,这是显式地告诉编译器不要对 a1 的长度进行限制检查。
DM368Cmd
再这个功能中,可以注意到这是一个工厂测试,同样也存在执行命令问题。
在sub_34A88()函数中,会创建一个线程调用sub_34A44 函数
参考: https://icanhack.nl/blog/dji-rm500-privilege-escalation/