抓包原理和方法1.0

抓包

相关原理:

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

请添加图片描述

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

简化理解:

请添加图片描述

总结:

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

使用方法:

fiddler:

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

  1. 获取fiddler ca证书:

    fiddler默认抓http,选择Tools->Options,

请添加图片描述

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

请添加图片描述

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

请添加图片描述

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

请添加图片描述

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

请添加图片描述

  1. 抓取成功:bilibili举例

请添加图片描述

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 适合做压力测试。

请添加图片描述

  1. 弱网模拟:

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

请添加图片描述

  1. 修改请求:

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

请添加图片描述

常见问题及解决办法:

  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

  2. 安卓版本:

    可使用夜神模拟器,选择多版本安卓os

  3. 连不上代理:

    1. Fiddler代理没有勾选Allow remote computers to connect

    2. 代理服务器地址不对,eg写错误成了127.0.0.1

    3. 模拟器网络设置没设对(夜神模拟器为例,网络设置不要选择桥接)

请添加图片描述

  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

  2. app提示网络错误:

    可能是app使用了证书固定,Client 端内置 Server 端真正的公钥证书。在 HTTPS 请求时,Server 端发给客户端的公钥证书必须与 Client 端内置的公钥证书一致,请求才会成功。比如饿了么,比较麻烦,但Xposed 和 Magisk 都有相应的模块,用来破解证书固定,还是能抓。破解的原理大致是,Hook 创建 SSLContext 等涉及 TrustManager 相关的方法,将固定的证书移除。

扩展

扩展:

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

请添加图片描述

  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://blog.csdn.net/unreliable_narrator/article/details/112799882
  3. https://juejin.cn/post/6844903744019103751
  4. https://jishuin.proginn.com/p/763bfbd5f92e
  5. https://segmentfault.com/a/1190000041674464
  6. targetSdkVersion:https://www.jianshu.com/p/358a3d42196e
  7. fiddler抓取https原理:https://www.jianshu.com/p/54dd21c50f21
  8. root:https://blog.csdn.net/weixin_42298382/article/details/117311046?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-117311046-blog-105365246.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-117311046-blog-105365246.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=1
  9. VirtualHook:https://github.com/rk700/VirtualHook
  10. CertUnpinning:https://github.com/rk700/CertUnpinning
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值