对ios app抓包的方式挺多的,最常规的方案就是本机开启一个http代理。然后手机进行设置,将本机内网ip以及端口设置上去。安装一个https证书,设置为信任就可以开始抓包了。这个方案非常通用。类似的实现以Fiddler、charles为代表,它们确实很好用,也很好理解。但是缺点也是有的

  • 最大的缺点就是每一次使用都需要设置代理,你需要查看本机内网ip,然后填写到手机上。调试完成后再将手机的代理设置清除
  • Fiddler只有windows版本可用,意味着mac需要使用虚拟机,charles并没有Fiddler好用,然而还卖的贼贵

同类型的开源方案最常见的是Python实现的mitmproxy。mitmweb也提供图形界面,别说,只要你不嫌弃还是挺好用的

osx上还有个比较奇葩的所谓网络调试软件Surge。99美刀,卖的还是挺贵的,功能还行,界面也挺花哨,忽悠小白是足够了。用它也能够远程调试,代价是需要用有线连接到mac电脑上,然后mac端软件就能捕获远程手机的网络请求数据,这个软件界面确实挺不错,然而请求过滤查找对比下Fiddler而言就是个渣渣吧。

因此想了一个比较另类的方案,手机使用mac电脑的网络,同时使用pf对请求进行转发。使用mitmproxy的透明代理模式获得手机端的数据,使用mitmweb进行展示

本篇环境

  • 机器 MBP 2015/ ipad mini
  • 系统 osx 10.13/ ios 11.3

1. 让ipad通过蓝牙连上osx的网络

参照https://www.zhihu.com/question/24480413,先让手机通过蓝牙连接上电脑,在电脑设置网络共享,选择蓝牙的方式,这一步基本就配置好了

接下来是验证。通过ifconfig命令查看目前存在哪些网络接口,查看active状态的接口,自己排除一下。像我的就是bridge100。然后可以使用wireshark看一下这个网络接口是否正常收到了手机端的数据请求sudo /Applications/Wireshark.app/Contents/MacOS/Wireshark。待能正常通过电脑网络访问后进行后续操作

通过PF对网络数据进行转发

  1. 允许ip转发

    1
    sudo sysctl -w net.inet.ip.forwarding=1
  2. 设置pf转发规则(将80、443端口的内容转发到本地8080端口)

    1
    2
    3
    4
    sudo vim /etc/pf.conf
    添加如下行(记住使用对应的网络接口)
    另外pf的配置对顺序有要求,像我本机就需要将它放到rdr-anchor "com.apple/*"下一行
    rdr on bridge100 inet proto tcp to any port {80, 443} -> 127.0.0.1 port 8080
  3. 启用pf规则

    1
    sudo pfctl -e
  4. 配置sudoer文件允许mitmproxy访问pfctl

    1
    2
    3
    sudo vim /etc/sudoers
    添加以下行
    ALL ALL=NOPASSWD: /sbin/pfctl -s state

安装mitmproxy使用

1
2
brew install mitmproxy
mitmweb -T --ignore apple

手机端访问http://mimt.it点击安装https证书。除此之外还需要设置-> 通用 -> 关于 -> 信任证书设置 -> 设置为可信。
上面ignore参数是正则匹配。忽略对域名包含apple的处理。因为在客户端强制证书验证的时候伪造证书是过不了的,这样会在调试的时候影响ios消息推送啥的
bingo~~ 结束了

不足之处就是它并不会显示访问的域名,只会显示ip(感觉这是一个bug,因为mitmproxy使用–host参数是能够看到正确的地址的)

然后就是学习一下mitmproxy的过滤语句了,很简单,在web操作上会有提示

整个过程就是这样,让手机通过电脑进行上网,用mitmproxy的透明代理模式从三层网络上捕获数据(这样就避免了在手机端设置代理),希望能对你们有所帮助┑( ̄Д  ̄)┍

参考

https://docs.mitmproxy.org/stable/howto-transparent/
https://medium.com/bugbountywriteup/intercepting-network-data-with-mitmproxy-on-macos-3e3f2f0123b2