com.metasploit.stage分析

com.metasploit.stage分析

郑重声明:本文展示的过程是在模拟环境中进行的,只为学习研究之用,如有人用于非法用途,产生的后果笔者不负任何责任。

先分析客户端(移动设备上apk),再分析msf端的原理,透彻理解服务端控制客户端的原理。

1.反编译

首先,反编译生成的apk文件。将apk文件拖入jeb工具中,可以看到此apk的主要类结构。从Manifest文件可以看出,应用入口为MainActivity,设置了android:theme“@android:style/Theme.NoDisplay”,即不显示。定义了一个MainBroadcastReceiver,接收设备已启动广播。在Mainservice中执行主要操作。

2.调用入口

在MainActivity和MainBroadcastReceiver中的onCreate和onReceive方法中均调用了MainService.startService。看一下MainService的代码:

在startService()方法中,启动了MainService服务,会调用onStartCommand方法,传入Context参数。onStartCommand方法中,调用了关键类Payload的start方法。看一下代码:

注意,方法中调用了startInPath方法,并传入了Context.getFilesDir().toString。getFilesDir()方法用于获取/data/data//files目录,即应用的私有目录。Payload.a是一个byte[]静态常量,和应用私有目录一起初始化了Payload.h。

然后,进入类e。该类代码如下:

可以看到只是新起了一个线程来执行Payload.main()方法。

3.Payload类

3.1 main()

回到Payload类,main方法:

传进来的参数的null,执行a v6 = b.a(Payload.a);,即对byte[]常量Payload.a进行一系列位运算(怀疑是某种加密算法),返回类a的实例。

3.2 关键代码

关键代码如下,即对Payload.a解析出的数据进行一系列操作:

在while循环中,对String类型的变量v7进行判断。v7来自g对象的String变量a,而g对象来自Payload.a解析后生成的a类型的对象中的LinkedList类型变量d的第0个元素。

v7判断处有两个分支:以“tcp”开头和以“https”开头。

若以“tcp”开头,则对v7进行格式化,根据格式化的代码:

可以看出,v7的格式为:tcp://ip:port. v3_1即为ip, v2_1即为端口号。然后,建立Socket连接,如下图:

若以“https”开头,则调用类a的a()方法解析请求,代码如下:

然后,调用类f的a()方法,初始化SSLSocket连接:

3.3 Paload.a()

建立Socket或SSLSocket连接后,调用了Payload.a()方法传输文件:

首先,从远程下载jar文件到本地,然后,加载该文件,再通过反射调用start()方法。

3.4 分析远程下载的文件

从上图可以看到,调用DexClassLoader.loadClass()方法,执行动态加载,随即删除了从远程下载的文件。为了查看从远程下载的文件内容是什么,需要修改文件,重新打包此应用。找到Payload.smali文件中对应的delete语句,将其删除即可,如下图:

重新打包签名(PS:签名一完成,windows自带的扫描工具就扫描出了病毒。。。。),安装,执行,在/data/data/com.metasploit.stage/files目录下,找到了下载的文件:

反编译jar包,可以得到:

可以看到,这里的方法就是Payload类中通过反射调用的start()方法。start()方法通过读取数据流,以及加载dex文件,就可以执行远程指令。