安卓APK中嵌入Meterpreter的技术指南

本文详细介绍了如何将Meterpreter有效载荷嵌入到合法的安卓APK文件中,涵盖APK反编译、smali代码修改、权限添加、重签名及自动化脚本实现等完整技术流程。

嵌入Meterpreter到安卓APK

作者:Joff Thyer
分类:移动安全/红队技术

如今移动设备无处不在。我们日常生活中的许多应用正迁移至云端部署,前端技术回归到瘦客户端时代。随着技术浪潮再次摆动,我们的瘦客户端可以是任何形式——从JavaScript浏览器框架到移动端前端,如Apple iOS的Objective-C或基于Java的Android。

在恶意软件方面,苹果公司仍坚持“五人洞穴”模式,试图审核所有进入iOS应用商店的应用。尽管这是崇高的努力,但恶意软件仍时有发生。与苹果不同,Android市场采用开放策略,允许任何人向Play商店提交应用,且占据移动市场的大部分份额。此外,还有各种第三方站点允许直接下载Android应用包文件(APK)。

Metasploit项目允许渗透测试人员生成具有高度功能化Meterpreter命令通道的Android有效载荷,可加载到Android设备上。通常,通过侧载(sideloading)方式,使用Android调试器“adb”加载此APK。从渗透测试的角度来看,将合法(可能有趣)的应用与Meterpreter结合,并将该应用侧载到Android设备上,是一件有趣的事情。自然,你可能会考虑将该设备作为礼物送给“朋友”或使用类似的社会工程技巧。

Android应用使用Java编写,编译为称为DEX的Dalvik可执行格式。应用的编译版本是DEX字节码文件的ZIP文件。Android上的Dalvik虚拟机最近已被Android运行时(ART)取代,ART执行额外优化并将DEX字节码编译为本机汇编代码。Dalvik VM主要对大部分字节码执行即时(JIT)解释。ART比Dalvik虚拟机性能更高,后者仅优化应用频繁执行部分的字节码。

Smali/baksmali是Android DEX字节码的汇编器/反汇编器。名为“apktool”的Android工具能够将压缩的DEX(APK文件)反汇编为smali文件,并将smali文件重新汇编为DEX,随后压缩为APK格式。我们可以使用此工具反汇编和修改现有的APK文件。在此上下文中,我们可以使用该工具反汇编并在初始Android Activity的smali代码中添加额外的静态入口点,以启动我们的Meterpreter。

总体而言,将Meterpreter嵌入现有APK文件的步骤如下:

  1. 在“apkmonk.com”或类似镜像站点上找到现有的有趣APK应用。
  2. 生成Metasploit APK文件。
  3. 使用“apktool”反汇编Metasploit APK文件和我们要修改的APK文件。
  4. 将所有Meterpreter smali代码复制到新的APK smali目录。
  5. 通过查找包含以下行的intent-filter,在APK应用的AndroidManifest.xml文件中找到代码的入口点:<action android:name="android.intent.action.MAIN"/>。包含此intent-filter的activity名称即为你寻找的入口点。
  6. 修改activity“.smali”文件,添加一行启动Meterpreter阶段的代码。
  7. 将所有Meterpreter smali代码复制到新的APK smali目录。
  8. 重新汇编为DEX压缩格式。
  9. 使用“jarsigner”对新创建的APK文件进行签名,然后侧载到目标Android设备上。

通过具体示例更容易理解上述步骤。为说明这一点,我从apkmonk.com下载了一个名为“Cowboy Shooting Game”的游戏的APK文件。

生成你的恶意软件APK

然后我使用“msfvenom”命令生成Metasploit APK,如下所示。

反汇编APK文件

然后使用“apktool”反汇编(baksmaling!!!)两个文件,如下所示:

将恶意代码复制到Cowboy Tools游戏中

一种简单的方法是切换到Metasploit APK目录,然后将“smali”目录下的所有文件复制到“com.CowboyShootingGames_2018-09-22”目录。我从系统管理员那里学到一个旧技巧,使用“tar”命令备份整个目录树,通过将tar的输出管道传输到第二个命令,该命令切换目录并“解压”生成的文件。

找到Activity入口点

下面我们可以看到入口activity列为“com.CowboyShootingGames.MainActivity”。我们知道这一点,因为XML包含一个带有“android.intent.action.MAIN”的intent-filter。

