0%

逆向学习 0x02frida环境配置和抓包工具

抓包工具

抓包就是在客户端和服务端之间,再加上一个代理服务器,这个代理服务器可以拦截发送的数据包,对数据包进行查看、操作、放行

抓包工具的分类

工具 工具
全局抓包工具 ==Http v7==、Http debugger pro
代理抓包工具 ==Charles==、Fiddler
VPN抓包工具 ==HttpCanary==
网卡抓包工具 ==WireShark==
手机抓包工具 tcpdump
Hook抓包工具 ==r0Capture==

Charles

下载安装激活

Charles免费激活:https://zzzmode.com/mytools/charles/

image-20240921194140576

抓包手机

Charles如何抓包手机呢,Charles安装在电脑上,抓包手机就相当于抓包另一台电脑,需要一些配置

设置一个端口,找到IP地址

将SOCKS代理打开

image-20240921194239724

IP地址

image-20240922113129896

使用VPN软件链接主机的IP的指定端口,将IP地址和端口配置给SocksDroid然后打开,成功之后会有一个VPN样式

image-20240922113345398

还可以更改模拟器WiFi的IP地址和端口,手动更改WiFi的代理服务器主机和端口,让主机Charles监听的端口作为代理端口,这个时候就不能使用SOCKS协议端口了,需要配置http端口

image-20240922120529680

关闭对Windows电脑的抓包

image-20240922113521041

现在不能抓到https,所以还需要一些配置

image-20240922130034633

打开 Proxy -> SSL Proxying Setting

为了方便可以给第一个配置两个*。Exclude是设置排除的不用管

image-20240922130628823

image-20240922122453735

在模拟器中访问:http://chls.pro/ssl

image-20240922122836182

证书不安全问题

一般来说这就已经成功了,但我测试的时候没有数据,而且还提示证书不安全

因为在安卓7之后系统只信任系统证书,需要把用户证书移动到系统证书目录

image-20240922111754491

这些解析的https数据也是错误

image-20240922143043094

这个时候需要找到证书的目录了,将安装的证书,放到受信任证书的目录下

模拟器就设置可以写入和开启root

如果是真机的话就需要Magisk中的模块来移动证书了,没有真机不做演示了

image-20240922143225653

找到 /data/misc/user/0/cacerts-added 这个目录,如果安装了证书这里会有一共 .0 文件,将这个文件移动/复制到 /system/etc/security/cacerts 目录下

这个名字是根据哈希计算的,后面加 .0 如果是哈希值存在一样的就是 .0 .1

image-20240923083755266

image-20240922143507596

现在再进行抓包即可获取到解密后的数据

image-20240922143600370

如此如此这般这般,Charles抓包手机就完成了

HttpCanary

这是一个VPN抓包工具相当于上面Charles和socksdroid的组合,而且他比Charles和socksdroid的组合好用,抓包更多,解析更多

HttpCanary可以按照引导直接将证书移动到安全目录下,如果不能移动的话,参考上方的方法

配置完成就可以使用了

image-20240923084831676

r0capture

一个Hook抓包脚本,主要原理就是Hook了一些SSL相关的系统函数,直接抓取系统发送的一些明文数据

这个东西是开源的,可以抓取大部分按照框架写的app,如果有魔改的就需要有一定的逆向能力了

GitHup地址:https://github.com/r0ysue/r0capture

配置hook
下载frida

因为r0capture是一个python脚本,需要python3.6以上的环境,下载几个python库

1
2
3
pip install frida-tools
pip install loguru click
pip install hexdump

配置好本地Frida之后,查看frida版本,查看手机cpu类型

1
2
3
4
frida --version

adb shell
getprop ro.product.cpu.abi

image-20241007204055440

配置frida-server

去下载对应版本的对应类型的frida-server

https://github.com/frida/frida/releases

下载对应版本下载到手机的 /data/local/tmp/ 目录下

1
2
3
4
5
6
7
8
进入手机端命令:adb shell
切换获取手机的root权限:Su
查找文件是否在手机中:cd/data/local/tmp/
查看路径下的文件并看文件的权限:Is-l
拥有root权限更改文件的权限为777: chmod 777 frida-server-16.5.2-android-x86
在手机中启动运行该文件:./frida-server-14.0.5-android-x86 &
电脑运行检查手机端服务是否开启成功:frida-ps-U
windows运行端口转发到PC:adbforward tcp:27043 tcp:27043

执行 frida-ps-U 成功效果如下

image-20241007212139483

执行上方语法出现一下情况

image-20241007212238664

attach模式是选择app在你感兴趣的地方开始抓包。

apawn模式是系统开始抓包,从打开app开始

使用r0capture抓取的是明文内容,因此并不需要证书

END

使用方式

r0capture有两种使用方式

1
2
3
4
5
6
7
8
9
10
attach模式,抓包内容可以保存为pacp文件供后续分析
python r0capture.py -U com.qiyi.video -v -p iqiyi.pcap


apawn模式
python r0capture.py -U -f com.qiyi.video -v -p iqiyi.pcap


-p:保存为pacp文件
-f:frida启动这个apk开始抓包

抓包原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1、为什么Charles要配合socksdroid使用
VPN的开关比设置手动代理更加方便
有些app不走HTTP代理,有些机型http代理不生效(雷电4),VPN代理是可以让所有的流量强制走VPN
能抓到更全的流量(TCP UDP)
OSI七层模型:IP协议、UDP协议、TCP协议、SSL协议、HTTP协议

2、对称加密算法:
典型:AES
特点:
加密解密都是用一个密钥
加密速度快,可以加密大量数据

