原文:https://www.blackhillsinfosec.com/embedding-meterpreter-in-android-apk/
看完简单翻译一下,利人利己吧。
起因
移动无处不在。我们日常生活中的许多应用程序正在迁移到云部署,从而使前端技术重新回到轻量客户端的时代。当钟摆再次摆动时,我们的轻量客户端可以是任何形式,从JavaScript浏览器框架到支持移动设备的前端,例如Apple iOS上的Objective-C,或基于Android的Java。
我们来把眼光放到恶意软件,我们在Apple的5人团队继续维持的安全范例,试图审查进入iOS应用程序商店的所有应用程序。尽管这是一项高消耗的工作,但仍然存在恶意软件通过审核的情况。与Apple不同,Android市场是一种开放的方式,允许任何人为游戏商店做出贡献,而且占据了移动市场份额的大部分。此外,还有各种第三方网站可以直接下载Android应用程序包文件(APK)。
准备
Metasploit项目允许测试人员使用功能非常强大的meterpreter命令通道生成Android有效负载,该通道可以加载到Android设备上。通常,加载此APK将通过侧面加载通过Android调试器“adb”。从笔测试者的角度来看,有趣的事情是将合法(有趣)的应用程序与Meterpreter相结合,并将该应用程序侧载到Android设备上。当然,您可能会考虑将该设备作为礼物或类似的社会工程诡计发送给“朋友”。
Android应用程序是用Java编写的,它编译成称为DEX的可执行格式。应用程序的编译版本是DEX字节码文件的ZIP文件。Android上的虚拟机最近被Android RunTime(ART)取代,后者执行额外的优化并将DEX字节码编译为本机汇编代码。Dalvik VM主要执行大部分字节码的即时(JIT)解释。ART比Dalvik虚拟机具有更高的性能,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文件中找到代码的入口点 :
包含此intent-filter的活动名称将是您要搜索的入口点。6.修改活动“.smali”文件以包含启动Meterpreter阶段的行。
7.将Meterpreter AndroidManifest.xml中的所有Meterpreter权限复制到修改后的APK的- AndroidManifest.xml中。
8.重新组装成DEX压缩格式生成APK。
9.使用“jarsigner”为新创建的APK文件签名,然后将其加载到目标Android设备上。
例子
0x01下载APK
用一个具体的例子会使得上述步骤要容易理解的得多。为了说明这一点,我从apkmonk.com下载了一个名为Cowboy Shooting Game的游戏的APK文件。
0x02 生成恶意软件APK
然后,我使用“msfvenom”命令生成Metasploit APK,如下所示。
0x03反汇编APK文件
然后使用“apktool” 对这两个文件进行反汇编(baksmaling !!!),如下所示:
0x04 将恶意软件代码复制到APK游戏中
一个简单的方法是将目录更改为Metasploit APK目录,然后将“smali”目录下的所有文件复制到“com.CowboyShootingGames_2018-09-22”目录中。我从系统管理员那里学到的使用“tar”命令备份整个目录树的技巧很方便,你可以将tar的输出传输到第二个命令,该命令改变目录并“解压缩”生成的文件。
0x05 找到Activity EntryPoint
下面我们可以看到输入活动被列为“com.CowboyShootingGames.MainActivity”。我们知道这一点,因为XML中包含一个带有“android.intent.action.MAIN”的intent-filter。
0x06 修改Activity EntryPoint Smali文件
从上面可以看出,在这种情况下,文件将被命名为“MainActivity.smali”,并且将根据完全限定类路径中的句点(".")位于“ com / CowboyShootingGames ”目录中。
在“MainActivity.smali”文件中,我们正在寻找“onCreate()”方法。
我们需要在“onCreate()”方法调用的正下方添加一行“smali”代码来调用我们的Meterpreter阶段。
invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V
请注意,以上是一行代码。可以使用与“com/metasploit/stage/Payload”不同的路径名来进行模糊处理,但是如果这样做,则必须修改payload中包含的所有“smali”文件中对路径的所有引用。目录,并更改目录名称本身。这可以手动完成,但容易出错。在没有任何混淆的情况下继续进行,修改后的最终结果将如下面的屏幕截图所示。
0x07 向修改的APK“AndroidManifest.xml”文件添加权限
对于下一步,使用“grep”搜索Metasploit“AndroidManfest.xml”文件中包含字符串“uses-permission”和“uses-feature”到修改后的APK的AndroidManiest.xml文件中的所有行。
您需要使用编辑器在新的“AndroidManifest.xml”文件中的适当位置插入权限。搜索现有的“use-permission”行作为插入文本的位置的指导。
您最终可能会获得一些重复的权限。您可以选择删除它们,它确实无关紧要。
0x08 构建新的APK包文件
现在 再次使用“ apktool” 重新组合生成的APK包文件。最终结果将写入APK目录本身的“dist”目录中。
0x09 重新签名生成的包文件
对于签名,一种简单的方法是使用安装Android studio时构建的Android调试密钥库。调试密钥库将包含在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系列设备非常适合使用,因为“ROOT”套件相当可靠,并且通过USB电缆连接进行测试并不是太麻烦。
最后一步当然是尝试我们新感染的游戏。我们很快发现,在我们推出游戏的那一刻,我们在KALI系统上获得了一个Meterpreter session,感觉非常好用。
我真的不认为我会花时间学习这个游戏,坦率地说只是从“apkmonk.com”的随便下了一个游戏。
如此多的复杂步骤,这么多都可能出错......
因此,在执行了上述所有必要步骤后,我立即感到沮丧。有这么多活动部件,错误的可能性非常高。可能还有其他工具可供使用但我决定使用快速的Python脚本来自动执行此过程。我称它为“android_embedit.py”,我现在会警告你,这是一项快速而好用的努力,无需花费太多精力来加强逻辑,就可以完成植入APK工作。
“android_embedit.py”的思路是,如果您提供Metasploit生成的APK文件,要修改的原始APK和密钥库,它将以自动方式执行所有步骤并为您生成结果。
以下是运行该工具的示例。所有临时文件和输出都将存储在“〜/ .ae”目录中。
该工具还将删除“metasploit”目录名称,并自动使用随机字符串目录名称对其进行模糊处理。您可以在下面的屏幕截图中看到此结果,其中列出了APK“smali/com”目录的内容。名为“ dbarpubw ”的目录实际上包含Metasploit stager代码。
对于移动应用程序及其相关的应用程序编程接口来说,有很多持续的乐趣。作为一个安全测试人员熟悉这些平台是一个好主意,因为不久之后你肯定会遇到在移动领域进行测试的需要。
Keep calm, and hack all the mobile things. ~Joff