51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1738|回复: 0
打印 上一主题 下一主题

针对Android提权代码zergRush的分析

[复制链接]
  • TA的每日心情
    开心
    2015-9-6 14:15
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]测试排长

    跳转到指定楼层
    1#
    发表于 2015-9-8 15:45:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      一、原理
      漏洞利用代码zergRush产生漏洞的主要原因是:具有root权限的vold进程使用了libsysutils.so库,该库的一个函数存在栈溢出,因此可以在root权限执行输入的shellcode
      存在漏洞的函数为FrameworkListener::dispatchCommand,位于源码的\system\core\libsysutils\src\FrameworkListener.cpp中,其中的局部变量argv为固定大小的指针数组,当输入参数的数量超过其大小时,会越界写入栈中。
      利用了这一漏洞,并进一步:
      1、在/data/local/tmp/下增加一个置了S位的shell;
      2、使Android中后续启动的adb进程以root权限运行。
      其中第二步的方法是:adb进程最初以root运行,之后调用setuid()降低权限。降权之前,会判断系统属性ro.kernel.qemu,如果该属性位1,则不降权。
      二、函数功能概要
      die 打印出错信息,退出程序
      copy 将一个文件拷贝为另一个文件
      remount_data 重新mount一个分区
      find_symbol 查找libc.so中导出函数的内存地址
      check_addr 确定一个地址中是否包含被禁止的字节
      do_fault 构造溢出数据和exploit,并通过socket发送给vold进程
      find_rop_gadgets libc.so中寻找两个特殊指令序列的地址
      checkcrash 调用do_fault,判断其溢出产生的调试信息中是否包含sp
      find_stack_addr 调用do_fault,从其溢出产生的调试信息中定位栈地址
      do_root shell文件的S位置上,并设置ro.kernel.qemu属性为1
      main 主函数,完成漏洞利用的所有步骤
      三、main函数
      395-396: 如果当前程序是以root权限运行,并且程序名为boomsh,则调用do_root,执行附加的两步操作
      402-405: 将自身拷贝至/data/local/tmp/boomsh,并设置其权限为0711,将/system/bin/sh拷贝至/data/local/tmp/sh
      407-408: 根据/system/bin/vold文件的大小获得其对应进程中堆的大概地址heap_addr
      410-421: 根据系统版本对heap_addr做微调。如果不是2.22.3系统,退出。
      423-428: 查询libc.sosystem调用的地址,保存至system_ptr
      430-443: 通过checkcrash函数,判断buffsz1624时能否成功利用。这里buffsz实际指libsysutils中造成栈溢出的指针数组argv的容量。
      445-484: 调用find_stack_addr函数,确定栈地址。反复尝试五次,每次对堆地址heap_addr做微调,直至成功。判断得到的栈地址是否有效。
      486-487: kill掉当前的logcat进程,删除/data/local/tmp/crashlog文件。
      489-491: 调用find_rop_gadgets函数,在libc.so中寻找指令序列add sp, #108; pop {r4-r7, pc},将地址保存在stack_pivot;寻找指令pop {r0, pc},将地址保存在pop_r0
      493-514: 尝试三次,每次调用do_fault,之后判断/data/local/tmp/shS位是否置上,一旦置上,则利用成功;否则,微调栈地址heap_addr(加减16)
      516-533: 一旦利用成功,并且系统的ro.kernel.qemu属性已经被置为1,则利用完成,重启的adb进程即可获得root权限。
      四、总结
      主要是利用了android中几个特殊之处:
      1. vold的溢出会在adb logcat中输出调试信息,这些信息说明了其内存结构,而其他程序可以读取到这些信息;
      2. ARM架构下,跳板指令有了更多的选择,ret2libc的攻击也可能更容易实现
      3. adb的降低权限过程又一次被利用。
      另外建议android APP开发完成后用爱内测平台做一个全面的漏洞检测,确保安全。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-21 10:59 , Processed in 0.064615 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表