XServer

Project Url: monkeylord/XServer
Introduction: A Xposed Module for Android Penetration Test, with NanoHttpd.
More: Author   ReportBugs   
Tags:

A Xposed Module for Android Penetration Test, with NanoHttpd.

背景

渗透测试中经常遇到通信协议的分析或者各类混淆。

此时,若通过静态的代码分析,则定位关键函数时耗时往往很久。此时,直接根据运行时的参数、结果特征直接定位到关键函数,往往能够节省很多时间。

此外,逆向通信协议往往比较麻烦,尤其是测试目的是通信内容而非协议本身时,此时,若不去逆向协议本身,而是直接使用应用内现成的协议,也会省去大量时间。

XServer

XServer 是一个用于对方法进行分析的 Xposed 插件,它针对的是“方法”接口。由于人类习惯函数式编程,为了可维护性,往往会把各个功能分别封装进各个类与方法,这成为了程序的弱点。

利用注入和反射,可以记录并拦截方法的调用,也可以在应用自身的运行环境中调用某个具体方法。这就可以对应用的分析起到辅助。

另外,XServer 还通过 HTTP 和 WebSocket 提供远程动态操作界面,也提供 RPC 接口供其它工具调用应用内的方法。

使用说明

通过 Xposed 启动

  1. 确保 Xposed 框架已经正确安装
  2. 安装 XServer 并确保在 Xposed 中启用 XServer
  3. 在 XServer 应用选择器中选中目标应用
  4. 启动目标应用
    1. 如果 XServer 没有启动,可能是目标应用早已启动,然后才选择的目标应用,已错过目标应用判断时机。此时,可以关闭目标应用重新打开。
    2. 如果切换目标应用,原目标应用中的 XServer 依然在工作和占用端口。可以关掉原目标应用再启动新目标应用。
    3. 选择应用后直接重启设备最简单,如果你使用模拟器的话。
  5. 通过 ADB 转发 XServer 端口:adb forward tcp:8000 tcp:8000
    1. 目标应用可能存在多个进程,针对这种情况,XServer 在进程 PID 对应的端口也打开了监听。若 8000 端口对应的进程不是目标应用主进程,可以使用另一个命令修正:adb forward tcp:8000 tcp:[目标进程 PID]
  6. 通过http://127.0.0.1:8000/ 访问 XServer

通过 Frida 启动

  1. 确保 Frida-Server 已经启动
  2. 确保 XServer 已在设备中
    1. 在目标设备中安装 XServer(无需 Xposed 框架)
    2. 将 XServer 对应 APK 放置在/data/local/tmp/xserver.apk
  3. 使用 Frida 加载 XServer.js 以启动 XServer:frida -U [目标应用包名或进程 PID] -l XServer.js
  4. 通过 ADB 转发 XServer 端口:adb forward tcp:8000 tcp:8000
  5. 通过http://127.0.0.1:8000/ 访问 XServer

通过其他 Hook 框架启动

XServer 内部使用自己定义的 Hook 接口,因此可以兼容其他 Hook 框架,只要其他 Hook 框架实现 HookProvider 并注册。

  1. 将 XServer 注入并加载到目标应用中

  2. 修改 XServer 属性:assetManager、classLoader

  3. 实现 HookProvider

    1. 支持动态创建类的框架如 Frida 可自行实现monkeylord.XServer.handler.HookHandler$HookProvider
    2. 也可以通过 Hook 已有的monkeylord.XServer.handler.Hook.DummyProvider来实现
  4. 在 XServer 中注册 HookProvider

    HookHandler.setProvider(yourProviderClass);
    
  5. 启动 XServer

    new XServer(8000);
    

批量跟踪

  1. XServer 首页最下方是当前应用已加载的类清单,通过 Filter 可以根据名称进行过滤
    1. 这个清单不包括系统类
    2. 这个清单对应的是 XServer.classLoader 中已加载的类
  2. 点击 Begin MassMonitoring 进入批量跟踪界面
  3. 在 Class Filter 中根据类名筛选感兴趣的类(支持正则表达式)
  4. 点击 Load Methods for Matched Classes 来加载符合条件的类中的方法清单
  5. 在 Method Filter 中根据方法名筛选感兴趣的方法(支持正则表达式)
  6. 点击 Hook Matched Methods 监控所有符合以上两个筛选条件的方法。
  7. 收起 Method Trace Selector 观察日志
  8. 在 Class Tree 中可以随时通过勾选和取消勾选来调整某个方法是否被 Hook
    1. 某些不重要的方法可能反复触发刷屏,可取消勾选,不再关注这些方法。
  9. 可以通过 Ctrl+F 搜索日志以寻找某些已知的内容是否在某个方法的参数或返回值中。

