OpenSSL :https://slproweb.com/products/Win32OpenSSL.html

1、安装为系统证书好处

  • (1)安装用户证书必须要设置开机密码,而且设置后就不能取消,除非先删掉所有的用户证书。如果安装为系统证书就不需要设置开机密码,自动化操作时更方便。
  • (2)谷歌在 安卓7.0 修改了安全策略,安卓系统 大于 7.0 时 APP默认不信任用户证书,只信任系统证书,安装为用户证书,对APP的HTTPS抓包会失败。安装为全局证书才能被所有APP信任,方可进行HTTPS抓包。

解决方法

  • 降级 APP
  • 降级 系统版本
  • 将用户证书偷渡成系统证书,需要有 root 权限。将 charles 的 CA 证书安装进系统信任的证书目录下,这样在开启 charles 代理的时候,系统就会认为CA证书安全,从而可以获取 https 数据。

2、将证书安装为安卓系统证书

怎么将 Fiddler 或 Mitmproxy 的证书安装为安卓系统证书呢?

Android 的系统证书的存储位置是 /system/etc/security/cacerts,证书文件必须是PEM格式,而且文件命名必须符合系统证书规范。

第1步:下载Fiddler或Mitmproxy的证书文件,PEM或者DER格式均可。  
第2步:获取有效的系统证书文件名 
        # 如果是PEM格式的:  
        openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem -noout  
        # 如果是DER格式的:  
        openssl x509 -inform der -subject_hash_old -in FiddlerRoot.cer  -noout  
        # 例如,输出8bbe0e8d  
第3步:转换证书格式为PEM格式,并重命名证书为有效的系统证书名。  
        # 如果是PEM格式的:  
        openssl x509 -inform PEM -in mitmproxy-ca-cert.pem -out 8bbe0e8d.0  
        # 如果是DER格式的:  
        openssl x509 -inform der -in FiddlerRoot.cer -out 8bbe0e8d.0  
  
第4步:上传准备好的证书文件到设备。例如:adb push 8bbe0e8d.0 /sdcard/  

第5步:复制证书到Android系统证书目录

adb shell  
         su   
         mount -o rw,remount /system   
         cp /sdcard/8bbe0e8d.0 /system/etc/security/cacerts  
         chmod 644 /system/etc/security/cacerts/8bbe0e8d.0  
         # 上述可整合为一句  
         adb shell "su -c 'mount -o rw,remount /system;cp /sdcard/8bbe0e8d.0 /system/etc/security/cacerts;chmod 644 /system/etc/security/cacerts/8bbe0e8d.0;'"  
         # 重启设备  
         adb reboot

Fiddler 证书安装到安卓根目录

一台已 root 过的手机,开启开发者选项,然后连接电脑。

安卓系统证书跟 Fiddler 证书的格式不一样,需要转换。

1、安装 OPENSSL【https://slproweb.com/products/Win32OpenSSL.html】。linux 默认已经安装。如果使用 linux 系统,可以忽略这一步。

2、下载 fiddler 证书到电脑上

3、打开命令窗口,执行以下命令,查看证书哈希信息:

        openssl x509 -inform der -subject_hash_old -in FiddlerRoot.cer
        openssl x509 -inform der -subject_hash_old -in FiddlerRoot.cer -noout

android根证书 安卓根证书位置_android

安卓系统的安全证书在 /system/etc/security/cacerts/ 目录下,进入adb shell,打开目录就能看到这些证书文件。

android根证书 安卓根证书位置_重启_02

文件名是 Hash值 加 数字后缀。后缀名的数字是为了防止文件名冲突的,比如如果两个证书算出的Hash值是一样的话,那么一个证书的后缀名数字可以设置成0,而另一个证书的后缀名数字可以设置成1

4、转换证书

openssl x509 -inform DER -in FiddlerRoot.cer -text > [哈希].0

5、用记事本编辑证书

-----BEGIN CERTIFICATE----------END CERTIFICATE-----

可以使用 cat 命令随便查看一个 证书文件,就可以看到都是放在文件的最前面

android根证书 安卓根证书位置_fiddler_03

6、将证书放到手机的 /system/etc/security/cacerts/ 下

执行 adb 命令连接手机,获取权限,把文件夹挂载为读写模式,把文件复制到证书根目录

adb root
adb remount
adb shell mount -o rw,remount /system
adb push e5742ab9.0 /system/etc/security/cacerts

重启手机,可以看到 Fiddler 的证书已经变成系统证书了,接下来就可以愉快的抓包了

android根证书 安卓根证书位置_android根证书_04

Charles 证书安装到安卓根目录

一台已 root 过的手机,开启开发者选项,然后连接电脑。

下载证书到电脑上

  • 电脑端浏览器输入 /ssl 即可下载,
  • 如果未下载也可以在 charles >> help >> SSL Proxying >>Save Charles Root Certificate 保存证书到本地文件夹

查看证书信息:

openssl x509 -subject_hash_old -in charles.pem
openssl x509 -inform PEM -subject_hash_old -in charles.pem -noout

android根证书 安卓根证书位置_重启_05

重命名证书:mv charles.pem 5a3b138a.0

执行 adb 命令连接手机,获取权限,把文件夹挂载为读写模式,把文件复制到证书根目录

adb root
adb remount
adb shell mount -o rw,remount /system
adb push e5742ab9.0 /system/etc/security/cacerts

以上就 OK 了。如果不放心可以 cd 到对应目录,检查文件是否存在,文件权限是否与其他证书一致。证书安装 OK,其他代理选项正常配置即可

如果出现 <hash>.0:Read-only file system 这个警告,这是因为 system 文件为只读,需要将其挂载为可读写。一般的解决方法是:mount -o rw,remount /system

adb root
adb disable-verity
adb reboot #手机会重启,不用关闭cmd窗口,手机可能需要拔掉数据写重新连接
adb root
adb shell 
mount -o rw,remount /system    #再次进行修改

然后就可以进行复制操作了。复制完之后输入reboot 重启

重启之后,打开设置 ---> 更多设置 ---> 系统安全 ---> 信任的凭据中可以看到安装的证书

android根证书 安卓根证书位置_fiddler_06

Charles工具配置

首先是 proxy - proxy settings,选择 socks proxy 模式,如图配置,点击ok完毕

android根证书 安卓根证书位置_微信_07

取消勾选 windows proxy,因为我们不需要用来抓取windows的数据包。

android根证书 安卓根证书位置_fiddler_08

然后是 proxy-ssl proxy settings

android根证书 安卓根证书位置_android_09

点 add,host、port 都填 * 即可。

android根证书 安卓根证书位置_微信_10

设置完成后,就可以通过 charles 代理查看到 https 的数据了。 

Burpsuite 导入 Charles 的证书

打开 charles - help - ssl proxying

android根证书 安卓根证书位置_微信_11

输入密码,导出证书,得到一个.p12的文件

往 burp 中导入

android根证书 安卓根证书位置_重启_12

选择文件,输入密码,导入成功

联合 burp

因为charles抓包能力强但是不好做修改数据包之类的操作,所以我们就再做一层代理到burp来方便我们渗透测试人员。

proxy - external proxy settings

android根证书 安卓根证书位置_微信_13

android根证书 安卓根证书位置_android根证书_14

记得两个选项都要配置127.0.0.1:8080,因为我们的burp就是默认监听8080端口的,若不是8080,改成自己burp上监听的端口就可以了。

android根证书 安卓根证书位置_fiddler_15

测试结果