作者:千山万水迷了鹿
链接:https://www.jianshu.com/p/3b4cd6fdd8a9
来源:简书

一、本文侧重点在哪?

  1. https 的客户端和服务器端的请求流程,加了Charles之后对请求有什么影响(中间人攻击)
  2. 我们原来怎么抓https包的
  3. Android 7.0 (api 24 ) 和 targetSdkVersion 对抓包的影响
    开发者对自己app的抓包,
    逆向工程师对别人app的抓包
  4. 有 CA 签名的证书访问https的app和自签名证书app
    微博和我们自己的app
  5. 设置 VirtualApp 为debug模式,并且设置VA 的targetSdkVersion <24

二、测试环境

  • Android EVA-AL00 7.0 API 24 华为,安装了Charles根证书,并且设置了代理
  • Android EVA-AL00 6.0 API 23 华为,安装了Charles根证书,并且设置了代理
  • 微博客户端,微博热搜榜接口,这个接口当时是用oppo测试机抓的不用关心里面的参数,能用就行
  • 网络请求框架 okhttp3

三、https 通信过程和中间人攻击

下图是https 客户端和服务器端通信的基本流程

https 通信过程.png

那么如何抓包呢,原理其实说起来也很简单,就是在客户端给服务器端发消息的时候,中间人(Charles)截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。

其实Charles就是这么做的,当配置了Charles之后,理论上所有的http/https请求数据都被拦截到了。看下面一张简化的中间人抓包的图:

中间人抓包图.png

四、我们原来怎么抓https包的

分为三步

  1. 手机上导入Charles根证书,导入方式见Charles官网

    Charles导入根证书到Android设备上.png

  2. 电脑端Charles设置https抓包配置
    菜单栏 Proxy -->ProxySetting

    电脑端Charles设置.png

  3. 手机端配置代理

    手机端配置代理.png

理论上来说按照上面的配置,配置之后,然后手机上安装新浪微博客户端之后就能抓到微博的数据了。我们分别用Android6.0 和 Android7.0 的手机打开微博客户端看下效果:

发现在6.x系统上,微博打开正常,并且Charles显示列出了已经抓到的微博的接口api。

但是在Android 7.x操作系统上,微博显示网络出错啦,请点击按钮重新加载如下图:

Android 7.X系统微博抓包失败

而且Charles上显示确实抓到了包,但是报错You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.,Charles说手机端没有信任Charles的根证书,但是我们手机上已经安装了Charles根证书了,为什么会这样?

原来在Android 7.0(API 24 ) ,有一个名为“Network Security Configuration”的新安全功能。这个新功能的目标是允许开发人员在不修改应用程序代码的情况下自定义他们的网络安全设置。如果应用程序运行的系统版本高于或等于24,并且targetSdkVersion>=24,则只有系统(system)证书才会被信任。所以用户(user)导入的Charles根证书是不被信任的。具体说明看官方文档在这个官方文档里面说了,如何能指定信任用户安装的根证书从而可以实现抓包。

五、Android 7.0 (api 24 ) 和 targetSdkVersion 对抓包的影响

这里要分两种情况:

  • 抓自己开发的app的网络包
  • 抓第三方app的网络包,比如微博客户端

这两种情况有什么区别的,第一种app是我们自己开发的,我们手里有源码,能够修改,能够做到像官方文档里面说的一样进行配置。第二种我们没有源码,要想做到像官方文档里面配置的话,只能反编译后,把配置文件添加进去然后重新打包,但是重新打包就会遇到很多坑,并不一定能成功,所以需要使用其他方式达到抓包目的。

引用官方文档一句话:默认情况下,来自所有应用的安全连接(使用 TLS 和 HTTPS 之类的协议)均信任预装的系统 CA,而面向 Android 6.0(API 级别 23)及更低版本的应用默认情况下还会信任用户添加的 CA 存储。应用可以使用 base-config(应用范围的自定义)或 domain-config(按域自定义)自定义自己的连接。

如何能在Android 7.0 上成功的抓自己开发的app的https的包

目前我常用的有三种方式:

  1. 操作系统,通过apk里面的配置文件控制app的证书信任机制

Android 官方文档里的配置方式进行配置,文档里面讲的很详细,7.0之后对于自己app可选择的可信任的证书链控制很细。我这里只添加一种方式,让我们自己开发的app能够信任Android手机上用户导入的根证书。

如下图所示,手机的根证有两种,一种是系统预装的,一种是用户自己导入的:

手机上的证书分为两种.png

配置方式:

添加如下文件 res/xml/network_security_config.xml 到你的代码里面,然后就能实现debug模式下,信任用户自己安装的根证书,比如Charles的证书:<network-security-config> <!-- Trust user added CAs while debuggable only --><debug-overrides> <trust-anchors> <!--信任用户安装的证书--><certificates src="user" /> </trust-anchors> </debug-overrides>
</network-security-config>然后在你 app的 manifest 文件中引入上面的文件, 如下所示:<?xml version="1.0" encoding="utf-8"?>
<manifest ... ><application android:networkSecurityConfig="@xml/network_security_config" ... >...</application>
</manifest>

