抓包

相关原理:

MITM(Man-in-the-middle)工作原理:

java 对抓包的结果校验 java抓包原理_HTTPS

对于双向加密的HTTPS,正常情况下,即使能以中间人的方式拿到通信报文,但是因为没有密钥,同样也不能看到具体的传输内容。基于HTTPS加密通信的建立过程,和密钥交换方式,如果在加密通信建立之前,截取服务端发送的包含证书的报文,伪装成服务端(从第一个SSL/TLS包截取域名,利用内置的ca证书创建公钥证书和私钥),把自己的证书发给客户端,然后拿到客户端返回的包含对称加密通信密钥的报文,以服务端自己的公钥加密后发给服务端,这样一来,双向加密通信建立完成,而中间人实际拿到了通信的密钥,所以可以查看、修改HTTPS的通信报文,这就是典型的Man-in-the-middle attack即MITM中间人攻击。

简化理解:

java 对抓包的结果校验 java抓包原理_网络安全_02

总结:

  1. 即中间人攻击,抓包工具双向伪装,在connect建立前通过伪造证书获取秘钥,从而实现中间人抓取和修改request与response数据。
  2. https抓包实现的基础,是将中间人的CA证书导入到目标机上,让客户端认为你就是服务端。
  3. server一般不关心client,但是可以校验,详情见扩展7双向认证。

使用方法:

fiddler:

常用抓包工具之一,部署安装步骤见扩展,安卓6以下可直接抓包,6以上按此方法

  1. 获取fiddler ca证书:
    fiddler默认抓http,选择Tools->Options,

java 对抓包的结果校验 java抓包原理_java 对抓包的结果校验_03

  1. 勾选https->Capture HTTPS CONNECTs->Decrypt HTTPS traffic,若https使用了不可信任的证书,勾选下面的ignore xx error

java 对抓包的结果校验 java抓包原理_网络安全_04

  1. 切换connections->allow remote computers to connect(否则模拟器连不上)

java 对抓包的结果校验 java抓包原理_java 对抓包的结果校验_05

  1. 安卓端设置wifi代理,使用浏览器打开pc端ip+端口号(例如198.168.0.1:8888,ip获取方法可百度,端口号默认8888,如有需求可自行修改),进入后会看到fiddler提供的页面,点击fiddlerRoot certificate可获取fiddler证书。(连不上代理见解决方法3)