3、RSA算法(非对称加密算法)
特点:
加密和解密使用不同的密钥
有一个密钥对 公钥 私钥————公钥加密只能私钥解密,私钥加密只能公钥解密
从公钥无法推导出私钥
加密速度慢,加密数据有限——————1024公钥,在pkcslpadding 加密117个字节,在nopadding 加密128个字节

如此涉及到了一个应用,RSA算法加密数据有限,可以在本地随机生成一个对称加密的密钥A,然后使用RSA算法加密A,得到密文B,密文B提交给服务器,服务器使用私钥解密,得到了明文A,在后续的通讯过程中使用明文A来进行对称解密
image-20241008090108833

访问一个链接之后就会返回一个证书,包含RSA的公钥

image-20241008085839408

这个时候在加上抓包工具的代理服务端考虑一下

未安装证书之前也能够抓包,但是是加密后的数据,这样一看是不是可以理解一些了

代理服务端,作为客户端和服务端的中间人,这个中间人要获取抓包数据的话需要先安装一个证书。

先伪造一个公钥发送给客户端,客户端将加密后的对称密钥返回给代理抓包服务端,这个服务端获取到密钥之后,就可以读取到后续客户端和服务端之间的通讯

浏览器是不能辨别真实的服务端和代理服务端的

但是之前配置证书时,还需要信任证书,提示不安全什么的。

浏览器检验的是证书路径/证书链

最后找到这个根证书,就是自己给自己颁发的一个证书。那么为什么这个证书安全呢

image-20241008092716033

就是因为在受信任的根证书颁发机构下,如果这个系统库有的证书,浏览器就认为是安全的,就不会有提示

image-20241008110949000

但是呢,如果APP端和服务端是同一个团队开发的,开发过程中一般会设置双向验证来验证证书

为什么不直接替换证书信息呢

这个就涉及到证书的签名信息了

数字证书包含信息:使用者、颁发者、有效期、公钥、指纹、==签名信息==

用户发送信息的时候会使用数字签名算法 如:md5withrsa、sha1withrsa、sha256withrsa ,在是把两个算法组合在一起

1
2
使用:
String signStr = Signature_.getSignature("hello world")

image-20241008113055431

在服务端的视角上,因为服务端签发的证书嘛。

这个会输出一个值,这个值是字符串先进行sha256的一个加密,然后进行的RSA私钥加密。发送数据的时候发送的是明文+数字签名加密后的数据。如果更改了明文,使用公钥解密后,在对明文sha256比对结果,会比对失败。

因此,证书是不能够伪造的,不能改变,否则sha256的值也变,校验就会失败,无法正常通信

这个的重点在于,RSA的加密签名信息无法更改,这就断绝了更改证书的可行性,除非你能拿到服务端的私钥

image-20241008114414345

HTTP协议

常规协议头

协议头有请求头和响应头两种

协议头包含起始行、首部字段、包体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//访问方式资源路径和GET参数 协议/版本号
GET /v2/getpublickey?x=100&y=200 HTTP/1.1
//主机名
Host: passport.xxxxx.com
//浏览器接受数据类型
Accept: */*
//表示长连接
Connection: keep-alive
//浏览器接受的语言
Accept-Language: zh-CN, zh; q=0.8,en-US; q=0.5,en; q=0.3
//浏览器支持的编码,一般附加协议头的时候删掉
Accept-Encoding: gzip, deflate, br
//用户代理,服务器可以根据这个来识别是哪个浏览器
User-Agent: Mozilla/5.0 (Windows NT 6.1; w0W64; rv:48.0) Gecko/20100101 Firefox/48.0
//来路,GET和POST中都会出现,表示这个请求是从哪个页面发出的,可能会有会变化的值要特别注意
Referer: https://www. xxxxx. com/?user=123456&pwd=1212121
// cookie在安卓端很少见,表示身份信息的在get或者post请求内
Cookie:XXXXXID=4A89DBBC382B25D9A43D12C4AB0151FD:FG=1

GET /v2/getpublickey?x=100&y=200 HTTP/1.1 :就是起始行包含了一个GET传参方式和HTTP协议以及版本号,中间的资源路径是相对路径,要和下方的Host拼接成完整的路径

Accept: */* :如果是 */* 表示所有的数据都能接收

Accept-Language :这个包含的q值越大表示比重越大

User-Agent: Mozilla/5.0 (Windows NT 6.1; w0W64; rv:48.0) Gecko/20100101 Firefox/48.0 :以下的表示为浏览器的返回,和apk返回不太一样,如果apk返回了这样的代理可能是app是个H5app,内置了html页面。这也是一个判断小技巧

上面是GET,POST比GET多几个东西

1
2
3
4
5
6
//提交的数据包的长度不能多也不能少一个字节winhttp自动生成可以不附加
Content-Length: 22
//提交数据的类型
Content-Type: application/x-www-form-ur lencoded; charset=UTF-8
//POST提交的数据和协议头之间有一个空行
user=123456&pwd=654321
自定义协议头

这里的sign、t、qyid都是自定义的协议头,如果要更改的话,不要更改他的位置。有些网站会在协议头里传递重要数据,并且一般是会变化的。如果网站监测,就要找到来源,附加协议头提交

image-20241008144745638

这个简单了解一下进行,因为安卓中cookie使用不多。了解即可,最后没办法再考虑这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1、cookie的分类
服务器返回 Set-cookie
本地代码生成

2、cookie的作用
识别身份(验证码)
判断是否登录状态

3、cookie的结构
名1=值1; 名2=值2; 名3=值3

4、合并更新步骤
a、新cookie,去除无效cookie
b、在新cookie里,寻找是否存在旧cookie的名字,存在就用新的,丢掉旧的
c、两cookie组合到一个文本型变量中

5、前端会用JS生成很多cookie,但是并非所有cookie都会检测
比如Hm_lvt开头的一般没啥用