然后配置好之后,这样就可以直接访问,https请求,并且通过Charles抓包了。

  1. 降低 targetSdkVersion 的版本来绕过Android 7.0(api 24)上网络的安全机制
    如果我们不想像上面一样配置这么复杂的东西,可以通过降低targetSdkVersion的方式来达到一样的效果,在gradle文件中配置 targetSdkVersion < 24 就可以了,但是这玩意在以后开发规范中有可能是不允许的。
defaultConfig {applicationId "me.febsky.okhttp.test"minSdkVersion 19targetSdkVersion 22versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}

网络请求测试代码如下,别忘了配置manifest文件中申请网络请求权限:

package me.febsky.okhttp.test;import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;import java.io.IOException;
import java.util.concurrent.TimeUnit;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread() {@Overridepublic void run() {super.run();String url = "https://api.weibo.cn/2/guest/cardlist?" +"networktype=wifi&uicode=10000327&moduleID=708&checktoken=" +"&c=android&i=a52f1e4&s=c1108e87&ua=OPPO-OPPO%20R9m__weibo__6.8.2__android__android5.1" +"&wm=9847_0002&aid=01AilAKZLB81znjKciZxofmqIMYg52EReWuEaQL7hIDXj6IR4." +"&did=b87cc255f19b91ff8e202968adab0eb9fc159a2e&&v_f=2&v_p=33" +"&from=1068295010&gsid=_2AkMg6ZSSf8NhqwJRmP0QzGPgb4l_wgjEieLBAH7sJRM3HRl-3T9jqnUstRUyD-wT6lM3A4HWHM1fFXBWuOYnxg.." +"&lang=zh_CN&page=1&skin=default&count=20&oldwm=9893_0044" +"&sflag=1&containerid=1087030002_2982_2_50&need_head_cards=0";OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS)//.sslSocketFactory().build();Request request = new Request.Builder().url(url).build();okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("Q_M", "GET -->" + e.toString());}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {Log.d("Q_M", "GET -->" + response.body().string());}});}}.start();}
}
  1. 修改http请求框架的协议栈,让框架不验证证书

这里我们用的是okhttp的网络请求框架,如何添加信任证书或者,不验证证书,可以参考官网文档,或者自行搜索。这会因为你使用的框架不同而不同。现在的开发者一般没人这么用吧,这么用了,还特么用啥https 啊??!

如何在Android 7.X 以上系统中抓第三方app的https包

一般情况下第三方我们都是抓第三方app的包,是为了分析别人的数据。但是像上面所说的前两种方式一般在第三方app上不会存在的,谁也不想让自己的app被抓包不是。

  1. 我们可以通过重打包的方式强行修改配置,或者强行降低 targetSdkVersion,或者强行修改别人源码里面的信任证书的代码,然后再重打包就好了(分别针对上面1,2,3里面所说的方法,只不过通过逆向的方式添加)。
  2. 通过使用Xposed的 JustTrustMe 模块来信任所有的证书,Xposed不会用的看这里
  3. 有点伪~~,使用Android 7.0 以下的系统安装应用,并抓包
  4. 使用双开沙箱应用,比如VirtualApp,让被抓包的应用运行到VA里面,并且修改VA的targetSdkVersion < 24,或者通过Manifest文件里面配置networkSecurityConfig属性,让他信息Charles证书。
  5. 把 Charles 证书,打入到Android 系统信任证书里面去

六、使用自签名证书的应用和双向验证的应用

在抓取一些第三方应用的包的时候,他们比较顽固:其一呢,客户端通过指定的方式只信任某一个证书;其二,我们一般来说只有客户端验证服务端公钥证书是不是合法,但是某些app,比如支付宝,采用双向验证的方式,在通信过程中,服务器会验证app的公钥证书,这时候,就没办法使用Charles(中间人攻击的方式)抓包了。

自签名证书的https和CA签名的https 区别在哪里?对https请求的影响又在哪里?关于这些问题建议了解些证书和CA相关的概念以及证书分发的流程。

从前面的https 客户端和服务器端通信的时序图中可以看到,在握手过程中客户端会验证服务器的公钥证书。如果证书验证不通过会终止请求。那么问题来了,证书合不合法谁说了算?一般来说,在Android 手机出厂的时候会预装一些证书,这些证书是CA的根证书,理论上来说默认是可信任的。如上图:手机上的证书分为两种.png 里面的系统列表的证书就是。对于网站来说,这个验证过程是由浏览器来做的,浏览器通过系统里面预装的CA的根证书来验证这个服务器的证书是不是由系统已经有的这些CA签发的。如果是那么就认为这个https的请求中的服务器证书是可信的。

但是话说回来,我们在开发app的时候,请求网络一般用的是网络框架,这灵活性就比较好了,大多数的网络请求框架(HttpClient,OkHttp等)都支持修改这个证书验证过程,就是我不用上面所说的浏览器验证证书的过程,修改框架里面这个验证过程,(因为CA签发证书是要花钱的好多公司都是用的自签名的证书)指定框架在验证的时候只会认为和我们公司一样的证书才认为验证成功,才能进行接下来的通信。

