零基础安卓逆向学习之旅(三)
零基础安卓逆向学习之旅(三)上期小狼跟大伙儿分享了如何初步检查APP安全,今天跟大家分享的是Drozer基本使用,本期主要是介绍一个android安全评估框架-drozer的基本使用。这是一个由运行在电脑上的”console”及安装于android设备上的drozer agent提供“server”这两个部分组成的工具,可以通过在console上执行命令或编写drozer的扩展模块来调用android package manager获取设备上app及其组件的相关信息,从而对初步锁定有表面弱点的app,准备好了吗?要开始啦~~~
0x01 正文
1、安装、配置drozer
(1)下载drozer (https://labs.mwrinfosecurity.com/tools/drozer/),选择drozer(Windows Installer)进行下载。
(2) 解压下载后的.zip,并运行其目录下的.exe文件,进行drozer安装
安装过程中应记住drozer的安装路径。
(3)安装完成后,cmd中将路径切换到drozer安装路径,执行drozer确认安装成功。
(4)确认drozer可以顺利获取到安装在系统上的java,执行drozer console,如出现如下界面,则无法正常获取。
修改环境变量中的PATH变量,使其包含java的安装路径。
如确认PATH变量添加正确,drozer仍无法正常获取java,则应在用户主文件夹下创建”.drozer_config”文件,并编辑如下内容:
"
Java="
如图,由于图形界面下无法创建.***格式文件,可以在cmd下运行
copy con .***进行读取键盘输入并创建文件(ctrl+z结束),再将该拷贝到用户主文件夹(C:\User\***)。
不再提示java错误。
2、安装agent.apk,进行drozer会话
(1)通过ADB向设备中安装drozer Agent
运行adb install agent.apk,将drozer解压包中的agent.apk安装进设备。
此时,可在手机上顺利运行drozer Agent。
(2)使用ADB建立端口转发
PC上执行adb forwardtcp:31415 tcp:31415,并在手机的drozer Agent点击Embedded Server,再点击按钮Disabled转为Enabled,出现如下界面。
(3)进行drozer会话
在PC上执行drozer console connect,是PC的drozerconsole与手机drozerAgent建立drozer会话。
4、枚举设备安装包
在drozer console下执行run app.package.list,查看包列表。
App.package.list这个模块是通过Android package manager来枚举设备上安装包的包名及其app名的简单信息,通过run app.package.list –h(-help)可查看其功能使用。
如图,可以通过添加适当参数,来更明确实现枚举过程:
通过过滤器,枚举出与输入字符相关的安装包;
Run app.package.list –f email
通过-g,-u查找相关user ID/group ID的安装包;
利用app.package.info查看安装包的具体信息;
通过run app.package.info –help查看其使用。
其中,可执行run app.package.info –a(--package),查看包信息:
上图中,显示安装包各相关信息:
Application Label:APP名;
Process Name:该APP的进程名;
Version:APP安装版本;
Data Directory:用户数据及APP相关数据的保存目录;
APK Path:该APP的.apk文件的所在路径;
UID:APP在设备上的用户ID;
GID:APP在设备上的系统用户组IDs;
Shared Libraries:APP所使用到的共享库的路径;
Shared User ID:APP共享用户的ID;
Uses Permissions:APP的权限列表。
5、枚举APP活动
这里使用的则是app.activity.info,其用法跟上边的相似。
run app.activity.info –a
输出包中的所有活动组件及其授权,具体功能用法可通过run app.activity.info –help查看。
6、枚举APP服务
通过run app.servise.info –a 查看。
7、枚举广播接收者
执行run app.broadcast.info –a ,显示出intentfilters信息,runapp.broadcast.info –i(--show-intent-filters)
8、枚举内容提供者
run app.provider.info –a
列出包中各内容提供者,并输出其相关信息:
Authorities:执行其SQLite前端的类的名称;
Read permission:可读取该内容的权限;
Write permission:可写入该内容的权限;
Grant URI permissions:是否有抓取URI的权限。
9、查看源代码
对于上边几种枚举app包及包组件信息的执行命令的用法基本相似,因为这些枚举命令的执行其实是调用了drozer的各个Python模块。这些模块通过android package manager获取app中acvitity/service/broadcast/provider组件的信息。可以通过在github上drozer项目查找这些模块的源代码,了解drozer模块的编写方式及各个模块的功能实现,从而结合自己的需求编写相应功能的模块,扩展drozer的功能。
(https://github.com/mwrlabs/drozer/tree/develop/src/drozer/modules/app)
10、drozer模块
Drozer模块是运用python语言编写的代码,再通过drozer agent与android平台进行交互。
(1)模块结构
每一个drozer模块都是一个python类,都是通过继承drozer.modules.Module类来生成各具功能的drozer模块,所以在每次编写模块时,都应导入drozer.modules.Modules这个模块。
(2)元数据
为了方便系统组织各个模块,和生成一致的帮助及有用信息,drozer要求每个模块都需配置几个预定的元数据:
name:一个标题名用于描述模块的目的;
description:用于描述该模块所能实现的功能;
example:执行模块的相关命令举例;
anthor:模块的作者;
date:模块的最新更新日期;
license:发布模块的许可证;
path:通过一个数组描述模块的命名空间,对应着文件所保存的目录。
(3)Executor
每个模块都必须定义一个单一方法execute(),在模块被执行时,这个方法都会被drozer所调用。execute()通过对android平台进行一定操作后,将结果显示在屏幕中。
(4)输出流
Drozer模块在显示数据的输出流上,是通过调用self.stdout/self.stderr的write()方法完成数据显示的,而不使用print关键字。
11、自定义模块
(1)创建一个模块ex.random.getinteger。
(2)模块安装
保存模块文件
可在drozer目录下,创建一个保存模块的目录,并上边文件以ex.random.getinteger在目录下保存,文件名前缀应对应path数组中的命名空间
创建模块库
首次安装模块,需要为模块创建一个模块库
Module repository create /repo
安装模块
Module install /ex.random.getinteger
如图,可通过ex.random.getinteger –h显示元数据信息,执行ex.random.getinteger返回随机整数。
编写一个枚举设备信息的模块
通过在模块中映射android java API中相应类,来获取、查看我们手机上设备及操作系统构造的相关信息,所编写的Python代码如下:
fromdrozer.modules import Module
classInfo(Module):
name="Get Device info"
description="A module that returnsinformation about the device and hardware features"
examples="run ex.device.info"
data="2016-06-16"
author="hawolf"
license="GNU GPL"
path=["ex","device"]
def execute(self,arguments):
build=self.new("android.os.Build")
self.stdout.write("Getting deviceinfo...\n")
self.stdout.write("[*]BOARD:%s\n"%(build.BOARD))
self.stdout.write("[*]BOOTLOADER:%s\n"%(build.BOOTLOADER))
self.stdout.write("[*]BRAND:%s\n"%(build.BRAND))
self.stdout.write("[*]CPU_ABI:%s\n"%(build.CPU_ABI))
self.stdout.write("[*]CPU_ABI2:%s\n"%(build.CPU_ABI2))
self.stdout.write("[*]DEVICE:%s\n"%(build.DEVICE))
self.stdout.write("[*]DISPLAY:%s\n"%(build.DISPLAY))
self.stdout.write("[*]FINGERPRINT:%s\n"%(build.FINGERPRINT))
self.stdout.write("[*]HARDWARE:%s\n"%(build.HARDWARE))
self.stdout.write("[*]MANUFACTURER:%s\n"%(build.MANUFACTURER))
self.stdout.write("[*]MODEL:%s\n"%(build.MODEL))
self.stdout.write("[*]TAGS:%s\n"%(build.TAGS))
仍然是对drozer.modules.Module类的继承,进行元数据配置,其中最主要的则是build=self.new("android.os.Build"),通过模块中的new方法来映射Android java API在java类,从而通过android.os.Build类,来获取、查看Android设备中的硬件、系统构造信息,之后,将文件以ex.device.info命名保存在模块目录下,并执行命令进行模块安装:
Module install /ex.device.info
执行run ex.device.info可查看设备硬件及系统构造信息:
结语:今天跟大伙分享的是drozer的使用以及如何自定开发drozer模块
祝资源共享吧越来越火!
页:
[1]