安卓逆向培训 发表于 2020-2-20 14:00:03

零基础安卓逆向学习之旅(三)

零基础安卓逆向学习之旅(三)


上期小狼跟大伙儿分享了如何初步检查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模块

a114543 发表于 2020-9-19 09:01:38

祝资源共享吧越来越火!
页: [1]
查看完整版本: 零基础安卓逆向学习之旅(三)