RichardLi
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
一、Adb安装
ADB,即 Android Debug Bridge,ADB具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行shell命令等功能,是 Android 开发/测试人员不可替代的强大工具,将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中。
1.1、Windows
访问:https://developer.android.google.cn/studio/releases/platform-tools
对下载的压缩文件进行解压
配置环境变量
新建环境变量
adb E:\Security\APP\ADB&Drozer\Platform-Tools
在环境变量path中添加
;%adb%;
检查adb环境变量是否配置成功
1.2、Linux
安装:sudo apt-get install adb
查看是否安装成功:adb version
二、Drozer安装
drozer是一个全面的安全审计和攻击框架,可以进行更快的Android安全评估,通过自动化繁琐和耗时的工作,帮助减少Android安全评估所花费的时间。其可以分成两个部分:其一是“console”,它运行在本地计算机上;其二是“server”,它是一个安装在目标Android设备上的app,当使用console与Android设备交互时,就是把Java代码输入到运行在实际设备上的drozer代理(agent)中。
2.1、Windows
2.1.1、安装python2
在python官网下载python2版本,在本地进行安装。
环境变量配置
2.1.2、安装依赖
pip2 install wheel | pip2 install pyyaml |
pip2 install pyhamcrest | pip2 install protobuf |
pip2 install pyopenssl | pip2 install twisted |
pip2 install sevice_identity | 以上为配置好python2环境命令 |
python2 -m pip install wheel | python2 -m pip install pyyaml |
python2 -m pip install pyhamcrest | python2 -m pip install protobuf |
python2 -m pip install pyopenssl | python2 -m pip install twisted |
python2 -m pip install service_identity | 以上为未配置python2环境命令 |
2.1.3、安装drozer
下载安装包和安装代理文件,https://labs.withsecure.com/tools/drozer/,如图所示
然后进行安装,将python3环境禁止掉,设置为python2环境,如图所示
安装后的文件目录为D:\CodeLanguage\python2\Scripts
和D:\CodeLanguage\python2\Lib\site-packages
2.1.4、修改drozer启动文件
备注:由于安装的为python2环境,因此一定要将drozer.bat里面的python.exe改为python2.exe,否则无法运行drozer,直接点击drozer.bat,会出现“已退出进程,代码为 9009 (0x00002331)”错误
2.1.5、连接drozer代理
将代理drozer-agent-2.3.4.apk在夜神模拟器中进行安装,并打开进行监听,等待连接
adb连接drozer
adb connect 127.0.0.1:62001 adb forward tcp:31415 tcp:31415
Drozer连接代理端
进入drozer启动文件drozer.bat的目录下
drozer.bat console connect
2.2、Linux
2.2.1、下载drozer
wget https://github.com/FSecureLABS/drozer/releases/download/2.4.4/drozer-2.4.4-py2-none-any.whl
2.2.2、安装python2的pip
下载get-pip.py:
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
安装get-pip.py:
python2 get-pip.py
2.2.3、安装依赖
参考2.1.2
2.2.4、安装drozer
python2 -m pip install drozer-2.4.4-py2-none-any.whl
三、Drozer使用
可以使用help命令查看drozer更多的操作方法
3.1、查看应用信息
查找终端设备所有APK信息:
run app.package.list
如图所示,在Windows下如果出现apk信息显示不完全的情况,可以通过adb命令来获取终端设备所安装应用的apk信息
获得终端shell:adb shell 列出所有安装应用的包名:pm list package
获取所要测试的apk的完整包名:
run app.package.list -f 包名
获取包的基本信息:
run app.package.info -a 包名
3.2、查看攻击面
run app.package.attacksurface 包名
可看到应用四大组件是否可导出和是否处于调试模式
3.3、四大组件测试
测试Apk文件下载
https://github.com/downloads/jackMannino/OWASP-GoatDroid-Project/OWASP-GoatDroid-0.9.zip (goatdroid.apk)
https://labs.withsecure.com/tools/drozer/ (sieve)
3.3.1、Activity组件漏洞测试
应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。 Activity之间通过Intent进行通信。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。
查看全部对外暴露的activity组件信息
run app.activity.info -a 包名
com.mwr.example.sieve.MainLoginActivity是sieve.apk的启动的主界面,是必须可导出的,但剩下的两个是不应该能导出的。
3.3.1.1、Activity组件调用
对三个activity分别调用
run app.activity.start --component 包名 组件名
调用登录组件名,相关应用会弹出被导出的页面。如这里调用登录页,就会弹出应用登录页。
调用这里的密码页面,就会出现密码页
3.3.1.2、Activity越权漏洞
调用这里的文件选择页面,如图所示
由此可以看出,PWList和FileSelectActivity是直接绕过了MainLoginActivity,可以直接启动的,说明存在acitivty的越权漏洞。
3.3.1.3、Activity劫持
打开应用登录页,使用activity劫持工具进行测试,如果登录页被测试工具所覆盖,就说明activity可以被劫持
(工具地址:https://github.com/yanghaoi/android_app)
run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity
解决建议:
1、app内使用的私有acivity不应配置intent-filter,如果配置了intent-filter需设置exposed属性为false;
2、谨慎处理接受的intent以及其携带的信息,当acivity返回数据时需注意目标activity是否有泄露信息的风险;
适当地在 APP 中给用户一些警示信息,如toast提示.“某某app正在后台运行(参考:https://blog.51cto.com/u_14397532/3000941);
3.3.2、Content Provider组件漏洞测试
android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。只有需要在多个应用程序间共享数据是才需要内容提供者。
查看Content Provider组件信息
run app.provider.info -a 包名
3.3.2.1、数据泄露
获取所有可以访问的uri:
run scanner.provider.finduris -a 包名
可以看出, 对DBContentProvider 内容提供器的访问,除了/Keys 路径需要权限,其他都不需要权限;而对 FileBackupProvider 内容提供器的访问则不需要任何权限,那么我们就可以从中获取敏感数据。
3.3.2.2、敏感数据读取
获取各个Uri的数据
run app.provider.query uri的路径
3.3.2.3、SQL注入
检测可利用uri,检查sql注入
run scanner.provider.injection -a 包名
利用暴露的content provider进行sql注入,使用Sql注入列出数据库中的所有数据表
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';-- "
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* from key;--"
3.3.2.4、目录(文件)遍历
从File System-backed Content Providers获取信息
检测目录遍历
run scanner.provider.traversal -a 包名
3.3.2.5、读取/下载文件
读取目录文件内容
run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
下载文件
3.3.3、Broadcast组件测试
BroadcastReceive广播接收器应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
获取broadcast组件的信息
run app.broadcast.info -a 包名
反编译,查看源码,发现需要两个参数 phoneNumber、message
3.3.3.1、发送恶意广播
run app.broadcast.send --action 广播名 --extra string 参数
反编译apk,查看AndroidManifest.xml 文件,获取广播名
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 1234 --extra string message dog
3.3.3.2、拒绝服务攻击
向广播组件发送不完整intent,使用空 extras,可以看到应用停止运行。
run app.broadcast.send --action 广播名
3.3.4、services组件测试
一个Service是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。
然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行结束。
另外,我们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service 还没有运行将启动它)。当连接到一个service之后,我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。 intent-filter未将exported设置为false,默认是可以导出的。
查看service组件的信息:run app.service.info -a 包名
调用服务组件
run app.service.start --action 服务名 --component 包名 服务名 run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.services.LocationService
3.3.5、组件安全问题修复
当组件为私有组件时,建议设置android:exported的值为 false;当组件为公有组件时,建议对其进行权限控制。
四、真机连接测试
通过数据线将手机和电脑进行连接,自行选择连接虚拟机还是物理机。
这里以虚拟机为例,将手机连接到kali虚拟机
在手机设置的“关于手机”里,连续点击“版本号”进入“开发者模式”
在“开发者模式”里面打开“USB调试”
将“USB连接方式”改为“传输文件”
查看设备是否成功连接
在手机上安装drozer代理,并打开进入到等待连接状态
端口转发
启动drozer
查看应用信息
五、常用测试命令
5.1、Drozer命令
命令 | 用途 |
run app.package.list -f 包名 | 获取设备所安装应用包名 |
run app.package.info -f 包名 | 查看app的基本信息 |
run app.package.attacksurface 包名 | 查看app可能存在的风险 |
run app.activity.info -a 包名 | 查看activity信息 |
run app.activity.start --component 包名 activity组件名 | 调用activity组件 |
run app.provider.info -a 包名 | 查看content provider信息 |
run scanner.provider.finduris -a 包名 | 查看可以访问的uri |
run app.provider.query uri | 查看uri的数据 |
run scanner.provider.injection -a 包名 | 查看是否存在SQL注入 |
run scanner.provider.traversal -a 包名 | 查看是否存在目录遍历 |
run app.service.info -a 包名 | 查看service信息 |
run app.broadcast.info -a 包名 | 查看brocast receive信息 |
run app.broadcast.send --component 包名 receivename --action android.intent.action.XXX | 存在action和extras |
run app.broadcast.send --component 包名 receivename | 空action |
run app.broadcast.send --action android.intent.action.XXX | 空extras |
5.2、Adb命令
命令 | 用途 |
adb install apk_name.apk | 安装apk软件包 |
adb install -r apk_name.apk | 升级安装apk软件包(覆盖安装) |
adb uninstall apk_name.apk | 卸载apk软件包 |
adb shell am monitor | 监控打开应用的包名 |
adb push local_dir divice_dir | 将本地文件推送到设备 |
adb pull divice_dir local_dir | 将设备文件拉取到本地(无法拉取时,可将文件先转移到/sdcard中再拉取) |
adb logcat | 打印实时adb |
adb logcat > log.txt | 保存adb日志到文件 |
adb shell dumpsys package package_name | 查看指定应用的详细信息 |
adb shell dumpsys activity top | 查看当前应用的activity信息 |
adb shell screencap -p device_dir/screen.png | 手机截屏 |
adb shell screenrecord device_dir/screen.mp4 | 手机录屏 |
adb forward tcp:31415 tcp:31415 | 端口转发 |
adb devices | 列出所有设备 |
adb start-server | 开启adb server |
adb kill-server | 关闭adb server |
adb shell pm list package | 获取所有包名(第三方包+内置) |
adb shell pm list package -3 | 获取第三方包名 |
adb shell | 进入交互式shell |
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)