修改Activity入口点Smali文件

如上所示,在这种情况下,文件将命名为“MainActivity.smali”,并根据完全限定类路径中的句点(“.”)位于“com/CowboyShootingGames”目录中。

在“MainActivity.smali”文件中,我们寻找“onCreate()”方法。

我们需要在“onCreate()”方法调用下方添加一行“smali”代码,以调用我们的Meterpreter阶段。

1
invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V

请注意,以上是单行代码。可以通过使用不同于“com/metasploit/stage/Payload”的路径名进行混淆,但如果你这样做,必须修改“Payload”目录中所有smali文件中对该路径的所有引用,并更改目录名本身。这可以手动完成,但容易出错。暂时继续不加任何混淆,修改后的最终结果将如下截图所示。

向修改后的APK“AndroidManifest.xml”文件添加权限

下一步,使用“grep”搜索Metasploit“AndroidManifest.xml”文件中所有包含字符串“uses-permission”和“uses-feature”的行,并将它们添加到修改后的APK的AndroidManifest.xml文件中。

你需要使用编辑器在新“AndroidManifest.xml”文件的适当位置插入权限。搜索现有的“use-permission”行作为插入文本的指南。

你可能会遇到一些重复的权限。你可以选择删除它们,但这并不重要。

构建新的APK包文件

现在再次使用“apktool”重新汇编生成的APK包文件。最终结果将写入APK目录本身的“dist”目录中。

重新签名生成的包文件

对于重新签名,一种简单的方法是使用Android调试密钥库,该密钥库在安装Android Studio时构建。调试密钥库将包含在UN*X系统上主目录的“.android”隐藏目录中。

另一种方法是使用Java“keytool”生成自己的自签名密钥库,并使用“jarsigner”工具进行签名,如下截图所示。

此时,“final.apk”文件已准备好使用“adb”加载到Android系统上。

在此特定情况下,我运行的是“GenyMotion”副本,这是一个基于x86的模拟器,使用VirtualBox进行高性能Android模拟。你可能立即遇到的一个挑战是x86模拟无法原生支持ARM处理器。为解决此挑战,网上有一些ARM转换库可用。你需要搜索“Genymotion-ARM-Translation_v1.1.zip”,然后将ZIP文件拖到运行的GenyMotion Android系统上。不幸的是,这并非100%可靠,仍可能导致一些应用崩溃。

确保ARM APK文件在设备上运行的某种确定方法是使用硬件设备本身。我发现Nexus 6系列设备很好用,因为“rooting”工具包相当可靠,且通过USB电缆连接进行测试并不太繁琐。

最后一步当然是尝试我们新感染的Cowboy Shooting游戏。我们很快发现,启动游戏的那一刻,我们在KALI系统上获得了Meterpreter shell,这感觉非常正确。

我真的不认为我会花时间学习这个游戏,坦白说,这只是从“apkmonk.com”随机挑选的。

如此多复杂的步骤……如此多可能出错的地方……

在执行完上述所有必要步骤后,我立即感到沮丧。有如此多的移动部件,出错的可能性相当高。可能还有其他工具可用,但我决定快速编写一个Python脚本来自动化此过程。我称之为“android_embedit.py”,我现在警告你,这绝对是一个快速而粗糙的努力,旨在以最少的逻辑硬化工作来完成工作。

“android_embedit.py”的理念是,如果你提供Metasploit生成的APK文件、要修改的原始APK和密钥库,它将自动执行所有步骤并为你生成结果。

以下是运行该工具的示例。所有临时文件和输出将存储在“~/.ae”目录中。

该工具还会删除“metasploit”目录名,并自动用随机字符串目录名进行混淆。你可以在以下截图中看到此结果,我列出了APK“smali/com”目录的内容。名为“dbarpubw”的目录实际上包含Metasploit stager代码。

移动应用及其相关的应用程序编程接口还有许多持续的乐趣。作为渗透测试人员,熟悉这些平台是个好主意,因为你无疑很快就会遇到在移动领域测试的需求。

我想你现在可能只想玩“Android EmbedIT”!好吧,如果你愿意,可以从我的GitHub下载,访问https://github.com/yoda66/AndroidEmbedIT。

保持冷静,黑客所有移动设备。~Joff

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计