本期内容所需要的工具:
-
Reqable(Reqable)
-
JADX(反编译工具)[Releases · skylot/jadx (github.com)]
-
r0capture(无视证书抓包)[r0ysue/r0capture: 安卓应用层抓包通杀脚本 (github.com)]
-
Wireshark(鲨鱼鳍,分析抓包内容)[Wireshark ·下载]
-
FrIDA(HOOK代码,frida-server或者frida-gadget)
-
滴滴车主app(已去签)[https://pan.baidu.com/s/1EBjFglZnjqyP4IiQ4yXGzQ?pwd=1111]
安卓手机一部(小米,vivo,oppo,华为,模拟器都可以[如用到frida-server就需root])
以上工具需要自己安装,安装工具的教程我就不赘述了,网上有,如有不懂安装联系UP
教程内容:解决app中有ssl证书验证,绕过并且抓取请求内容,并用frida修改抓取的内容实现修改定位
问题1:该要抓包首先要解决的是单向证书问题,如果用Reqable直接是无法抓取到内容的
解决方法:用算法助手的justTrustMe 过掉单证书验证(老生常谈)
步骤1:在电脑上打开Reqable(pc),手机上也打开Reqable(根证书自行安装),将抓包内容跟pc端同步
打开滴滴车主以进行抓包
打开抓包发现,软件显示掉线了,并且也无法抓取到Host: 139.199.240.14:25641的内容,因为滴滴在这里开启了SSL验证(双向证书),单向验证通过justTrustMe的就能正常抓取到内容.
例如 抖音,快手等大厂都会采取这样的双向证书验证,那行现在已经知道了问题的关键,那么就找到办法解决关键问题
解决办法: 打开r0capture,在r0capture的目录下,输入cmd,开启终端(用r0capture来抓取内容)
注意:r0capture需要开启frida-server或者frida-gadget来配合,牢友们都懂(逆向第一步就是先开frida,开启教程自行搜索)
r0capture需要的库自己pip安装,以避免无法使用的问题
输入 python r0capture.py -U 滴滴车主 -v -p iqiyi.pcap
如果电脑有个多个python环境,也可以 "D:UsersAdministratorminiconda3python.exe" r0capture.py -U 滴滴车主 -v -p iqiyi.pcap 指定python版本
r0capture已经成功抓取到网络数据,并且他会在r0capture文件的目录下生成日志和iqiyi.pcap(需要用鲨鱼鳍分析)
现在停止抓包,让我们来分析下抓取内容
打开r0capture文件的目录下生成日志 滴滴车主-1728542776.log 和 iqiyi.pcap(用Wireshark打开-拖进来)
从上面Reqable无法抓取到Host: 139.199.240.14:25641内容,因为加了ssl验证
我们可以在鲨鱼鳍里面找得到
打开日志 搜索 139.199.240.14 这个ip地址,因为我们知道是向这个地址请求
从日志中,我们可以看到 他向 host":"d-push.udache.com" 这个连接发起请求,还能很清晰看到请求时经过的代码
我们可以在鲨鱼鳍里面搜索host":"d-push.udache.com" ,或者搜索 139.199.240.14 这个ip 都可以
让我们打开找到的内容 来 一一进行分析
打开发现 其实并没有重要的数据,主要原因是如下几点:
1. 眼尖的牢友应该发现在 日志中 该请求最后经过加密
at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(Native Method)
这个是安卓原生库,主要就是用来加密 SSL请求的
很多软件 都用这个库来对自己的app来加密
2.主要是用来验证 证书是不是匹配上了,所有请求体内 就没什么数据内容
那么,我们就通过这个 com.android.org.conscrypt.ConscryptFileDescriptorSocket
来找到证书位置
首先他是一个安卓的原生库,所有一般 就不可能会魔改或者改变库名称
那很简单,其实反问一下gpt 它也能告诉你,哪个位置是读取证书
如果能读取证书,那为什么r0capture并没有导出证书出来呢
翻下r0capture的源代码就发现,作者只是在java层读取证书
如果软件调用com.android.org.conscrypt.ConscryptFileDescriptorSocket
走的是native层,那肯定是hook不到证书的
在滴滴车主-1728542776.log日志中也清楚的写到
at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(Native Method)
(Native Method)
(Native Method)
(Native Method)
所以为什么,有些app r0capture可以吐出证书,有些不行
ok 我们开始使用hook大法
Java.perform(
function
(
)
{
var
ConscryptSocket = Java.use(
"com.android.org.conscrypt.ConscryptFileDescriptorSocket"
);
var
methods = ConscryptSocket.class.getDeclaredMethods();
methods.forEach(
function
(
method
)
{
console
.log(
"Method: "
+ method);
});
ConscryptSocket.verifyCertificateChain.overload(
'[[B'
,
'java.lang.String'
).implementation =
function
(
certChain, authType
)
{
var
x509tm =
this
.sslParameters.value.getX509TrustManager();
if
(x509tm) {
console
.log(
" X509TrustManager obtained"
);
// 获取受信任的证书
var
acceptedIssuers = x509tm.getAcceptedIssuers();
for
(
var
i =
0
; i < acceptedIssuers.length; i++) {
var
cert = acceptedIssuers[i];
console
.log(
"Certificate "
+ i +
": "
+ cert.toString());
}
}
else
{
console
.log(
"[!] X509TrustManager not found"
);
}
// 调用原始方法
var
result =
this
.verifyCertificateChain(certChain, authType);
console
.log(
" verifyCertificateChain result: "
+ result);
return
result;
};
});
主要是hook (verifyCertificateChain)这个方法
查看com.android.org.conscrypt.ConscryptFileDescriptorSocket的源代码
源码(https://github.com/google/conscrypt/blob/master/common/src/main/java/org/conscrypt/ConscryptFileDescriptorSocket.java)[不重要,爱看不看都可以]
就知道 这个函数是验证证书,所以通杀所有用到conscrypt
·
原文始发于微信公众号(逆向有你):安卓逆向 -- 某SSL双向证书无法抓包
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论