Drozer之组件安全
0x00 关于Drozer工具得介绍
Drozer是MWR Labs开发的一款Android安全测试框架,也是一种交互式的安全测试工具。使用Drozer进行安全测试,用户在自己的工作站上输入命令,Drozer会将命令发送到Android设备上的代理程序执行。
Drozer之所以说是框架,是因为它是开源的,你可以编写自己的插件和模块,来扩展你它的功能来适用你的要求,可以说是一个基本上用于移动安全的Metasploit。
0x01 Drozer工具的一些命令介绍
我使用drozer框架的作用,主要是进行测试组件安全这个方面。同时我们也可以使用器来进行一些信息查询。
先转发端口: adb forward tcp:31415 tcp:31415
连接到drozer console: drozer console connect
有兔子的图案就待变连接成功。
drozer可以查看所用应用程序的信息,只要在手机上安装的程序都会显示出来,命令如下:
run app.package.list
知道这些应用程序的包名后,在来了解下每个程序的详细信息,在如下图中,分别的属性含义是:
Package:应用程序的包名;
Process Name:进程名称;
Version:程序的版本;
Apk Path:apk存放路径;
UID:与该app关联的用户id;
GID:与该app的用户id相关联得系统group id;
Uses Permissions:赋予该app得权限列表等等;
命令如下:run app.package.info com-XXXX
然后还可以看下应用程序的受攻击面,也是组件暴露信息,Androi组件分为四大组件(activity、broadcast、provider、services),这里面都有扫描到,命令如下:
run app.package.attacksurface com-xxxx
0x02 Activity组件的漏洞
一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。 Activity之间通过Intent进行通信。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
在这里我们先看下activity组件暴露的情况,命令如下:
run app.activity.info -a com-xxx
activity组件一般会引起两项漏洞,分别是越权漏洞和本地拒绝服务漏洞。
本地拒绝漏洞就是攻击者可以通过发送此类空数据、异常数据或畸形数据来使程序崩溃,给用户造成不必要的损失。 越权漏洞就是直接绕过登陆验证界面,然后就可以直接操作。
我们直接调用组activity组件,来看下情况,命令如下:
run app.activity,start --component package和activity
在这里我们可以看到,我们直接绕过了登陆界面,来到了改密码和采菜单界面,说明这里存在越权漏洞。
0x03 BroadcastReceive组件的漏洞
BroadcastReceive广播接收器:应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
老规矩查看组件导出信息:
run app.broadcast.info -a org.owasp.goatdroid.fourgoats
这里在命令行中在加入-i这个歌就可以看到组件的intent信息,命令如下:
run app.broadcast.info -i -a com-xxx
打开Mainfirst文件可以看出组件的导出情况,以及intent性信息,一般我们拿到应用程序的时候,可以直接在这里直观的看到组件的导出情况。
查看源码,查看有没有实现可能,发现启动这个组件需要两个参数。
现在就看是编写命令,–extra后面跟的就是组件的参数,命令如下:
dz> run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 1234 --extra string message pwnd!
看到软件直接调用发短信的组件功能。
0x04 service组件的漏洞
一个Service是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。 较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。 intent-filter未将exported设置为false,默认是导出的。
先查看service组件暴漏情况,命令如下:
run app.service.info -a com
在这里你可以加上-u 来查看未暴露的组件信息。
run app.service.info -u -a com
这个时候,我们就直接进行命令的调用,和activity组件一样,因为这个service组件启动是需要参数的,但是我们没有加上去,所以直接导致系统的崩溃,在日志输出的情况上,我们看到一个空指令的标签,这个就是导致原因。
run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.services.LocationService
0x05 content provider组件的漏洞
Android中的Content provider机制可支持在多个应用中存储和读取数据。这也是跨应用共享数据的方式之一,还有文件,sharePreference,SQLite数据库等方式存储共享数据库,但是ContentProvider更好的提供了数据共享接口的统一性。对于content provider组件来说,主要的漏洞是实现sql注入 ,或者查看敏感数据。
首先我们先看下组件暴露情况,这里面也有显示相应的信息,命令如下:
run app.provider.info -a com.mwr.example.sieve
Read/Write Permission:各个目录中的数据的读写权限;
Multiprocess Allowed:多进程权限;
Grant URI :Provider 内所有的数据都能被授权访问。 可它如果设为“false”,则只有本元素指定的数据子集才能被授权。
Path:显示内部的其他信息。
查看组件的URI信息,命令如下:
run app.provider.finduri com.mwr.example.sieve
直接扫描应用程序组件是否有可被注入的uri地址,命令如下:
run scanner.provider.injection -a com.mwr.example.sieve
在图中我们可以看到,有三个uri可被进行sql注入和读写。
在这里其实就是直接输入sql指令,进行查看而已,query就是显示详细信息的指令,命令如下:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys
这个时候我们的查看被拒绝了, PATTERN_LITERAL匹配模式保护了keys路径 ,就是底下的读写权限是有专门必要权限的,所以我们得到这会得到个权限拒绝。
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/
上面只是对keys进行个匹配保护,但是对于keys/没有进行保护,所以我们可以看到数据库里面的信息。
这里我们实现sql注入,就是sql的内部增加数据指令。
run app.provider.insert content://com.mwr.example.sieve.DBContentProvider/Keys/ --string Password xiaomage123123123 --int pin 123456789
然后我们在databse文件就能查看到我们注入的数据。
run app.provider.insert content://com.mwr.example.sieve.DBContentProvider/Passwords --int _id 1 --string service inject --string username xiaomagehaoshuai --string password xiaomagehaoshuai --string email [email protected]
0x06 总结
这里我们介绍的drozer的简单的组件检测内容,其实我们还可以进行中间人攻击等等功能,这些就可以直接在网上查阅资料,其实drozer属于半自动化的工具,如果以后需要进行自动化的检测的时候,就可以考虑到这个工具,然后在不断的扩充板块,这样成功的可能性就会增加。