IDA nb,Frida nb!

0x00.前言

这是第二次在这里提到Frida这个Hook工具了,但是这次的背景却更加简单,只是为了挂签到脚本而已
本文根据时间顺序从前至后回顾编写,章节无比跳跃,大佬轻(rao)喷(ming

第一次前情回顾:Frida 初体验

0x01.Fiddler抓包

HomeAssistant局域网唤醒台式机,远程桌面连进去之后先开启热点让手机连上,然后打开Fiddler(海鲜市场以十五折售出,手里现在没有显卡。。。
但是这个时候自己并不知道这个应用是基于Flutter构建的,自然是有用的api啥都没抓到

假装是 Fiddler
假装是 Fiddler

注:此时安卓的基础抓包环境是没有问题的(狗东和你b的客户端请求都能看到)

点击此处 ← 查看折叠
Move Cert……
Move Cert……
TrustMeAlready
TrustMeAlready

0x02.WireShark抓包

一气之下打开WireShark瞅瞅(请无视客户端为macOS版本

TLSv1.2
TLSv1.2

注:这里WireShark解析的结果,是已经配置过TLS协议的(Pre)-Master-Secret文件

点击此处 ← 查看折叠
.ssl-key.log
.ssl-key.log

但是显然Application Data仍然是加密的,那么有没有方法把这一层再解开呢?答案是肯定的,毕竟已经是Mitm环境了啥证书都能拿到或者伪造(吧)

0x03.Fiddler抓包再放送

参照利用Fiddler和Wireshark解密SSL加密流量,只需对应网站的私钥即可,在Fiddler中需要把证书生成器修改为CertMaker(注:默认选项是另外一个)
于是只好被迫删掉当前证书,然后切换到CertMaker,接下来把证书安装到安卓手机上,此时的自己并不知道一个巨坑已经挖下了
由于K20Pro几个月之前从Android 10升级到了11版本,出于安全性考虑不再能通过直接点击.crt文件来安装证书了

F*ck
F*ck

于是只能按照弹框所提示的方法进行操作了,进入到设置-密码与安全-系统安全,点击高级下的加密与凭据

点击此处 ← 查看折叠
加密与凭据
加密与凭据

网上有说法选择第一个CA证书并忽视报错,但是总感觉类型其实是第二种

点击此处 ← 查看折叠
选择困难症
选择困难症

安装完成之后总得试一下是否生效,结果突然陷入僵局,因为更新完新的Fiddler证书之后狗东和你b的客户端请求都看不到,这是自己没想到的

不太合理
不太合理

折腾了好多次一气之下狠心删掉全部证书,重启,安装证书,再重启也无果,包括上述的第二种选项也尝试了,可就是抓包不能

点击此处 ← 查看折叠
全部木大?
全部木大?
全部木大了
全部木大了

并且其实信任的凭据中已经能看到新证书位于系统中了,而用户证书是空的

点击此处 ← 查看折叠
系统
系统
2021-08-25
2021-08-25
用户
用户

这时候已经接近七点钟天都黑了,还没吃晚饭于是果断停止了思考,不(chi)搞(fan)了

0x04.静态分析

やだよ,静态分析相比(轻车熟路的)分析通信实在是太痛苦了,でも仕方がないです(从来就没有动态分析过.jpG
libarm64-v8a目录下,看到有libflutter.solibapp.so,その通りです,这个应用是基于Flutter构建的

libflutter.so
libflutter.so

这就一下子点明了方向,只需要去查找Flutter应用的抓包方法即可

和善的笑容
和善的笑容

注 ①:其实最开始是直接扔到了JEB里,然后在那里看到是Flutter应用,后来才去解压的apk(当时显然后者更简单2333

点击此处 ← 查看折叠
又有新版本了好评
又有新版本了好评
FlutterApplication
FlutterApplication
开幕雷击,彩蛋草
开幕雷击,彩蛋草

注 ②:额外吐槽下Flutter构建的应用加密是真nblibapp.so啥函数都看不着

点击此处 ← 查看折叠
?

0x05.Charles抓包

因为安卓证书炸了,Fiddler抓包不能,被迫回到macOS生产力平台,打开Charles一顿操作猛如虎,光速配置完成

点击此处 ← 查看折叠
HTTP PROXY
HTTP PROXY
SSL PROXY
SSL PROXY

并且看到了Flutter iOS App https抓包这篇文章,直接暴力替换TCP连接的IP地址有被震惊到,思路清奇开了个反向代理也真是骚操作(Σ(o゚д゚oノ)
这里贴一下修改好的Frida注入脚本

「Talk is cheap. Show your the code」

点击此处 ← 查看折叠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
*
* @creantan
*
* Example usage:
* # frida -U -f com.mrnew.door -l flutter_connect_.js --no-pause
*
*/

var sIP = '47.91.165.221' // 目标 IP 地址
var xIP = '192.168.2.1' // 代理电脑 IP 地址

// IP 字符串转 int
function ipToInt(ip){
var result = ip.split('.');
return (parseInt(result[3]) << 24
| parseInt(result[2]) << 16
| parseInt(result[1]) << 8
| parseInt(result[0]));
}

// int 转 IP 字符串
function parseIp (number) {
var ip = ''
if (number <= 0) {
return ip
}
const ip3 = (number << 0) >>> 24
const ip2 = (number << 8) >>> 24
const ip1 = (number << 16) >>> 24
const ip0 = (number << 24) >>> 24
ip += ip0 + '.' + ip1 + '.' + ip2 + '.' + ip3
return ip
}

function parsePort(number) {
return ((number & 0xFF) << 8) | ((number & 0xFF00) >> 8);
}

Interceptor.attach(Module.findExportByName(null, "connect"), {
onEnter: function(args) {
var fd = args[0].toInt32()
if (Socket.type(fd) !== 'tcp')
return;

var ipAddr = args[1].add(4)
var ip = parseIp(Memory.readU32(ipAddr))
var portAddr = args[1].add(2)
var port = parsePort(Memory.readUShort(portAddr));

// 判断是否为目标地址
if (ip === sIP) {
console.log("[+] connect: " +ip+ ':'+ port);

// 替换 IP 地址为代理主机
Memory.writeU32(ipAddr,ipToInt(xIP))

// 打印替换后地址
console.log(hexdump(ptr(args[1]), {
length: 32,
header: true,
ansi: true
}))
}
}
})

开启反向代理然后Hook,生效了吗?并没有((╯°□°)╯︵┻━┻

Reverse Proxies
Reverse Proxies

注 ①:macOS开启热点不是在网络而是在共享设置里草(差点以为mini不能开热点……

点击此处 ← 查看折叠
互联网共享
互联网共享

注 ②:到现在Magisk里的Frida-Server仍然是用不了的状态,只能手动切换到su用户来运行

点击此处 ← 查看折叠
根本就连不上
根本就连不上
这样才能连上
这样才能连上
确认生效
确认生效

0x05.Flutter抓包

言归正传,参照安卓 flutter app证书绑定校验抓包绕过

内容很长,你忍一忍
内容很长,你忍一忍

macOS上也下了AS,这样就能USB调试了,顺带必需的ADB工具就也有了,点开Logcat,过滤只看flutter,有一个报错出自handshake.cc:354

Logcat
Logcat

因为Flutter是开源的,于是去gh找一下对应的位置,请无视行号因为版本不一致,但是函数是对的

handshake.cc
handshake.cc

根据大佬的文章,更好的Hook位置在ssl_crypto_x509_session_verify_cert_chain()

ssl_x509.cc
ssl_x509.cc

打开IDA,把libflutter.so拽进去,稍等片刻等分析得差不多了的时候再开始

  1. 搜索字符串ssl_server

    ssl_server
    ssl_server
  2. 双击跳到字符串定义

    IDA View-A
    IDA View-A
  3. 反查交叉引用,得到偏移量5873D4

    好在也只有一个
    好在也只有一个
    点错(x)
    点错(x)
  4. 光速Hook

しかし,Hook之后应用确实可以正常访问网络了,但是抓包的结果却是空白,此时已是半夜三点多了,无奈只能关电脑睡觉了

注:不分析完得到的地址是不正确的草,又多走弯路了

点击此处 ← 查看折叠
0x3C925A
0x3C925A
0x3C91EC
0x3C91EC

0x06.引用

本文表情包出自:震惊!耗时还能这么优化??
MacOS 下 Wireshark 抓取 Chrome HTTPS
安卓11安装Burp证书
移动应用安全基础篇:APP抓包姿势总结

未完待续……