mac上使用mitmproxy对ios app进行抓包
对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对网络数据进行转发
允许ip转发
1
sudo sysctl -w net.inet.ip.forwarding=1
设置pf转发规则(将80、443端口的内容转发到本地8080端口)
1
2
3
4sudo 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启用pf规则
1
sudo pfctl -e
配置sudoer文件允许mitmproxy访问pfctl
1
2
3sudo vim /etc/sudoers
添加以下行
ALL ALL=NOPASSWD: /sbin/pfctl -s state安装mitmproxy使用
1 | brew install mitmproxy |
手机端访问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