V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thisismr2
V2EX  ›  推广

一个配合 mitmproxy 的 iOS 和 Android 端 HTTP&HTTPS 抓包 APP(非设置系统代理方式)

  •  1
     
  •   thisismr2 · 2020-10-16 09:58:06 +08:00 · 3873 次点击
    这是一个创建于 621 天前的主题,其中的信息可能已经有所发展或是发生改变。

    系统代理方式和虚拟网卡方式

    一直比较习惯命令行的工具, 所以一直在用 mitmproxy 抓包

    • 但是通常都是设置手机系统代理的方式, 以及其他很多抓包工具比如 Charles, 都是设置手机系统代理
    • 一些 iOS 端手机端 HTTP 抓包工具即使使用了 Network Extension (VPN), 也是通过设置了系统代理. 而且不如在桌面上查看分析包的可操作性强

    通过设置系统代理的方式, 有些 APP 会无视系统代理(APP 开发人员一行代码就可以). 所以自然导致无法抓取那些不走系统代理的 APP

    所以写了这个 client 配合 mitmproxy 使用, 原理不是设置系统代理. 而是从网卡级**系统 Transport 层(TCP)**接管流量然后给 mitmproxy, 所以也能抓那些跳过系统代理的 APP.

    简单问题和根证书问题

    一直喜欢自己写的东西都使用都很简单. 一条命令一个按钮之类的. 但是大家都知道解密 TLS 需要安装根证书. 这个 iOS 和 Android 有很大差别, 而且不同的系统版本也有很大差别, 而且有时安装完 CA, 可能 APP 需要重启才生效. 很多细节吧. 所以如果没研究过的同学这个步骤可能大家需要 google 下.. 而且 Android 新版本好像还区分 User CA 和 System CA, 而安装为 System CA 需要 root, 抓包需求比较多的话还是建议大家单独准备个 root 了的开发机.

    录了个视频

    所以昨天录了一个视频放在 youtube 上了, (第一次弄录屏视频, 不太专业, 就是用自带的录屏软件录了就传上去了, 多担待):

    https://www.youtube.com/watch?v=puES_ayJkEo

    下载地址

    下面是 AppStore 和 Google Play 的链接, 分别都设了个$4.99 的价格, 没有内购(商店如果展示 App 含内购, 估计是我引入了内购 SDK 忘了移除了). 因为不可抗因素, 苹果说使用了一些技术不让在大陆区 AppStore 上架, 所以 iOS 同学需要非大陆 AppleID 下载

    iOS(>=14) https://apps.apple.com/us/app/id1528537342

    Android (>=8) https://play.google.com/store/apps/details?id=com.txthinking.mitmproxy

    兑换码

    如果感觉这个应用能给你帮助的话, 这里针对 iOS 和 Android 分别准备了 20 个兑换码.

    领取规则:

    这里想请大家帮个忙. 刚申请了 Stripe 支付, 需要 20 笔交易, 来过他们判定规则, 所以我随便 fork 了个查看 IP 的 chrome 扩展(Apache Licence 2.0)加上了国家信息, 收费$1. 想用来攒够 20 笔交易.

    https://chrome.google.com/webstore/detail/ipvbar/copjmgogifdfjkaenpallapiidcpkjbm

    1. 安装扩展后
    2. 点击图标
    3. 呈现出来 popup 后(不确定接口速度如何), 点击 Pro
    4. 输入 Email, 获取验证码后, 输入验证码(可能在垃圾箱)
    5. 支付$1 (不确定 Stripe 支付是不是支持大陆信用卡?)

    我收到支付信息后, 会往你的 Email 里发送两个兑换码: 一个 iOS 兑换码和一个 Android 兑换码. 共 20 个人吧. 如果有问题或没收到可以下面 @我.

    (那个$1 是月订阅制, 如果你支付了, 建议不要那么快手动结束订阅, 可以在下一个扣费日的前几天停止订阅, 或者方便的话可以支付 2 刀后手动结束订阅 [是结束订阅, 可别申请退款哈], 因为不太了解 Stripe 的判定机制, 所以先谢谢大家)

    第 1 条附言  ·  2020-10-16 17:45:14 +08:00
    #23 楼的内容可能有用
    第 2 条附言  ·  2020-10-16 18:05:06 +08:00

    刚看到stripe文档. 支持中国银联信用卡

    第 3 条附言  ·  2020-10-19 11:32:45 +08:00
    #45 楼 修正了 #23 的错误
    第 4 条附言  ·  2020-11-02 18:27:41 +08:00
    兑换码 已发放完毕. 后面可直接在非果区 AppStore 或 google play 购买
    52 条回复    2021-02-23 15:03:32 +08:00
    thisismr2
        1
    thisismr2  
    OP
       2020-10-16 10:22:26 +08:00
    看来用 mitmproxy 抓包的同学还是不太多吧
    xionger
        2
    xionger  
       2020-10-16 10:28:05 +08:00
    大神又出新东西了, 可惜我不会用 mitmproxy. 偶尔会用下 Charles 抓包. 哈哈前端抓包需求不多

    BTW(不过我用大神的 Brook)
    thisismr2
        3
    thisismr2  
    OP
       2020-10-16 10:37:54 +08:00
    @xionger 不敢当. 嗯 Charles 设置系统代理方式. 是否使用系统代理 app 可以自己选择的. 忽略系统代理的就抓不到了.

    (BTW) 能帮助到你就好 :)

    另外 mimtproxy 有 web 界面好像, 前端可以试试呀
    thisismr2
        4
    thisismr2  
    OP
       2020-10-16 10:41:45 +08:00
    收到一个提醒, 我要去发兑换码了. 嘻嘻
    thisismr2
        5
    thisismr2  
    OP
       2020-10-16 10:46:52 +08:00
    邮箱 l 开头的同学, 兑换码已发送. (第一次生成 ios 和 android 兑换码, 如果我姿势不正确, 提醒我下哈)
    xionger
        6
    xionger  
       2020-10-16 10:57:35 +08:00
    我的邮箱 s 开头, 不过我给不给兑换码都行, 我还不会用 mitmproxy. 得空了研究下这个东西, 好像挺牛逼的.
    不过 我发现就单说这个 chrome 扩展就很带劲啊, 值了
    thisismr2
        7
    thisismr2  
    OP
       2020-10-16 11:10:35 +08:00   ❤️ 1
    @xionger 已发. 就 20 个. 一个萝卜一个坑

    :) 都是写完自己用过一段时间的工具
    xionger
        8
    xionger  
       2020-10-16 11:27:10 +08:00
    @thisismr2 问下, 那个 stripe 页面是自带的吗, 那么简洁
    zjb861107
        9
    zjb861107  
       2020-10-16 11:33:16 +08:00
    > 从网卡级**系统 Transport 层(TCP)**接管流量

    这个是怎么工作的,iOS 允许任意 app 在后台接管流量么
    thisismr2
        10
    thisismr2  
    OP
       2020-10-16 11:33:24 +08:00
    @xionger stripe 的文档里 demo copy 过来的. 也可以说算是 stripe(文档里)自带的吧.
    thisismr2
        11
    thisismr2  
    OP
       2020-10-16 11:39:36 +08:00
    @zjb861107 可以的. 需要用到 Network Extension 里的 API
    Biebe
        12
    Biebe  
       2020-10-16 12:24:18 +08:00 via iPhone
    不 root 可以抓只信任系统证书的 app 吗
    yushiro
        13
    yushiro  
       2020-10-16 12:51:52 +08:00 via iPhone
    ios 上用 network extension 的 app 一堆吧~
    thisismr2
        14
    thisismr2  
    OP
       2020-10-16 12:57:43 +08:00
    @Biebe 这个应该是 android 系统级别的隔离. 原本 android 和 ios 一样, 安装一个 root ca 到系统里就行了. 系统就会当成一个 root ca. 后来 android 区分了两个 system ca store 和 user ca store
    xionger
        15
    xionger  
       2020-10-16 13:09:22 +08:00
    Android 开发的话 root 了应该啥都能干了
    thisismr2
        16
    thisismr2  
    OP
       2020-10-16 13:15:15 +08:00
    @Biebe 但不代表全部都不行. 总之感觉 root 后抓的踏实. android 的同事是专门用了一个老的 root 了的 Nexus6 当开发机和转包. 我平常是用 ios 抓.
    thisismr2
        17
    thisismr2  
    OP
       2020-10-16 13:34:05 +08:00
    @yushiro
    Network Extension 有网络层 API, 传输层 API, 应用层 API
    比如可以只用 Network Extension 设置系统代理(仍然会显示 V 批 N 标示). 这就算是[应用层], 本质同[设置 app]设置系统代理一样.
    另外如果接管所有流量, 就需要用 [网络层 API] 处理 IP 包, 再加工成 [传输层]的 TCP/UDP 包, 最后再给[应用层]

    抓包类 app, 良心好的开发者会在他们 app 介绍了里说明 是哪一层. 比如这个就说明了
    https://i.loli.net/2020/10/16/tU7WfrBHeoPLIlT.png
    xionger
        18
    xionger  
       2020-10-16 13:38:02 +08:00
    thisismr2
        19
    thisismr2  
    OP
       2020-10-16 13:50:24 +08:00
    接 #17

    谢谢
    我还是补文字吧
    “请务必阅读以下简介:
    Thor 并非万能,只工作在系统 HTTP 层: **不支持**非 HTTP 流量(TCP, UDP)及**不经过系统 HTTP 代理的流量**”
    yushiro
        20
    yushiro  
       2020-10-16 14:24:39 +08:00 via iPhone
    嗯,没注意过三个层面的 api 区别。
    常用的几个留学软件也都支持 mitm,就是不解决 ssl pin ~
    thisismr2
        21
    thisismr2  
    OP
       2020-10-16 14:53:12 +08:00
    邮箱 j 开头的 gmail 同学. 兑换码已发送.
    xionger
        22
    xionger  
       2020-10-16 15:19:59 +08:00
    $ mitmweb -m socks5

    ![image.png]( https://i.loli.net/2020/10/16/75zkwXmZhx1DStP.png)



    学了下 mitmproxy, 发现有个 mitmweb 命令也可以, 有图形界面

    但是 mitmweb 命令会输出很多东西, 超出我的理解能力范围了 @thisismr2
    thisismr2
        23
    thisismr2  
    OP
       2020-10-16 15:57:19 +08:00   ❤️ 2
    我尽量系统的解释下抓包的各种情况.

    ## 首先是拦截流量, 两种情况

    * 第一种是配置系统代理

    这种方式呢通常是创建一个 http proxy, 然后配置到系统代理上, 如果 app 选择走系统代理(大部分会走, 但是 app 不走系统代理也是开发人员一行代码的事). 所以这种方式有一定的局限性. 不走的就是直连了.

    * 第二种是拦截所有 TCP 和 UDP 流量

    这是 mitmproxy client 选择的方式, 这种方式的好处是所有流量都能够拦截, 开发人员无视系统代理也没用(因为不工作在系统代理那块).
    这里拦截了所有的 TCP 和 UDP 流量(这里刻意排除了 DNS 流量)给 mitmproxy
    坏处是 mitmproxy 只能处理 http 和 https 流量, 所以如果某个 app 走的私有 TCP 协议, 那么这部分流量 mitmproxy 就无法处理了, 可能 app 就显示无法连接之类的. 当然介于当前讨论的主题也是 HTTP 和 HTTPS 抓包, 可以理解. (这种情况如果 mitmproxy 后期可以将非 HTTP(S)协议的代理请求也正常处理哪怕不分析包 就更好了)

    ## 关于(SSL)TLS 和 单独对称加密的数据

    解密 TLS 的原理就是中间人劫持, 所以需要那个根证书.

    TLS 又分单向和双向认证

    单向认证: 通常 https 的网站啊接口什么的都是单向认证, 所以可以我们用根证书辅助来拦截, 可以正常解包.

    双向认证: 也就是服务端会验证客户端的证书, 所以这种是无法解密的(不好理解, 可以理解下面要描述的情况)

    单独对称加密: 可以理解为服务端和客户端约定一个密钥, 客户端将密钥编译进代码里. 这种情况, 只有你知道编译进代码里的密钥你才能解密. 所以根证书也是无能为力的.
    xionger
        24
    xionger  
       2020-10-16 16:24:32 +08:00
    感谢感谢. 我也就抓抓同事的 RN 应用. 学习的道路任重而道远啊
    zy445566
        25
    zy445566  
       2020-10-16 16:29:55 +08:00
    其实还可以修改开发的请求地址到代理服务请求抓包也挺方便的
    https://github.com/zy445566/before-server
    zy445566
        26
    zy445566  
       2020-10-16 16:30:49 +08:00
    我公司已经用了一段时间的 before-server,效果还不错
    xionger
        27
    xionger  
       2020-10-16 16:44:03 +08:00
    楼上这完全不相干的东西. 这广告真恶心.
    thisismr2
        28
    thisismr2  
    OP
       2020-10-16 17:34:31 +08:00
    l 开头的 outlook 邮箱. 兑换码已发送.
    thisismr2
        29
    thisismr2  
    OP
       2020-10-16 18:30:03 +08:00
    **还有 16 对**
    thisismr2
        30
    thisismr2  
    OP
       2020-10-16 18:40:09 +08:00
    如果没 append 发放完毕, 就代表还没发放完毕. 如果遇到边界情况导致不够会重新生成新的发放. 周末愉快.
    playniuniu
        31
    playniuniu  
       2020-10-16 23:08:30 +08:00
    老哥,付好了,pla 开头的 gmail 邮箱
    playniuniu
        32
    playniuniu  
       2020-10-16 23:20:07 +08:00
    @thisismr2 还有怎样才能取消订阅呢,没看到取消的按钮呢。到了一个月会自动取消吗?
    thisismr2
        33
    thisismr2  
    OP
       2020-10-17 09:32:09 +08:00
    @playniuniu 兑换码已发. (昨晚睡的早)
    thisismr2
        34
    thisismr2  
    OP
       2020-10-17 09:34:21 +08:00
    @playniuniu 我也第一次用这个支付方式. 怎么取消我得去搜搜, 搜到再回答
    thisismr2
        35
    thisismr2  
    OP
       2020-10-17 12:50:37 +08:00
    @playniuniu 好像在 stripe 发给你的邮件里?
    playniuniu
        36
    playniuniu  
       2020-10-17 14:23:50 +08:00
    @thisismr2 我看了一下邮件,里面只有收据,没有退订的按钮和链接
    thisismr2
        37
    thisismr2  
    OP
       2020-10-17 14:41:58 +08:00
    @playniuniu 好像还真是. 和 paypal 的逻辑不一样. 我研究下
    thisismr2
        38
    thisismr2  
    OP
       2020-10-17 15:19:20 +08:00
    发现了我没开启这个选项.

    已开启.



    已经 subscribe 的我再看看
    fx0719
        39
    fx0719  
       2020-10-17 16:09:42 +08:00 via iPhone
    可惜手机还是 13
    thisismr2
        40
    thisismr2  
    OP
       2020-10-17 16:42:52 +08:00
    @playniuniu 给你发了邮件
    thisismr2
        41
    thisismr2  
    OP
       2020-10-17 16:43:28 +08:00
    @fx0719 升下嘛, 反正早晚得升
    coolzilj
        42
    coolzilj  
       2020-10-17 20:28:44 +08:00 via Android
    想问为什么不直接用 mitmproxy 的 transparent mode,是这个比 -T 解决了更多的问题吗?
    thisismr2
        43
    thisismr2  
    OP
       2020-10-17 21:45:44 +08:00
    @coolzilj 其实目的是一样的. 其实就是 transparent, linux 和 bsd 和 mac 依赖的各不相同, iptables, doas, pf. 使用体验上. 如果对这几个工具非常熟还可以. 另外应该如果是 windows 应该就走不通了好像
    coolzilj
        44
    coolzilj  
       2020-10-17 23:30:37 +08:00 via Android
    @thisismr2 了解,谢谢
    thisismr2
        45
    thisismr2  
    OP
       2020-10-19 11:30:37 +08:00
    更正 #23 内容:

    错误:
    “坏处是 mitmproxy 只能处理 http 和 https 流量, 所以如果某个 app 走的私有 TCP 协议, 那么这部分流量 mitmproxy 就无法处理了, 可能 app 就显示无法连接之类的. 当然介于当前讨论的主题也是 HTTP 和 HTTPS 抓包, 可以理解. (这种情况如果 mitmproxy 后期可以将非 HTTP(S)协议的代理请求也正常处理哪怕不分析包 就更好了)”

    正确:
    mitmproxy 可以处理非 http 和 https 流量, 只需要加个 --rawtcp 即可
    $ mitmproxy -m socks5 --rawtcp
    thisismr2
        46
    thisismr2  
    OP
       2020-10-19 11:33:46 +08:00
    目前 rawtcp 参数是 experimental 性质的
    chenliang0571
        47
    chenliang0571  
       2020-10-24 16:57:39 +08:00
    名额满了?输入 CODE 之后直接显示"YOU ARE PRO"
    FaiChou
        49
    FaiChou  
       2020-11-20 23:15:25 +08:00
    请教个问题, 既然「 app 不走系统代理也是开发人员一行代码的事」那为什么很多的 app 都不这么做呢?
    比如微博国际版, 很多第三方微博就直接拿微博国际版的接口用. 额, 举了个不好的例子, 因为即使设置了, 也可以在应用层之上抓包继续看到请求.

    那继续讲个例子吧, 手机上使用 圈 x, 可以运行一些脚本, 来实现京东 /淘宝比价的功能, 我猜测是利用了 jd/淘宝内的某个 api 请求, 经过修改 hack, 达到目的. 圈 x/surge 这类的软件是作用的应用层网络的系统代理, 如果 jd/淘宝多写「一行」代码, 就可以避免这种问题. 而且配合 ssl-pinning 效果更佳吧?
    FaiChou
        50
    FaiChou  
       2020-11-20 23:16:12 +08:00
    playniuniu
        51
    playniuniu  
       2021-01-04 13:57:35 +08:00
    @thisismr2 能帮我在确认一下订阅是否已经取消了?

    我这边上个月 17 号还是收到了订阅账单,没有取消
    thisismr2
        52
    thisismr2  
    OP
       2021-02-23 15:03:32 +08:00
    @playniuniu 已取消
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1200 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:38 · PVG 06:38 · LAX 15:38 · JFK 18:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.