java 对抓包的结果校验 java抓包原理_java 对抓包的结果校验_06

  1. 安装MT管理工具(官网下载:https://mt2.cn/,直接导入),在/data/misc/user/0/cacerts-added目录找到刚下载好的证书,移动到/etc/security/cacerts/目录下(此步骤是因为安卓7以上只信任系统证书,此处将用户证书移动到系统证书目录下),若提示目录只读见解决方法4,ios此ca证书处理方式相同,安装证书后,在证书信任设置中选择“针对根证书启用完全信任”

java 对抓包的结果校验 java抓包原理_网络安全_07

  1. 抓取成功:bilibili举例

java 对抓包的结果校验 java抓包原理_服务端_08

http canary(小黄鸟)

  1. 安装证书:设置 → SSL 证书设置 → 导出 HttpCanary 根证书 → System Trusted(.0)自动导入,方便得很。
  2. 小米为例:设置 -「密码与安全」-「系统安全」-「加密与凭据」-「安装证书」-「ca证书」-「仍然安装」-「选路径(httpcanary/cert/HttpCanary.pem)」不同手机路径可能会有差别,专门找隐私,安全,加密,证书这些字样的路径找。
  3. 设置目标应用,就可以抓包了。
  4. 小黄鸟几个特点:
  1. 可以注入(修改request和response)
  2. 可以直接返回结果,包括图片,音视频
  3. 可以屏蔽和数据筛选
  4. 插件齐全(Host屏蔽、Mime-Type屏蔽、图片音频视频下载、请求性能统计等)

charles

  1. 部署 MITM 代理服务器:在电脑上启动 Charles,默认会在这台电脑的 8888 端口部署 Charles 的 Web 服务器
  2. 通过代理等方式将网络流量归集到 MITM 主机:在电脑命令行执行 ipconfig 获得本地 IP 地址(也可以通过 Charles 的 Help→Local Ip Address 查看),然后将手机和电脑连接到同一个局域网下,再修改手机连接 Wifi 的高级设置,设置代理到电脑的 IP 地址和 8888 端口号
  3. 客户端信任 MITM CA 证书: Charles 抓包也需要在手机上信任 Charles CA 证书。根据指引,会让你在手机浏览器访问 chls.pro/ssl 下载证书,安装证书的方法与 Fiddler 相同
  4. 报文重放:在 Charles 上重放请求很简单,有两种方式:右键点击一个请求,选择 RepeatRepeat Advanced 直接重放;或者选择 Compose 先编辑再重放。其中 Repeat Advanced 适合做压力测试。

java 对抓包的结果校验 java抓包原理_服务端_09

  1. 弱网模拟:
    打开 Proxy→Throttle Settings 进入弱网配置页面,其中 Throttle preset 提供了多种预置的网络环境模拟配置,可以直接在此基础上修改。

java 对抓包的结果校验 java抓包原理_网络安全_10

  1. 修改请求:
    Charles 本身是一个代理服务器,可以拦截 HTTP 请求 / 响应进行修改后再放行。在 Charles 上配置 Rewrite:tools里面

java 对抓包的结果校验 java抓包原理_服务端_11

常见问题及解决办法:

  1. Android 7以上对安装证书限制:
    安卓7以前信任系统证书和用户证书,7以后只信任系统证书,解决方法
  1. 修改App的AndroidManifest网络安全配置,信任用户自导入证书(基本上用于自己开发的app)。
    AndroidManifest 中配置 networkSecurityConfig
    网络安全配置详情:https://developer.android.com/training/articles/security-config
  2. Root测试机或自编译系统,把Fiddler根证书设置为系统预置证书。
  3. 调低targetSdkVersion:
    安卓7以上可以抓到targetSdkVersion<24的包,Google后来要求大于28了,所以可以找历史版本
  4. 平行空间抓包:
    利用宿主系统运行其他应用,但要注意平行空间的版本 4.0.8625 以下才是 targetSdkVersion < 24
  1. 安卓版本:
    可使用夜神模拟器,选择多版本安卓os
  2. 连不上代理:
  1. Fiddler代理没有勾选Allow remote computers to connect
  2. 代理服务器地址不对,eg写错误成了127.0.0.1
  3. 模拟器网络设置没设对(夜神模拟器为例,网络设置不要选择桥接)

java 对抓包的结果校验 java抓包原理_服务端_12

  1. 移动系统证书提示只读(由于没有设备,此处未经实践lol):
  1. 安卓设备请确保root
  2. 连接安卓设备,确保安卓设备打开了“usb调试”选项,然后打开终端,输入adb shell,进入后输入 su,以root权限调试
  3. 执行mount | grep /system,会看到如下信息
    /dev/block/platform/1021c000.rksdmmc/by-name/system /system ext4 ro,noatime,nodiratime,noauto_da_alloc,data=ordered 0 0
    ro说明只读
  4. 输入命令cat /proc/mounts
  5. 找到/system的路径:/dev/block/platform/1021c000.rksdmmc/by-name/system
  6. 执行命令 mount -o rw,remount /dev/block/platform/1021c000.rksdmmc/by-name/system /system
  1. app提示网络错误:
    可能是app使用了证书固定,Client 端内置 Server 端真正的公钥证书。在 HTTPS 请求时,Server 端发给客户端的公钥证书必须与 Client 端内置的公钥证书一致,请求才会成功。比如饿了么,比较麻烦,但Xposed 和 Magisk 都有相应的模块,用来破解证书固定,还是能抓。破解的原理大致是,Hook 创建 SSLContext 等涉及 TrustManager 相关的方法,将固定的证书移除。

扩展

扩展:

  1. http2协议多路复用形式:frame+stream形式

java 对抓包的结果校验 java抓包原理_java 对抓包的结果校验_13

  1. https抓包原理:
    http为明文报文,可以直接食用,但https为双向加密报文,需要破解,
  2. CA证书:
    分为用户证书和系统证书,
  3. fiddler部署:
    下载地址:https://www.telerik.com/fiddler,注意安装经典版本。
  4. fiddler有断点功能,也可以实现注入,可以打在request之前和response之后
  5. fiddler使用过程中忽然不能联网了:重启fiddler
    原因:fiddler异常关闭,Fiddler是以代理WEB服务器的形式工作的,它默认使用代理地址:127.0.0.1, 端口:8888。 当Fiddler开启时会自动设置代理, 退出的时候它会自动注销代理,这样就不会影响别的程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler。
  6. 双向认证问题:
    比如soul,server也会校验client,双向认证需要server支持,请求建立前server会向client请求公钥(不同于比如前面的固定证书公钥,也就是说同一个app可能存在多个公钥和秘钥),一般会将公钥存在包中,可以从包中提取,相关文章较多,不同app存放位置一般也不同,需要具体情况具体分析,这里就不细展开了,针对app找相关资料,还是可以抓的。

参考文献:

  1. https://www.jianshu.com/p/5e5524868442

2.https://jishuin.proginn.com/p/763bfbd5f92e


3.targetSdkVersion:https://www.jianshu.com/p/358a3d42196e

4.fiddler抓取https原理:https://www.jianshu.com/p/54dd21c50f21

  1. VirtualHook:https://github.com/rk700/VirtualHook
  2. CertUnpinning:https://github.com/rk700/CertUnpinning