如何在macOS上监听单个应用HTTPS流量

写在前面的话

如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定量的网络通信数据。在此之前,我们只需要打开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的流量监控。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-06-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维一切

玩静态资源加密验证 原

###背景 为了防止裸奔的静态图片和相关的附件被用户拿来随意拼装下载,需要研究特定的用户对特定资源的授权访问方案。当前为了满足大量用户的访问,web服务一般都有...

1242
来自专栏FreeBuf

ct-exposer:通过搜索CT日志发现子域

证书透明度(Certificate Transparency)是谷歌力推的一项拟在确保证书系统安全的透明审查技术。其目标是提供一个开放的审计和监控系统,可以让任...

1282
来自专栏菩提树下的杨过

[原创]x.509证书在WCF中的应用(Web/IIS篇)

在上一篇"x.509证书在WCF中的应用(CS篇)"里,我们知道了如何在应用程序中,利用x.509证书来验证WCF的消息安全(没看过的朋友建议先看下,地址htt...

2245
来自专栏FreeBuf

BT5 + wireshark玩wifi捕获和中间人攻击

前言:先说明一下,这个文章不是我写的,是一个老外(Deepanshu Kapoor)安全专家写的,我一开始就是看着玩,但整个看完被老外那个细心和耐心给打动了,整...

2835
来自专栏魏艾斯博客www.vpsss.net

补充记录腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书需要注意的几点

刚写完了腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书这篇教程,感觉中间有几点是新手需要注意的,申请 SSL 泛域名...

5734
来自专栏编程一生

一个请求过来都经过了什么

1764
来自专栏数据和云

Oracle Data Redaction数据加密

Oracle Database 12c中加入了Data Redaction作为一个新的安全特性。(实际在11g的官方Database Advanced Secu...

4075
来自专栏FreeBuf

浅析加密DNS(附子域名爆破工具)

本文章简单介绍一下两种加密DNS协议:DNS over HTTPS 和 DNS over TLS。这两种协议主要为了解决DNS带来的隐私和中间人篡改问题。

2992
来自专栏静晴轩

Http和Https的区别

今天大家一起聚于会议室听一个同事的分享,中途需要联网的时候,网络状态良好竟不能访问该网址,那些年也是接触过网络的我看了下懵了,旁边一大牛瞬间即解决了(将地址前的...

3744
来自专栏企鹅号快讯

Tomcat的设置HTTP页面自动跳转到HTTPS

HTTP转换到HTTPS常见的解决方案是部署SSL证书来升级。只有正确部署了SSL证书才能使用安全的HTTPS。但有时候,客户端使用HTTP进行访问时,HTTP...

3855

扫码关注云+社区

领取腾讯云代金券