Drozer是一款针对Android系统的安全测试框架。Drozer能够经过与dalivik VM交互、与其余应用程序的IPC端点交互、与底层操做系统的交互,来避免正处于开发阶段或者正处于部署于组织的Android应用程序和设备暴露出安全风险。python
本此使用的是win10系统,若是使用其它系统搭建,需准备不一样的版本:android
a.打开手机的USB调试功能,将手机经过USB链接电脑。
b.安装jdk环境和python环境,并配置环境变量。
c.安装Android调试工具ADB。
d.安装Drozer。(记得选择python2,并将Drozer的安装目录选择为python安装目录)git
drozer.bat console connect
(执行前通常须要转发端口,命令:adb forward tcp:31415 tcp:31415
) ,打开dozer控制台:命令 | 功能 |
---|---|
help ABOUT | 显示一个指定指令或模块的帮助信息 |
run Module | 执行一个Drozer模块 |
shell | 在设备上启动一个交互式Linux shell |
list | 显示当前会话所能执行全部Drozer模块,不显示未得到相应权限的模块 |
cd | 挂载一个特定的命名空间做为会话的根目录,避免重复输入模块全称 |
load | 加载一个包含Drozer命令的文件而且按顺序执行 |
echo | 在控制台打印信息 |
clean | 移除Android设备上由Drozer存储的临时文件 |
module | 从互联网发现而且安装一个额外的模块 |
permissions | 显示Drozer agent被授予的权限 |
set | 将一个值存储在一个变量中,这个变量将做为一个环境变量传递个任何由Drozer生成的Linux shell |
unset | 移除一个已命名变量,这个变量是由Drozer传递给Linux shell的 |
exit | 终止Drozer会话 |
Drozer官方测试apkgithub
命令:run app.package.list -f <app name>
sql
包括应用程序版本、应用程序数据存储路径、应用程序安装路径、相关权限等,命令:run app.package.info -a <package name>
shell
Drozer可检测apk源码四大组件(activities、broadcast receivers、content providers、services)的export状况,并判断export的组件提供那些服务,由于服务是能够调试的,能够将调试器附加到进程上,就行调试。
数据库
应用程序中,一个Activity一般就是一个单独的屏幕,它上面能够显示一些控件也能够监听并处理用户的事件作出响应。 Activity之间经过Intent进行通讯。在Intent的描述结构中,有两个最重要的部分:动做和动做对应的数据。安全
run app.activity.info -a <package name>
run app.activity.start --component <package name> 设置为导出的activity
android平台提供了Content Provider使一个应用程序的指定数据集提供给其余应用程序。这些数据能够存储在文件系统中、在一个SQLite数据库、或以任何其余合理的方式。其余应用能够经过ContentResolver类从该内容提供者中获取或存入数据。只有须要在多个应用程序间共享数据是才须要内容提供者。网络
run app.provider.info -a <package name>
run scanner.provider.findurls -a <package name>
run app.provider.query uri
run scanner.provider.injection -a packageName 扫描那里能够进行SQL注入 run scanner.provider.sqltables -a com.mwr.example.sieve 列举app的表信息 projection 测试:run app.provider.query contentProviderURI --projection "'" selection 测试:run app.provider.query contentProviderURI --selection "'" projection注入语句测试:run app.provider.query contentProviderURI --projection "* FROM xx;--" Selection注入语句测试:run app.provider.query contentProviderURI --selection "1=1);--"
run app.package.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--"
读取:run app.package.read uris/文件及路径 拷贝:run app.package.download uris/文件及路径 \本地文件及路径
run scanner.provider.traversal -a <package name>
一个Service 是一段长生命周期的,没有用户界面的程序,能够用来开发如监控类程序。较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者能够选择歌曲并播放歌曲。
然而,音乐重放这个功能并无对应的activity,由于使用者固然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而能够在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。
另外,咱们还能够经过使用Context.bindService()方法,链接到一个service 上(若是这个service 尚未运行将启动它)。当链接到一个service 以后,咱们还能够service 提供的接口与它进行通信。拿媒体播放器这个例子来讲,咱们还能够进行暂停、重播等操做。 intent-filter未将exported设置为false,默认是能够导出的。app
run app.service.info -a package_name 查看Services组件信息 run app.service.start --action 服务名 --component 包名 服务名 调用内部服务组件
BroadcastReceive广播接收器应用可使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并作出响应。广播接收器没有用户界面。然而,它们能够启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager来通知用户。通知能够用不少种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。通常来讲是在状态栏上放一个持久的图标,用户能够打开它并获取消息。
测试经常使用命令:
run app.broadcast.info -a <package name> 测试对外的broadcast组件信息 run app.broadcast.send --component <package name> <component name> --action <action> --extra <type> <key> <value> 发送带参数的恶意广播 run app.broadcast.send --action <action> 向广播组件发送不完整intent使用空extras,能够看到应用中止运行