http://p0.qhimg.com/t012fd0e82264d5754d.jpg


传送门


安卓Hacking Part 13:使用Drozer进行安全测试


前言


Drozer:Android应用程序安全评估框架

Drozer是一个基于Python的框架,可以用于实现Android应用程序测试的自动化。它由两部分组成:控制台和具有有限权限的Android代理。

Drozer基于客户端-服务器架构,其中客户端安装在本地,而服务器则是Android应用或代理。运行Android应用程序后,它会在端口31415上启动Drozer服务器,端口31415也是与客户端进行通信的端口。

为了启动Drozer,你只需要使用下列命令: 

1
2
adb forward tcp:31415 tcp:31415
drozer console connect

在默认情况下,它只有android.permission.INTERNET权限,所以需要从控制台接收命令。当然,我们也可以给Drozer代理增加其他权限,但如果漏洞只需要默认权限的话,则这样的漏洞的危害性会更严重一些。

http://p6.qhimg.com/t01f5e67f933614ad3b.png

Drozer有一个非常大的优势,即模块化。这就允许用户对该框架的功能进行扩展:通过创建模块来实现漏洞研究和漏洞利用的自动化。


Drozer模块入门


Drozer模块实际上就是Python类,最简单的情况下,只需要提供必须的元数据(对于所需的元数据,参见Drozer模块编写文档)和execute()方法即可。另一个常见的方法是add_arguments()方法,可以通过argparse来轻松解析命令行参数。

Drozer脚本的真正威力来自于它采用了Java的Reflection API,这样的话,就可以允许Python代码在Android的Dalvik VM上创建Java对象并与之交互了。同时,模块作者可以直接使用Android API中提供的所有对象和方法。反射可能是一个比较难以掌握的概念,所以需要通过一些具体的例子来进行说明。

下面,我们以一个收集设备信息的Drozer模块为例,来说明如何使用反射。android.os.BUILD对象可以用来提供设备硬件和操作系统方面的信息。首先,我们需要使用build = self.new(“android.os.Build”)在Python中实例化一个新的构建对象。

然后,我们就可以通过Python使用原生对象的任何功能了!例如,我们可以使用build.BOARD来访问设备主板的信息。若要查看完整的示例的话,请参阅来自Android Security Cookbook的由Keith Makan编写的ex.device.info模块。

编写自己的模块以实现Android安全测试自动化

让我们通过一个简单的例子来说明如何创建Drozer模块。在本例中,我们将创建一个Drozer模块,让它根据用户提供的号码和消息去创建短信。(这个模块的效果等同于从Android shell中运行am start -a android.intent.action.MAIN --es“sms_body”“message”--es“address”“number”com.android.mms / .ui.ComposeMessageActivity 。)

这个模块中最棘手的部分是构建Intent。在Drozer中,其语法是 :

1
intent = android.Intent(action=*action*, *additional arguments*)

在上面的代码中,我们的动作是android.intent.action.MAIN。我们还需要为intent(“com.android.mms”,“com.android.mms.ui.ComposeMessageActivity”)和extras(由Intent携带的命令)['string','address' ,str(arguments.number)],['string','sms_body',str(arguments.message)]]定义组件。extras的值由用户定义的命令行参数引入。

最后,我们还需要设置一个标志,以便可以在activity上下文['ACTIVITY_NEW_TASK']之外启动一个activity。

把它们放在一起,我们最终得到intent = android.Intent(action = act,component = cmp,extras = extr,flags = flg)。为了便于理解,这里我为构建Intent所需的每个参数创建了相应的变量。

http://p6.qhimg.com/t01284d690d815e9f9b.png

做好上述准备后,我们接下来需要启动Activity并传递Intent以创建短信。在Drozer中,这相当于self.getContext().startActivity(intent.buildIn(self))。


安装和运行Drozer模块


在编写并保存模块(这里命名为ex.SMS.create)之后,需要先安装,然后才能使用该模块。Drozer推荐通过创建自己的repository来安装自定义模块,以防止将来升级出现问题。

若要创建repository并安装模块,您需要先进入Drozer控制台。您可以使用下列命令来创建repository:

1
module repository create /absolute-path-to-new-repo

然后,可以利用下列命令来安装模块:

1
module install /absolute/ex.SMS.create

当存在多个模块repository的时候,Drozer会要求您选择具体安装哪个repository。

最后,你可以利用下列命令来运行相应的模块:

1
run ex.SMS.create -n *telephone number* -m *message to send*

这个简单的模块可以进一步进行扩展,加入对用户输入和Intent的验证功能。或者,您也可以编写一个Drozer模块,来利用Android中的SMS重发漏洞(CVE-2014-8610)。

但不论是哪种情况,如果您计划使用Drozer并创建自己的模块,那么我都会强烈建议您安装mwrlabs.developer模块。此模块提供了一个交互式的shell,您可以使用它来测试Java对象的创建和交互。

现在,你已经为编写并共享Drozer模块做好了充分的准备,在它们的帮助下,你的Android应用程序测试工作将会变得更加轻松!

ex.SMS.create模块的完整代码:

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
from drozer import android
from drozer.modules import Module
  
class Create(Module):
  
    name = "Create an SMS"
    description = "A sample module to create an SMS"
    examples = """ run ex.SMS.create -n 1234567 -m "Hello, World!" """
    date "2015-12-20"
    author = "Norman"
    license = "GNU GPL"
    path = ["ex","SMS"]
  
    def add_arguments(self, parser):
        parser.add_argument("-n""--number", default=None, help="telephone number")
        parser.add_argument("-m""--message", default=None, help="message")
  
    def execute(self, arguments):
        act = "android.intent.action.MAIN"
        cmp = ("com.android.mms""com.android.mms.ui.ComposeMessageActivity")
        extr = [['string''address', str(arguments.number)],['string''sms_body', str(arguments.message)]] 
        flg = ['ACTIVITY_NEW_TASK'
  
        # Build Intent
        intent = android.Intent(action=act, component=cmp, extras=extr, flags=flg)
        # Start Activity
        self.getContext().startActivity(intent.buildIn(self))


演示视频





本文由 安全客 翻译,作者shan66

原文链接:http://blog.attify.com/2015/12/24/creating-your-own-drozer-module-for-android-application-testing/