• 本人太蠢,刚做题以为flutter模块是用于app与手机屏幕的交互。
  • 结果flutter模块是用于app与服务器交互,搞了半天原来要抓包,于是前来学习安卓逆向抓包
  • 工具
    • 教程Demo(更新)
    • Reqable

抓包

概念

  • :在计算机网络中,“包”通常指的是在网络上传输的数据单元,也被称为数据包。在互联网协议(IP)的语境下,数据包是由报头(Header)和载荷(Payload)组成,其中报头包含了源地址、目的地址、长度等信息,而载荷则是实际要传输的数据。

  • 抓包:抓包具体指的是通过某些工具获取安卓App与服务器之间传输的网络数据,这些数据通常用于逆向分析、协议接口分析或App渗透测试,帮助安全工程师理解App与服务器之间的通信细节,如请求和响应的具体内容,从而进行安全评估或逆向工程

  • 抓包一般用于
    • 帮助定位加密或混淆的代码中的关键部分
    • 逆向接口(比如:一些第三方影视app的解析接口、分析是否为服务器校验)
    • 篡改数据包实现免重打包破解和屏蔽广告
    • 协议分析和爬虫需求

前置知识

  • 这一部分都是计算机网络的知识,涉及到web、http协议

抓包工具

image-20240921135420151

  • 然后下滑同意协议,选择该模式

image-20240921135516490

  • 接下来安装证书
  • Reqable使用经典的中间人(MITM)技术分析HTTPS流量,当客户端与Reqable的代理服务器(下面称为中间人)进行通信时,中间人需要重签远程服务器的SSL证书。为了保证客户端与中间人成功进行SSL握手通信,需要将中间人的根证书(下文检查CA根证书)安装到客户端本地的证书管理中心

  • 进行如下点击

image-20240921140024757

image-20240921140033716

image-20240921140041615

  • 这里可以选用其他方式安装证书

image-20240921140054848

  • 好了之后证书已经安装好了

image-20240921142316653

抓包

  • 如果直接抓包的话所以应用程序的包都会被抓到,这时候就需要过滤一下,才可以方便我们对包进行分析

image-20240921143603407

  • 然后点击加号

image-20240921143624343

  • 添加教程Demo

image-20240921143642822

image-20240921143647910

  • 回到主界面,当右下角出现这个的时候就表明已经开始在抓包了

image-20240921143720048

  • 然后点击Demo的APP,找到第9关,点击进去就会有包发过来,我们就会收到包了

image-20240921143842159

  • 抓到的包如下

image-20240921143944931

  • 点击关闭包

image-20240921144004299

  • 抓包的详细过程如下

image-20240921144046786

  • 还有证书支持的加密算法

image-20240921144156061

  • 还会显示服务器的证书

image-20240921144224317

  • 接下来查看原始报文

image-20240921144257244

  • 接下来查看响应体的原始报文

image-20240921144451483

  • 还有一些响应内容

image-20240921144517988

Flutter逆向

  • 终于到了今天的正题,Flutter逆向了,牢半天还没学知识点

  • 工具:

    • 某读app
    • proxypin:抓包工具
    • blutter:Flutter快照的解析逆向

Flutter简介

Flutter特征

  • 在逆向分析前,我们首先要确定测试目标是否用Flutter开发的。当使用Flutter构建Android APP时,在assets文件夹下会有dexopt和Flutter_assets两个文件夹。(这里以ByteCTF给的题目附件为例子)

image-20240921151443585

  • 在lib文件夹会有俩个so文件:libapp.so和libFlutter.so(flutter动态链接库,与实际业务代码无关),如果我们要修改代码一般都是需要去修改libapp.so

image-20240921151623717

Flutter抓包对抗

  • Flutter难抓包、难反编译,将介绍三种方法来绕过Flutter抓包对抗
  • 先讲难抓包的问题

    • Dart语言标准库的网络请求不走Wi-Fi代理:Flutter使用的是Dart语言,其标准库中的网络请求不会通过代理发送,这与许多其他应用不同。常规的抓包工具通常依赖于代理来捕获网络流量,因此无法捕获Flutter应用的网络请求
    • Dart SDK中的证书信任:Dart SDK在Android平台上强制只信任系统目录下的证书。这意味着Flutter应用不会信任用户安装的证书,除非这些证书位于Android系统的/system/etc/security/cacerts目录中。这是通过Dart源码中的runtime/bin/security_context_linux.cc文件实现的。
  • 这里就使用某读app来做示范,这里我使用Reqable进行抓包,从图中可以看到,使用该应用是可以抓到某读app的包。这是因为之前我们将证书添加到了系统目录下的证书目录中