拦截、修改、重放方法调用

  1. 进入目标方法查看界面
    1. 在 MassMonitoring 界面中点击感兴趣的方法直接进入
    2. 在首页点击对应的类,再点击进入对应方法
  2. 部署并启动中间人工具并设置代理进行抓包
    1. XServer 报文会使用系统配置的代理
  3. 操作应用,目标方法被调用时可在中间人工具中拦截到/invoke2 调用
    1. 方法查看界面下方会也会记录方法调用情况,此处同时可以查看方法被调用时的堆栈情况
    2. 方法查看界面中的 Invoke 是一种简单触发调用的方法,用于调用应用中一些简单的工具方法
  4. 在中间人工具中,可以实时修改/invoke2 调用中的参数和返回结果,从而改变方法被调用时的参数/返回结果
  5. 可以在中间人工具中直接重放/invoke2 请求,这会使对应的方法被再次调用
    1. 对于加解密方法,这可以直接调用加解密
    2. 对于网络请求方法,这可以再次触发网络请求

注入 Js 脚本执行方法

XServer 接入 Rhino 可动态注入脚本执行,调用指定方法。
例如调用监控 Application.onCreate() 方法

app.onCreate()

js 环境中支持 Application 变量:app 可直接使用,导入类方式,参考Rhino 官方文档

D8doQA.md.jpg

XServer 基础结构

架构

XServer 是一个被注入到目标 APP 中的、具备 Hook 等能力的 HttpServer。

包含两个部分:HttpServer、Xposed 入口

Xposed 启动 HttpServer 并提供 Hook 能力,WebServer 负责界面、RPC 及各类业务逻辑。

新版的 XServer 可以在无 Xposed 的环境下运行,比如使用 Frida 来启动和 Hook。

关键组件

Xposed 入口:XposedEntry

应用选择器:MainActivity

HttpServer:XServer

业务逻辑处理:handler

对外接口:api

其它功能组件:utils、objectparser

资源文件:各类 freemarker 页面(XServer 目前使用 freemarker 作为模板引擎)

HttpServer

对应代码:XServer.java

基于 NanoHTTPD 和 NanoWSD 开发,实现 HTTP 路由表与 WebSocket 路由表,并整合 freemarker 作为模板引擎。

定义了两类 API 接口,HTTP API 和 WebSocket API(Operation、wsOperation),启动后加载的各类功能 API 都要在此注册。

模板引擎则很简洁,在 assets 目录中编写模板,然后XServer.render(data,templete)即可。

XServer 可以动态注册第三方插件,比如新增 API,或者告诉 XServer 特殊对象如何处理,不过目前并没有定义这部分能力。

API 组件

Viewer

包含以下 API:MemoryView、ClassView、MethodView 和 wsMethodView

MemoryView 提供基本的内存修改、Dump 能力。

ClassView 提供对类和方法的浏览,用来了解和查看应用的结构。

MethodView 和 wsMethodView 提供对方法调用与返回的实时监控,同时将被监控的方法变为远程调用。

Tracer

包含两个 API:Tracer 和 wsTracer

提供对应用执行流的方法粒度跟踪,批量监控并记录方法调用与返回,以及对应的参数和结果。

用于分析应用执行流,定位关键函数。

Invoker

包含两个 API:Invoke 和 Invoke2

提供并完成对应用内方法的远程调用,也管理保存的对象实例。

MethodView 界面里的 Invoke 提供的是基本调用,适用于一些简单的情况。

wsMethodView 里使用了 Invoke2 调用,设置了 Burp 等代理后,可以拦截并修改对应方法的调用,可以处理复杂对象,也支持在 Burp 等工具中直接重放、爆破等。建议使用 Invoke2。

Injector

API:TODO

提供动态注入 SO,APK 的能力,用于启动 frida-gadget 或动态启动其它 Xposed 插件。

Handler 组件

处理反射

包含 ClassHandler、MethodHandler

用于通过反射获取各种类与方法的对象,提取和处理其中信息。

处理注入

包含两个 handler:HookHandler、ObjectHandler

HookHandler 用于为其他组件提供 Hook 能力,并定义了 XServer 使用的 Hook 接口。

ObjectHandler 用于管理 APP 中的各类对象实例,在 XServer 内部收集和复用各类对象实例。Invoke2 依赖此功能,Invoke2 处理复杂对象时通常不创建对象,而是通过 ObjectHandler 复用 APP 自身使用的对象。

深度操作

目前包含 MemoryHandler

提供内存操作,利用内部类 Libcore 实现,没有使用 SO。

可以用于 Dump 内存寻找 Demo,也可以动态修改内存。

TODO:提供 SO 和 APK 加载

TODO:提供 C 层 Hook,利用 SO 实现,或许可以使用 substrate,或许可以现场 gcc?

TODO:集成一些比较有用的 Hook

对象处理 ObjectParser

定义了 XServer 对于各类对象的序列化、反序列化逻辑。

对应的逻辑在 XServer 中注册。

目前包括了字符串、字节数组、整型的处理逻辑,以及使用 ObjectHandler 来存取对象的处理逻辑。

这部分可以较为方便地自行增添和注册,也欢迎 PR。

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools