如何在macOS上监控一个APP的HTTPS流量

前言

当你逆向分析一个网络协议的时候,或者进行一些关于网络安全方面的分析的时候,你就需要去收集网络中传输的流量数据,通过收集网络中的传输数据信息,你可以去理解网络协议是怎么工作的,或许还能发现网络中传输的敏感信息。

如果网络协议传输的是明文信息,那很好办,直接用tcpdump 或者wireshark等类似的抓包软件就可以获取网络协议传输的信息内容,但是现在越来越多的协议使用了加密机制,比如HTTPS协议,这时候就需要MITM(中间人攻击)进行拦截加密协议。

现在,只要你打算做网络分析,那么你绝对需要HTTPS/SSL/TLS拦截的相关知识,这应该非常好理解吧?毕竟HTTPS/SSL/TLS的初衷就是加密你的通信。当然了,在拦截TLS通信之前,你还需要解决一些问题。首先,你必须理解中间人攻击(MitM)的工作机制。第二,你还需要了解证书的工作机制以及如何将其安装在你的系统中。第三,你还需要配置你的系统和特定应用来使用这些证书。最后,在真正拦截并显示网络通信数据之前,你还需要浏览一大堆代理文档和配置文件。

在这篇文章中,我会向大家介绍如何在macOS上监听和拦截一个应用的HTTPS加密流量。

概述

拦截HTTPS流量的基本步骤

1)生成一个根证书

2)安装这个根证书

3)用proxychains 去代理指定的app

4)使用mitmproxy 去拦截流量

一些需要安装的软件

安装并配置proxychains

创建一个名为 proxychains.conf 的文件,然后加入以下内容:

其中最重要的一行是“http 127.0.0.1 8080”,这行代码可以让proxychains将应用中所有的流量重定向到127.0.0.1(默认端口号为8080),然后我们就可以用mitmproxy在127.0.0.1:8080 监控所有的流量了。

使用pip安装并配置mitmproxy

执行以下命令运行mitmproxy

接下来就是给系统安装根证书,默认情况下mitmproxy会自动生成一个根证书(mitm-ca-cert.pem),这个根证书位于~/.mitmproxy下面。

安装证书的过程中我们有两个可选项。首先是clicky-clicky方法:

现在按下组合键Command+Space,然后输入“Keychain Access”。接下来,双击mitmproxy-ca-cert.pem进行安装,或者你也可以将它拖到KeychainAccess窗口中。此时你应该可以看到下图所示的界面:

1496978327200059.png

现在证书已经安装完成,但这个证书还不是受信任的证书。为了让系统信任这个证书,我们要右键点击证书,然后选择“Get Info”。点击“Trust扩展“,然后将“When using this certificate”设置为“Always Trust“。界面如下图所示:

1496978428837047.png

接下来, 你还需要执行以下命令,这样系统才能完全信任这个根证书

完成所有的配置之后,你的证书应该与下图所示相似:

1496978531229535.png

开始使用mitmproxy

mitmproxy的手册写的很好,非常详细,这里我就不过多介绍了,因为帮助文档中已经把所有的东西都介绍清楚了,而且所有的操作都很简单。

当然了,如果你此前从未用过mitmproxy的话,你首先需要知道下面这几个快捷键:

  • 1. 通过小键盘的UP和DOWN来导航;

  • 2. 通过“ENTER”键进行选择;

  • 3. 通过“TAB”键在Request、Response和Detail之前进行切换;

  • 4. “Q”键返回;

测试

既然现在proxychains已经配置完成了(指向本地主机),证书也安装好了,mitmproxy也在运行了,那么接下来我们要测试一下我们的工具是否能够正常工作。

现在切换到mitmproxy的运行窗口观察是否有流量被捕获到,结果没有捕获到任何流量记录,这是为什么呢?因为系统App的SIP协议会直接屏蔽掉proxychains。此时你需要使用下面的命令来解决这个问题:

或者你也可以运行命令“brew install wget”,然后将curl替换为wget,因为wget并非系统App。

当你能够在mitmproxy中看到捕获的流量时,这也就意味着一切都差不多搞定了。但我个人还觉得不够,因为我还想代理一些Python代码。

我在req.py文件中添加了下面的代码:

接下来运行命令“pip install requests”,这个脚本的功能跟curl一样,但它能输出的数据更加丰富。接下来让我们测试一下:

看到错误信息,我好像知道了问题的原因了,网络数据被Hook给了mitmproxy,mitmproxy给的证书requests根本不信任啊,因为python 代码根本不知道mitmproxy的根证书在哪儿啊,所以我们只要修改python代码,在get请求中指定mitmproxy的根证书路径即可

如果你还遇到了其他问题的话,可以尝试下面的解决方案:

1.   对于requests模块,你可以设置REQUESTS_CA_BUNDLE指向你的root证书,例如REQUESTS_CA_BUNDLE=/Users/caleb/.mitmproxy/mitmproxy-ca-cert.cer。

2.   对于其他的模块,你可以尝试将SSL_CERT_FILE设置为你root证书的路径。

比如说,你还可以使用第一个版本的req.py(去掉verify参数):

总结

这篇文章只提到了一小部分大家在尝试拦截HTTPS的时候可能会遇到的问题,但大多数情况下大家还是可以按照本文提供的思路在macOS平台上完成对单个App的流量监控。

参考:

http://www.freebuf.com/articles/network/136186.html

http://bobao.360.cn/learning/detail/3960.html

原文:

https://calebfenton.github.io/2017/05/27/monitoring-https-of-a-single-app-on-osx/


发表评论

(必填)

(必填)

(以便回访)