image-20240921152858322

hook_ssl_client

  • libFlutter.so文件里面搜索ssl_client定位到方法,先将libFlutter.so文件拖入IDA里面,可以看到里面的符号表全部给去除了

image-20240921174239648

  • 现在先打开字符串,搜索ssl_client,在内存中搜刮函数前10字节定位,在运行时将返回函数改为true即可绕过证书链检查,实现抓包(以64为的so为例子,这里用的是ByteCTF的附件)

image-20240921174511700

  • 选中后并点击,就会跳转到相应字符串中,然后还会出现引用该字符串的函数

image-20240921174602035

  • 点击引用该字符串的函数就会跳转到对应函数中去

image-20240921174637851

  • 然后内存搜刮函数前10字节定位

patch

  • 使用reFlutter这个开源项目,将so文件给patch掉

Reqable&proxyPin(推荐)

  • proxyPin这个工具比较强大,可以直接绕过Flutter的证书校验

Flutter反编译

  • 快照:指Flutter应用在编译过程中生成的特定数据结构,用于加速应用的启动和运行。具体来说快照包括四个类型:

    • _kDartVmSnapshotData:代表isolate直接共享的Dart堆的初始状态
    • _kDartVmSnapshotInstructions:包含VM中所有Dart isolate之间共享的通用例程AOT指令。这种快照的体积通常非常小,并且大多会包含程序桩(stub)
    • _kDartIsolateSnapshotData:代表Dart堆的初始状态,并包含isolate专属的信息
    • _kDartIsolateSnapshotInstructions:包含由Dart isolate执行的AOT代码

    其中_kDartIsolateSnapshotInstructions是最为重要的,因为包含了所有需要执行的AOT代码,即业务相关的代码

  • 使用readelf -s命令读取保存快照信息的libapp.so将为输出下面的内容

  • 这边Flutter的逆向方法有两种方式

image-20240921175311103

1
2
3
4
5
6
7
8
9

Symbol table '.dynsym' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000170000 89920 OBJECT GLOBAL DEFAULT 7 _kDartVmSnapshot[...]
2: 0000000000185f40 0x2621a0 OBJECT GLOBAL DEFAULT 7 _kDartIsolateSna[...]
3: 0000000000000200 16032 OBJECT GLOBAL DEFAULT 2 _kDartVmSnapshotData
4: 00000000000040c0 0x163f10 OBJECT GLOBAL DEFAULT 2 _kDartIsolateSna[...]
5: 00000000000001c8 32 OBJECT GLOBAL DEFAULT 1 _kDartSnapshotBuildId

静态分析

  • 使用工具blutterworawit/blutter: Flutter Mobile Application Reverse Engineering Tool (github.com)

  • 解析libapp.so,即写一个解析器,将libapp.so中的快照数据按照其既定格式进行解析,获取业务代码的类的各种信息,包括类的名称、其中方法的偏移等数据,从而辅助逆向工作

  • 先安装blutter所需要的环境
    • Python3.10环境
    • 安装git,版本稍微高一点
    • 下载vs
  • clone项目:
1
git clone https://github.com/worawit/blutter --depth=1

image-20240921180041845

  • 进入到blutter文件夹,cmd窗口运行初始化脚本
1
python .\scripts\init_env_win.py

image-20240921180029979

  • 打开x64 Native Tools Command Prompt,它可以在Visual Studio文件夹中找到

image-20240921180220774

  • 再切换到blutter的路径下,把需要反编译的flutterapp用压缩包打开,提取v8a里的``

动态编译

注意:不同版本的Dart引擎快照格式不同,所以静态的方法就需要频繁跟着版本更新迭代,成本极高,而动态也需要重新编译堆应版本的链接库。同时如果APP作者抹除版本信息和hash信息,则无从下手,且重新打包APK极易被检测到