写在前面的话
如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定量的网络通信数据。在此之前,我们只需要打开tcpdump就可以查看到所有的明文数据包流量了,但是现在几乎每一个人的网络流量都经过了加密处理,看样子之前的好日子一去不复返了。话虽如此,但现在仍然有很多用户的在线服务账号被黑,而他们的个人信息随后便会在暗网市场<点击阅读原文查看链接>中出售,这又是为何呢?
如今,只要你打算做网络分析,那么你绝对需要HTTPS/SSL/TLS拦截的相关知识,这应该非常好理解吧?毕竟HTTPS/SSL/TLS的初衷就是加密你的通信。当然了,在拦截TLS通信之前,你还需要解决一些问题。首先,你必须理解中间人攻击(MitM)的工作机制<点击阅读原文查看链接>。第二,你还需要了解证书的工作机制以及如何将其安装在你的系统中。第三,你还需要配置你的系统和特定应用来使用这些证书。最后,在真正拦截并显示网络通信数据之前,你还需要浏览一大堆代理文档和配置文件。
在这篇文章中,我将教会大家如何在macOS上监听和拦截单个应用的HTTPS加密流量。
概述
拦截通信流量的步骤大致如下:
1. 生成一个root证书; 2. 安装证书; 3. 使用proxychains来为制定应用提供代理服务; 4. 使用mitmproxy拦截通信数据;
安装proxychains【GitHub主页】,使用命令“brew install proxychains-ng”,别忘了后面的“-ng”:
brewinstall proxychains-ng
创建一个proxychains.conf文件,然后将下列代码添加进去:
strict_chainquiet_modeproxy_dnsremote_dns_subnet224tcp_read_time_out15000tcp_connect_time_out8000[ProxyList]http127.0.0.1 8080
其中最重要的一行是“http 127.0.0.1 8080”,这行代码可以让proxychains将应用中所有的流量重定向到127.0.0.1(端口号为8080),我们将用这个地址运行mitmproxy。
接下来,我们使用pip来安装mitmproxy:
pipinstall --upgrade pip pipinstall mitmproxy # this is all that matters
运行mitmproxy之后,它还可以帮助我们在~/.mitmproxy中生成一个root证书:
./mitmproxy–host
安装证书的过程中我们有两个可选项。首先是clicky-clicky方法:
open~/.mitmproxy
现在按下组合键Command+Space,然后输入“Keychain Access”。接下来,双击mitmproxy-ca-cert.pem进行安装,或者你也可以将它拖到KeychainAccess中。此时你应该可以看到下图所示的界面:
现在证书已经安装完成,但这个证书还不是受信任的证书。为了让系统信任这个证书,我们要右键点击证书,然后选择“Get Info”。点击“Trust扩展“,然后将“When using this certificate”设置为“Always Trust“。界面如下图所示:
第二个安装选项需要在命令行中完成配置:
sudosecurity add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain~/.mitmproxy/mitmproxy-ca-cert.pem
完成所有的配置之后,你的证书应该与下图所示相似:
使用mitmproxy
mitmproxy手册非常的棒,由此可以看出mitmproxy的开发人员在软件和辅助文档上下了苦功夫,所以在此我就不对其进行赘述了,因为帮助文档中已经把所有的东西都介绍清楚了,而且所有的操作都很简单。
当然了,如果你此前从未用过mitmproxy的话,你首先需要知道下面这几个快捷键:
1. 通过小键盘的UP和DOWN来导航; 2. 通过“ENTER”键进行选择; 3. 通过“TAB”键在Request、Response和Detail之前进行切换; 4. “Q”键返回;
既然现在proxychains已经配置完成了(指向本地主机),证书也安装好了,mitmproxy也在运行了,那么接下来我们要测试一下我们的工具是否能够正常工作。
proxychains4-f proxychains.conf curl https://calebfenton.github.io/
你测试之后就会发现,我们并没有得到任何的流量记录,因为系统App的SIP协议会直接屏蔽掉proxychains<点击阅读原文查看链接>。此时你需要使用下面的命令来解决这个问题:
cp`which curl` . proxychains4-f proxychains.conf ./curl https://calebfenton.github.io/
或者你也可以运行命令“brew install wget”,然后将curl替换为wget,因为wget并非系统App。
当你能够在mitmproxy中看到通信流量时,这也就意味着一切都差不多搞定了。但我个人还觉得不够,因为我还想代理一些Python代码。
我在req.py文件中添加了下面的代码:
import requests r =requests.get('https://calebfenton.github.io/') print(r)
接下来运行命令“pip install requests”,这个脚本的功能跟curl一样,但它能输出的数据更加丰富。接下来让我们测试一下:
$proxychains4 python req.py # automatically finds proxychains.conf [proxychains]config file found: /Users/caleb/secret-shit-omg/proxychains.conf [proxychains]preloading /usr/local/Cellar/proxychains-ng/4.12_1/lib/libproxychains4.dylib Traceback(most recent call last): File "req2.py", line 2, in<module> r =requests.get('https://calebfenton.github.io/') File"/usr/local/lib/python2.7/site-packages/requests/api.py", line 71, inget return request('get', url, params=params,**kwargs) File "/usr/local/lib/python2.7/site-packages/requests/api.py",line 57, in request return session.request(method=method,url=url, **kwargs) File"/usr/local/lib/python2.7/site-packages/requests/sessions.py", line475, in request resp = self.send(prep, **send_kwargs) File"/usr/local/lib/python2.7/site-packages/requests/sessions.py", line585, in send r = adapter.send(request, **kwargs) File"/usr/local/lib/python2.7/site-packages/requests/adapters.py", line477, in send raise SSLError(e, request=request) requests.exceptions.SSLError:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)
我们可以修改代码并在requests.get中添加一个verify参数来指向你的证书,这样可以让requests模块信任你的mitmproxy证书:
import requests r =requests.get('https://calebfenton.github.io/',verify='/Users/caleb/.mitmproxy/mitmproxy-ca-cert.pem') print(r)
如果你还遇到了其他问题的话,可以尝试下面的解决方案:
1. 对于requests模块,你可以设置REQUESTS_CA_BUNDLE指向你的root证书,例如REQUESTS_CA_BUNDLE=/Users/caleb/.mitmproxy/mitmproxy-ca-cert.cer。 2. 对于其他的模块,你可以尝试将SSL_CERT_FILE设置为你root证书的路径。
比如说,你还可以使用第一个版本的req.py(去掉verify参数)
$REQUESTS_CA_BUNDLE=/Users/caleb/.mitmproxy/mitmproxy-ca-cert.cer proxychains4python req.py [proxychains]config file found: /Users/caleb/secret-shit-omg/proxychains.conf [proxychains]preloading /usr/local/Cellar/proxychains-ng/4.12_1/lib/libproxychains4.dylib<Response[200]>
总结
这篇文章只提到了一小部分大家在尝试拦截HTTPS的时候可能会遇到的问题,但大多数情况下大家还是可以按照本文提供的思路在macOS平台上完成对单个App的流量监控。