其实上面 通过使用Xposed的 JustTrustMe 模块来信任所有的证书,Xposed不会用的看这里 就是针对这些网络请求框架进行攻击的 通过hook的方式强制让这些网络框架信任所有的证书。

作者:千山万水迷了鹿
链接:https://www.jianshu.com/p/3b4cd6fdd8a9
来源:简书

Android 系统各个版本上https的抓包相关推荐

  1. 手机安装pem_通过安装证书到系统证书解决Burpsuite在Android710抓包的问题

    辛鸿宇,信息安全工程师,从事渗透测试工作,实施过国内多家银行的信息系统渗透测试. 随着手中的测试设备越来越新,默认Android系统版本也越来越高,高版本的Android也为测试人员带来不小的麻烦.G ...

  2. 如何使用charles对Android Https进行抓包

    2019独角兽企业重金招聘Python工程师标准>>> 如何使用charles对Android Https进行抓包 博客分类: 搜索引擎,爬虫 原理 man-in-the-middl ...

  3. 如何判断Android系统的版本

    随着Android版本的增多,在不同的版本中使用不同的设计是必须的,根据程序运行的版本来提供不同的功能.这涉及到如何在程序中判断Android系统的版本. 在Android api中的android. ...

  4. fiddler设置中文版本_突破安卓7.0以上版本WX小程序抓包篇

    工作上经常需要使用brupsuite抓取APP和WX小程序的包,所以会在安卓上安装burp的证书.但是你会发现安卓7.0之后有了network-security-config这个选项,可以让app只信 ...

  5. 关于fi dd ler 手机抓包 网卡地址地址_[问题]Android 7.0+使用VirtualXposed+Charles进行抓包

    Android 7.0+使用VirtualXposed+Charles进行抓包(下面以android10为例) 来源: Android 7.0+使用VirtualXposed+Charles进行抓包​ ...

  6. 抓包!抓包! HTTPS中间人抓包

    简介 抓包是一种网络分析技术,可以用于捕获和分析数据包,通常用于网络故障排查.协议分析.安全审计等.网络上所有的数据包都是以二进制的形式在网络上传输的,抓包工具可以捕获到这些数据包并将其转换为可读的格 ...

  7. iOS开发——使用Charles进行https网络抓包详解

    我在前面两篇博客中<网络抓包工具Charles的介绍与使用><iOS开发--使用Charles进行http网络抓包详解>对Charles的http抓包进行了详细的讲解.今天我们 ...

  8. HTTPS中间人攻击,HTTPS被抓包了怎么办?

    目录 一.写在前面 二.什么是中间人攻击 三.https 是绝对安全的吗 四.中间人攻击的初步了解 五.中间人攻击的深入了解 六.https 是如何防止中间人攻击的 SSL-Pinning 七.浏览器 ...

  9. Https/Tcp抓包工具Charles、fiddler,ping (网络诊断工具),Android平台HTTPS抓包解决方案及问题分析HttpCanary

    市面上已经有一些弱网络模拟工具,比如微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(A ...

  10. Android 系统各版本新特性总结

    Android 4.0 Space 留白 PopupMenu GlidLayout 网格布局 Android 5.0 MaterialDesign设计风格 Material Theme Meteria ...

最新文章

  1. python下载了怎么打开-下载python后如何启动
  2. wordpress 分类使用不同的模版
  3. python中二分查找什么意思_python中二分查找法的实现方法
  4. 打开闪光灯_用手机拍照这么久,你居然还不知道闪光灯怎么用
  5. 从头开始复习css之2D变换
  6. 面试官:select......for update会锁表还是锁行?
  7. 了解和熟悉数据库相关知识
  8. Pycharm汉化包+操作步骤
  9. 基于C# 和Access数据库的电影院管理系统
  10. Python 爬虫对链家网广州二手房源信息的处理与可视化分析
  11. iOS视频开发(一):视频采集
  12. android iCloud 短信,云助手 基于安卓的iCloud
  13. BigDecimal,BigInteger 学习以及简单示例
  14. 用php的定界符EOT需要注意的地方
  15. linux下dd工具,dd 工具使用
  16. JAVA 人工神经网络实现,机器学习,人工智能
  17. 输入身份证号获取信息
  18. 【爬虫实践】获取某城市天气数据
  19. springboot+feign+nacos+seata+docker整合踏坑实录
  20. 优质且免费的10个在线图片设计网站!

热门文章

  1. java中vector,array,list,arraylist的区别
  2. 2. Vue基础语法
  3. iOS数据库操作(使用FMDB)
  4. 交互设计实用指南系列(8)—深广度平衡
  5. Mac 技巧——让Mac轻松访问Windows网络共享
  6. Linux系统如何安装不知名称的软件?
  7. Leetcode 刷题笔记(十六) —— 二叉树篇之二叉搜索树的属性
  8. 【转】正则表达式之基本概念
  9. 给我一个软件,我将操控一个机器人军团!
  10. JAVA 设计模式 适配器模式