赞
踩
最近在总结Android APP漏洞挖掘方面的知识,上篇帖子Android漏洞挖掘三板斧——drozer+Inspeckage(Xposed)+MobSF向大家初步的介绍了Android APP漏洞挖掘过程中常见的工具,这里也是我平时使用过程中比较常用的三套件,今天我们来逐步学习和复现Android中 Activity漏洞挖掘部分知识,每个漏洞挖掘部分,我们都会选择具有代表性的样本案例给大家演示。
在学习Activity的漏洞挖掘之前,我们先对Activity的基本运行原理有一个初步的认识
首先,我们要启动Activity,完成各个Activity之间的交互,我们需要使用Android中一个重要的组件Intent
1 2 3 |
|
Intent一般分为显式Intent和隐私Intent:
显示Intent打开Activity:
1 2 3 |
|
隐式Intent打开Activity:
隐式Intent并不指明启动那个Activity而是指定一系列的action和category,然后由系统去分析找到合适的Activity并打开,action和category一般在AndroidManifest中指定
1 2 3 4 5 6 |
|
只有<action>
和<category>
中的内容能够匹配上Intent中指定的action和category时,这个活动才能响应Intent
1 2 |
|
我们这里只传入了ACTION_START
,这是因为android.intent.category.DEFAULT
是一种默认的category,在调用startActivity()
时会自动将这个category添加到Intent中,注意:Intent中只能添加一个action,但是可以添加多个category
对于含多个category情况,我们可以使用addCategory()
方法来添加一个category
1 |
|
隐私Intent打开程序外Activity:
例如我们调用系统的浏览器去打开百度网址
1 2 3 |
|
Intent.ACTION_VIEW
是系统内置的动作,然后将https://www.baidu.com
通过Uri.parse()
转换成Uri对象,传递给intent.setData(Uri uri)
函数
与此对应,我们在<intent-filter>中配置<data>标签,用于更加精确指定当前活动能够响应什么类型的数据:
1 2 3 4 5 |
|
只有当<data>
标签中指定的内容和Intent中携带的data完全一致时,当前Activity才能响应该Intent。下面我们通过设置data,让它也能响应打开网页的Intent
1 2 3 4 5 6 7 |
|
我们就能通过隐式Intent的方法打开外部Activity
1 2 3 |
|
向下一个活动传递数据:
Intent传递字符串:
1 2 3 |
|
Intent接收字符串:
1 2 |
|
返回数据给上一个活动:
Android 在返回一个活动可以通过Back键,也可以使用startActivityForResult()
方法来启动活动,该方法在活动销毁时能返回一个结果给上一个活动
1 2 |
|
我们在SecondActivity中返回数据
1 2 3 4 |
|
当活动销毁后,就会回调到上一个活动,所以我们需要在MainActivity中接收
1 2 3 4 5 6 7 8 9 10 11 12 |
|
如果我们要实现Back返回MainActivity,我们需要在SecondActivity中重写onBackPressed()方法
1 2 3 4 5 6 7 8 |
|
Activity类中定义了7个回调方法,覆盖了Activity声明周期的每一个环节:
1 2 3 4 5 6 7 |
|
生命周期调用图:
1 2 3 4 |
|
我们这里之所以要介绍Activity的启动模式,是因为Activity界面劫持就是根据Activity的运行特点所实现的
Activity一共有四种启动模式:standard模式、singleTop模式、singleTask模式、singleInstance模式。下面我们简单介绍一下:
standard模式
如果不显示指定启动模式,那么Activity的启动模式就是standard,在该模式下不管Activity栈中有无Activity,均会创建一个新的Activity并入栈,并处于栈顶的位置
singleTop模式
1 2 3 4 5 |
|
singleTask模式
1 2 3 4 5 6 7 8 9 10 11 12 |
|
singleInstance模式
1 2 |
|
我们在上文中详细介绍了Activity的运行原理,接下来我们了解一些Activity的漏洞种类和应用的安全场景
1 2 3 4 5 |
|
1 2 3 4 5 |
|
样本 sieve.apk drozer.apk
首先,我们需要配置drozer的基本环境,具体配置操作,参考:Android漏洞挖掘三板斧——drozer+Inspeckage(Xposed)+MobSF
手机端打开代理,开启31415端口
1 2 |
|
我们尝试使用drozer去越权绕过该界面,首先,我们先列出程序中所有的APP 包
1 |
|
我们通过查询字段,可以快速定位到sieve的包名
然后,我们去查询目标应用的攻击面
1 |
|
我们可以看出,有三个activity是被导出的,我们再具体查询暴露activity的信息
1 |
|
说明我们可以通过强制跳转其他两个界面,来实现越权绕过
1 |
|
说明我们成功的实现了越权绕过
1 2 3 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
在进行Android 界面劫持过程中,我发现根据Android版本的变化情况,目前不同Android版本实现的功能代码有一定的差异性,再经过多次的学习和总结后,我复现而且改进了针对Android 6.0界面劫持的功能代码,并对不同版本的页面劫持做了一个初步的总结,下面是具体实验的详细过程:
首先我们新建一个服务类HijackingService.class,然后在MainActivity里面启动这个服务类
1 2 3 4 5 6 7 8 9 10 11 |
|
我们可以看到程序一旦启动,就会启动HijackingService.class
然后我们编写一个HijackingApplication类,主要负责添加劫持类别,清除劫持类别,判断是否已经劫持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
说明:这个类的主要功能是,保存已经劫持过的包名,防止我们多次劫持增加暴露风险。
我们为了实现开机启动服务,新建一个广播类:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
然后我们编写劫持类 HijackingService.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
|
我们编写劫持类中,最关键的就是如何获取当前的前台进程和遍历正在运行的进程,这也是Android版本更新后,导致不同版本劫持差异的主要原因,对这里我做了一个初步的总结:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
我们编写获取当前目标进程的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
|
我们继续编写劫持替换的测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
最后在我们的配置文件中加入相应的权限和配置信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
我们需要将服务的时间设置成6秒,避免程序界面还未加载就劫持了
效果演示:
我们编写劫持类安装,打开:
我们可以发现劫持类在后台运行:
我们打开目标程序:
等待5秒,然后劫持成功,这个时间我们可以在代码段调整:
这样我们成功完成了对目标程序劫持,这里我只编写了一个简易的界面,大家可以编写更加复杂的界面,这主要是针对Android 6.0平台的劫持,各位也可以试试其他版本的平台
1 2 3 4 5 6 |
|
通过它提示程序进入后台来提示用户
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 |
|
因为现在这种漏洞在Android版本更新后,基本很少出现了,所以这里就不做复现和安全防护了
1 2 3 4 |
|
提到拒绝服务攻击,我们就不得不讲一下Android外部程序的调用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
我们查看一个目标应用的AndroidManifest.xml文件:
1 2 3 4 5 6 |
|
我们编写一个简易的APP程序,对目标程序进行拒绝服务攻击
1 2 3 4 5 |
|
这里我们传入一个空字符,使其产生错误
当然我们还可以使用我们的神器drozer来进行攻击
远程拒绝服务攻击:
1 |
|
还有其他类型的拒绝服务攻击,大家可以参考博客:
1 |
|
1 2 3 4 5 6 7 8 9 |
|
写到这里,这个帖子总算写完了,对Android的Activity漏洞挖掘的总结过程中,我又再一次将Android 的Activity组件运行的基本原理熟悉了一遍,学习就是不断的总结提高把,可能在编写的过程中,还存在很多不足地方,就请各位大佬指教了。
github首页:github
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。