Anekys 发表于 2022-8-23 13:21

Android不信任证书导致无法抓包的解决办法

本帖最后由 Anekys 于 2022-8-23 13:27 编辑

# 前言

众所周知,Android7.0以后系统不在信任用户的证书.这一改动使得我们在抓包的时候产生了诸多不便。在Android端很多人的做法是先刷入Magsik在通过Magsik模块的方式来将抓包证书修改成系统证书。
比较出名的就是大名鼎鼎的HttpCanary(小黄鸟),只是它虽然抓包方便,调试起来却没有Fiddler Charles等抓包工具方便。
接下来,我将介绍几种方法能让你像装了Magsik模块的小黄鸟一样方便的抓包,并且方便的调试,希望能对你有所帮助。

## 1.懒人专用法

Android系统对证书的不信任是从高版本开始的,那==直接用低版本的Android系统==即可完美解决这一问题。如果你手头没有低版本的安卓真机进行调试,可以尝试用PC端的Android模拟器来解决。诸如夜神(Nox),MuMu等等,绝大多数的模拟器都提供了Android5.0版本等低Android版本的系统。
在使用这些低版本的系统进行抓包时,除了APP使用上可能不如高版本流畅,在抓包这一方面效率绝对是相当的不错。
*注意 --> 某些APP由于不支持32位可能无法运行。*

## 2.逆向破解法
此法虽然名字高大上,实际上比较针对于自己写APP进行调试时使用。不过对于一些冷门的小软件或者是没那么注重安全的开发者所作出的产品来说,可能会有奇效。

⑴. ==让apk的targetSDKVersion <= 23== 即可解决. 碰到做了反编译等保护的很难实现
⑵. ==在res/xml目录下添加network_security_config.xml文件,并在application下设置好如下属性:
`android:networkSecurityConfig="@xml/network_security_config" `
*xml文件模板:*
```kotlin
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 设置允许http明文传输-->
    <base-config cleartextTrafficPermitted="true">
      <trust-anchors>
            <!-- 设置信任系统级别证书-->
            <certificates src="system" />
            <!-- 设置信任用户自定义证书-->
            <certificates src="user" />
      </trust-anchors>
    </base-config>
</network-security-config>
```
## 3.移动证书法
本文的重点方法,通过==将证书移动至系统证书目录==,来解决不信任证书造成的无法抓包问题。

### (1). 导出证书
这里根据你的抓包工具来自行导出,但是你需要注意的是,现阶段的Android有效时间超过两年的证书。所以你导出的来的证书最好有效期不要超过这个时长,以避免不必要的麻烦。
此处以Fiddler为例,我们使用Fiddler的证书[制作工具](https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/fiddlercertmaker.exe)来导出一个证书。

