msf Android马分析

type
status
date
slug
tags
summary
category
icon
password

一、运行效果以及环境搭建

notion image
已知这个马上线安卓13(我的测试机环境)是会被直接拦的,尝试了一下安卓7
notion image
可以上马,上的时候不会检测权限,但是shell不进去以及文件看不到,推测是权限管理系统拦了但是马没有申请,合理怀疑是安卓6.0以后需要动态申请权限,这里的马存在一定问题
这边上一个android5,不行,报错
notion image
上一个android6,成功!
notion image
简单看一下我们的权限:
notion image
简单来说没什么用,大概研究一下应该是进应用沙箱了,但是权限是给满的,很奇怪,还是啥也干不了

二、逆向分析

AndroidMainfest.xml

申请权限,注定这个马只能低版本使用
活动类名:MainActivity
注册intent:
  • <action android:name="android.intent.action.MAIN"/> - 指定该活动为应用程序的主要入口点。
  • <category android:name="android.intent.category.LAUNCHER"/> - 指定该活动为启动器活动,即显示在设备的应用程序列表中并且可由用户启动
  • 指定了metasploit协议链接的主机和方案
  • 等等

MainService

  • 尝试通过反射加载android.app.ActivityThread中的currentApplication方法并通过invoke执行,转化为context类型保存,如果获取不到Context,则通过主线程的 Handler 将一个新的 Runnable 对象发送到消息队列中,以便在主线程中执行,c中的逻辑为在运行时尝试通过之前传递进来的 Method 对象获取 Context 对象,并在获取成功时启动 MainService 服务
java 反射:深入理解Java中的反射机制及使用原理!详细解析invoke方法的执行和使用-阿里云开发者社区 (aliyun.com)
  • 允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性
  • 程序中的对象一般都是在编译时就确定下来,Java反射机制可以动态地创建对象并且调用相关属性,这些对象的类型在编译时是未知的
  • 也就是说 ,可以通过反射机制直接创建对象,即使这个对象类型在编译时是未知的
类的加载机制:JVM使用ClassLoader将字节码文件,即 class文件加载到方法区内存中
ClassLoader类根据类的完全限定名加载类并返回一个Class对象
反射的用途:
  • 很多框架都是配置化的,通过XML文件配置Bean
  • 为了保证框架的通用性,需要根据配置文件加载不同的对象或者类,调用不同的方法
  • 要运用反射,运行时动态加载需要加载的对象
这里主要就是用③,实现动态加载,反射是各种容器实现的核心
从类中获取一个方法后,可以使用invoke() 来调用这个方法
Service 类的重写方法,用于处理启动服务的命令。1 表示如果服务被杀死了,系统尝试重新创建服务并调用 onStartCommand() 方法;即这里会维持在后台循环启动payload
我们知道,frida会悬挂进程并多起四个线程(可以自行调试,这个地方还没有具体了解原理,不过需要注意)那么我们编辑运行基本的一个脚本就会观察到有
notion image
后台重新加载了几次payload,使得vps重新接收到了sessions,随即关闭掉前面的链接,可以认为我们的推断是基本正确的,这部分实现了马的持久化
测试payload的重加载:
notion image
修改返回值,服务会快速重置,但是新的连接无法维持,原因是我们hook了返回值为START_NOT_STICKY

Payload

class b

这里明显是一个大小端序转化,基本上就是在对payload做数据处理,先大体手动还原符号,看起来就是简单编码还原payload内容并获取信息:
这里重载函数比较多,可以直接拿脚本批量打印一下看,
可以看到两个比较关键的结果:
notion image
notion image
即,这里的payload就是msf马生成的信息部分,在b函数中还原出信息并添加生成一个http request包

payload

  • 这里创建了一个 WakeLock 对象 v0,它允许应用程序保持设备唤醒状态,这里通过 Payload.b.getSystemService("power") 获取了系统服务 power,并将其转换为 PowerManager 对象。然后调用 newWakeLock(1, Payload.class.getSimpleName()) 方法创建了一个 WakeLock 对象,参数 1 表示创建的 WakeLock 类型是 PARTIAL_WAKE_LOCK,即部分唤醒锁定,它允许CPU继续运行,但允许屏幕和其他系统资源关闭。
  • 实现了禁用启动器图标,与上文callback可以隐匿在后台刷新
下面一段是进行基础的tcp解包,不需要讲,后面可以直接抓包看行为
这里很明显动态生成了文件,并反射运行其中的部分内容,相同的方法抓取方法返回值和参数,可以拿到:
notion image
反射运行了这个方法,这里仍旧是一个loader
notion image
notion image
那么这里就需要获得里面的met.jar,有点缺乏经验不知道怎么搞(这里需要清楚,frida去hook的是app内所有的内容,即使loader加载的也不例外),不过询问了一下可以去hook File.delete,然后去找文件
这frida确实有点好用的

met.jar

根据刚才的分析,入口类就是这里的com.metasploit.meterpreter.AndroidMeterpreter
notion image
里面的马已经相当明文,就暂时不看了
上一篇
driver复现(铁三2024)
下一篇
pwnCollege02
Loading...
文章列表
Hi~, I ‘m moyao
reverse
pwn
pentest
iot
android
others
ctf
iOS