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/
然后,进入类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文件,就可以执行远程指令。