![在这里插入图片描述](https://img-blog.csdnimg.cn/f308963df3404e3a952bf957950d0c3e.jpeg)
### (2).转换证书格式
使用(http://slproweb.com/products/Win32OpenSSL.html)对cer证书进行格式转换,变为pem格式

```powershell
openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem
```
*注意自己替换证书路径*

在转换成pem格式后查看证书的hash值

```powershell
openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem
```
如图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/4b32e1ce90654eafbf1147bb5d7484b6.jpeg)
记住图中圈出来的hash值,这个hash值就是最后转换出来的文件的文件名。
此时我们直接将转换好的pem证书进行重命名即可,如果你想用命令的话,Windows下可以用ren命令

```powershell
ren FiddlerRoot.pem e5c3944b.0
```
如果你在Linux操作或者Android中使用终端模拟器的话就用mv命令
最后你将获得一个e5c3944b.0文件
### (3).推送证书
将转换好的证书推送到Android的***/system/etc/security*** 目录下并赋予文件可读权限即可,这个目录就是系统证书的目录。

####**推送方法1**:使用adb进行推送
首先Android端打开adb调试,这里我是用的网络调试,也可以自己接线,如果是模拟器的话,也可以用模拟器的办法连接模拟器的adb。
![在这里插入图片描述](https://img-blog.csdnimg.cn/16162981fc91452f92840455f1488063.jpeg)

PC端使用adb命令连接设备
> 首先与设备进行配对
>**adb pair 192.168.2.43:41053**
> 随后连接设备
> **adb connect 192.168.2.43:37877**
> 最后进入shell环境
> **adb shell**

![在这里插入图片描述](https://img-blog.csdnimg.cn/6e0021208d024a13bfffa42fce7abd79.jpeg)
*注意上面连接设备时输入的ip和端口,是与设备截图中一一对应的。*

连接好设备后,来到目标目录

```powershell
cd /system/etc/security
```
注意这里的目录权限,是`755`
![在这里插入图片描述](https://img-blog.csdnimg.cn/6f8f7b15b0804e01ac92fb4c8b009e51.png)
而我们想要往目录中存放文件需要写的权限,此处采用adb临时赋予`777`权限
```powershell
chmod 777 cacerts
```
这里可能会失败,由于我是真机且已经获取了root,所以直接`su`获取权限给目录加上了777
如果你是带root的模拟器,一般不需要专门su获取权限
![在这里插入图片描述](https://img-blog.csdnimg.cn/4435c08f21914ff0b50e2a1ecd53308a.png)
如果碰到==提示Read-only file system==,可以使用`mount -o remount,rw /system`,将系统文件夹挂载为可读写。然后再用chmod赋予777权限。
![在这里插入图片描述](https://img-blog.csdnimg.cn/a170e28b47c0410eae1f4c3d93e40a14.png)
修改好权限后,输入`exit`退出shell(如果你su了需要两次exit才能退出)。再用adb命令来推送证书文件
```powershell
adb push E:\Desktop\e5c3944b.0 /system/etc/security/cacerts
```
*这里的证书文件目录记得自己替换*

----
如果你是模拟器的话,经过上边的操作应该已经推送成功了,不过我这里是真机所以无法直接推送到/system下,所以我这里稍微绕一下,先推送到手机内存中,然后再进入shell转移到cacerts目录下
```Shell
adb push E:\Desktop\e5c3944b.0 /sdcard/
su
mv /sdcard/e5c3944b.0 /system/etc/security/cacerts
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/df6f2081e6d147aa890031966921e692.png)
这里还要检查下你把文件推送过去,一定要给读的权限,不然在已信任的证书中是看不到这个证书的
```Shell
chmod 666 e5c3944b.0
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/d95634062ebf46b2979a9272d3971b2b.jpeg#pic_center)


同样是真机的话记得推送完文件以后把目录的权限改回755
![在这里插入图片描述](https://img-blog.csdnimg.cn/6cb5db6638f146e6ab97cf13577a4e4c.png)
#### **推送方法2:Root权限直接转移**
既然你已经有了root权限,完全可以通过软件直接在Android端直接进行转移
![在这里插入图片描述](https://img-blog.csdnimg.cn/959e243da00744dca2bd62e0f0d311f2.jpeg#pic_center)
图示为使用MT管理器直接将证书移动到系统证书目录中

#### **总结:**
***不管你用什么办法,只要把证书文件移动到`/system/etc/security/cacerts`这个目录下,并赋予证书文件可读的权限即可.***

## 4.全局代{过}{滤}理法
这个办法我并没有试验过,不过据说雷电模拟器是可行的
```powershell
adb shell settings put global http_proxy <代{过}{滤}理ip>:<代{过}{滤}理端口>
```

Anekys 发表于 2022-8-24 19:08

aq4716411 发表于 2022-8-24 18:25
电脑抓模拟器很好使啊,就是有一些app检测有代{过}{滤}理就抓不到这种一般怎么处理啊?

JustTrustMe,TrustMeAlready,SSLunpinning 总有一款模块适合你
如果都不适合,可以尝试逆向APP了

yuqic987 发表于 2022-8-24 11:19

Anekys 发表于 2022-8-24 11:15
这种情况不好说具体是因为什么,可能是apk有签名校验亦或者有其他防护经过测试,加了这个后才闪退的,哎估计我的是不行
application下设置好如下属性:
android:networkSecurityConfig="@xml/network_security_config

Galaxyou 发表于 2022-8-23 13:28

等一下试试,为了抓包特意弄了个安卓6的机子

xx520bing 发表于 2022-8-23 13:32

码了,待会试试

SN1t2lO 发表于 2022-8-23 13:44

好帖收藏了,为了调试专门倒腾虚拟机,太费劲了

十好小学生 发表于 2022-8-23 13:44

之前抓包的时候遇到过   但现在不需要抓   
收藏一下

yyxmm 发表于 2022-8-23 14:08

收藏,感谢大佬

眷恋 发表于 2022-8-23 14:26

不错的分享,想抓包还是用虚拟机还是root吧

kof8855 发表于 2022-8-23 14:53

楼主你试试抓中国电信营业厅app

yk95918 发表于 2022-8-23 14:58

收藏了,感谢大佬。

a446489393 发表于 2022-8-23 15:12

中文版的有吗,fiddler
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: Android不信任证书导致无法抓包的解决办法