网站首页 > 技术文章 正文
翻译:shan66
预估稿费:160RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
传送门
安卓Hacking Part 13:使用Drozer进行安全测试
前言
Drozer:Android应用程序安全评估框架
Drozer是一个基于Python的框架,可以用于实现Android应用程序测试的自动化。它由两部分组成:控制台和具有有限权限的Android代理。
Drozer基于客户端-服务器架构,其中客户端安装在本地,而服务器则是Android应用或代理。运行Android应用程序后,它会在端口31415上启动Drozer服务器,端口31415也是与客户端进行通信的端口。
为了启动Drozer,你只需要使用下列命令:
12 | adb forward tcp:31415 tcp:31415 drozer console connect |
在默认情况下,它只有android.permission.INTERNET权限,所以需要从控制台接收命令。当然,我们也可以给Drozer代理增加其他权限,但如果漏洞只需要默认权限的话,则这样的漏洞的危害性会更严重一些。
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所需的每个参数创建了相应的变量。
做好上述准备后,我们接下来需要启动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模块的完整代码:
123456789101112131415161718192021222324252627 | 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)) |
猜你喜欢
- 2024-09-12 Android的快速开发框架 afinal(android开发框架搭建)
- 2024-09-12 Flutter插件用于在移动平台中播放视频支持iOS和Android建议收藏
- 2024-09-12 赞!编程中Facebook图片加载库Fresco的使用方法!
- 2024-09-12 构建私有化APP系统消息推送(不依赖任何云服务)
- 2024-09-12 Flutter:实现视频播放的基本步骤(flutter视频列表)
- 2024-09-12 七爪源码:如何在 Android Webview 中使用 Javascript 注入
- 2024-09-12 Android之打包后无法网络请求(android打包命令)
- 2024-09-12 Webview的使用和面试常见问题(webview go)
- 2024-09-12 基于安卓操作系统的手机端软电话SDK开发包
- 2024-09-12 Bugly简易使用(bugly官网)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)