利用Fiddler和Wireshark解密SSL加密流量

原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/

Fiddler是一个著名的调试代理工具,它不仅能解析HTTP,而且还能解析加密的HTTPS流量。Wireshark则是一个非常强大的网络包监控以及协议分析工具。 在本文中,只考虑使用SSL来加密HTTP,所以并不严格区分SSL和HTTPS,虽然从广义上来讲,将二者混为一谈是非常不合理的 。

看到这里,大多数人都会很困惑:Fiddler不就能解密SSL流量吗?为什么还需要Wireshark呢?

是的,在大多数情况下,用Fiddler来解密SSL已经足够了,但在实际使用过程中,我们发现Fiddler在解决HTTP长连接时无能为力。对于特定的应用,比方说Office365的Microsoft MAPI over HTTP,它总是在Outlook和Office365 Exchange server之间维护一个HTTP长连接,并且利用HTTP chunk的特性,在有更新时返回一个chunk来达到实时将server端的变化告知给Outlook的目的。但是Fiddler不能很好地handle这种情况,它总是期望在HTTP response全部返回之后再显示出来。所以,在上述应用中,Fiddler不仅不能实时显示HTTP通信中的内容,而且,即使一个长连接断开之后,它显示的HTTP response也是无效的内容。

所以,我们就想到了Wireshark,它总是能实时监控网络流量。可是我们要监控的HTTP流量是经过SSL加密的,所以它必须要加密SSL流量的private key,才能解密这个SSL流量。因此,直接拦截网络流量是行不通的,因为server端的private key我们无法拿到。

于是,这两种情况综合一下,就促成了我们的解决方案:将Fiddler作为SSL代理以提供private key,然后用Wireshark实时监控以解密流量。

SSL介绍及SSL代理原理

SSL(Secure Socket Layer)是Netscape公司设计用来加密Internet通信流量的,最新版本更名为TLS(Transport Layer Security)。它采用X509证书加密来保证通信的保密性和可靠性。加密采用的证书通常由第三方证书颁发机构颁发,而这些机构是被信任的,也就是说,它们不会利用这些颁发的证书来进行窃听等行为。基于此前提,SSL协议本身能够保证:如果发生了窃听,那么用来加密的证书必定是不受信任的(除非用户将这些证书添加到其受信任证书列表中)。

SSL代理——换种说法,其实就是 Man-in-the-Middle 攻击。SSL代理,即是用自己的证书替代原来server端的证书(SSL虽然支持通信两方都提供证书,但目前绝大多数支持HTTPS的服务,都只是一方认证,即server提供证书,不要求client也提供受信任的证书,所以SSL代理只需要替代server端的证书即可),从而解密流量。但这样一来client端就会发现server端证书不是受信任的,但因为这只是我们自己的测试,所以我们需要信任代理生成的证书。

设置解密环境

要同时使用Fiddler和Wireshark,我们需要两台机器:机器A运行Fiddler作为代理,机器B运行Outlook,并且将系统代理设置成机器A以将所有流量导到机器A。然后在机器B上用Wireshark监听。之所以不能只用一台机器,是因为Wireshark的Windows版本在默认情况下,不支持loopback监听,简单说来,就是对127.0.0.1的监听。之于为什么、以及如何让其实现loopback监听,可以参看这里这里。最终的流程如下所示:

+------------+           +------------+       +-----------------+
| Computer A | Wireshark | Computer B |       |                 |
|            +---------->|            +------>| Exchange Server |
|  Outlook   |           |  Fiddler   |       |                 |
+------------+           +------------+       +-----------------+

设置Fiddler并导出根证书到受信任列表

Fiddler作为一个能够代理所有HTTPS流量的工具,它需要提供所有网站的HTTPS证书。因此,最通用的做法,是自签一个根证书,然后用这个根证书来签发所有domain的证书,作为client,只需要信任这个根证书即可。这个方法也是流行的梯子工具——goagent所采用的。但是,Fiddler自己生成证书的工具 makecert.exe 并不提供导出其生成证书(包括根证书和生成的各个domain的证书)的private key的方法,因此,我们需要安装一个Fiddler的插件—— CertMaker 来代替Fiddler作为证书生成工具,因为这个工具可以看到private key。

CertMaker插件并不影响Fiddler解密SSL的设置,它只是替换了Fiddler默认的证书生成过程。在Fiddler中执行以下设置:

图1. SSL解密设置,这个会自动导入根证书到Windows证书管理器的受信任列表

图2. 打开“允许远程连接”的选项,保存后需要重启Fiddler

别忘了,我们有两台机器,因此,在机器B上面也需要将根证书添加到受信任列表。打开机器B的Windows命令行,输入 certmgr 打开证书管理器,然后将导出的根证书分别添加到Personal和Trusted Root Certification Authorities下面的Certificate里,具体操作为:在Certificate上点击右键,选择"All Tasks"->"Import",然后选择证书存放的位置,确定即可。

导出Fiddler生成证书的private key

在使用了CertMaker插件之后,我们能看到Fiddler的根证书的private key了。 但需要注意的是,我们需要的,不是Fiddler的根证书的private key,而是监视网站的private key。例如,如果我们要监视和https://www.example.com的通信流量,我们需要Fiddler针对这个domain签发的证书的private key 。所以,要做到这点,需要在Fiddler中设置一个属性:

  1. 在Fiddler界面左下角输入框输入 about:config 并回车
  2. 在右侧的about:config标签中添加 fiddler.certmaker.bc.LogPrivateKeys ,并设置为 True

因为在还没有连接要监听的HTTPS网站时,Fiddler是不会自动为其生成证书的,而是在连接之后才会为其生成证书。所以,我们打开Wireshark,然后运行Outlook,在连接Exchange HTTPS服务器之后,Fiddler会为这个domain生成证书,现在在其Log标签页就可以看到这个证书了,是Base64编码的,我们将其拷贝出来,保存成文件。 注意:直接保存到文件不符合pem证书文件的格式,我们需要在文件的开头和结尾分别加上以下内容:

-----BEGIN PRIVATE KEY-----
Base64 encoded private key here
-----END PRIVATE KEY-----

导入private key到Wireshark

在Wireshark中,打开Edit->Preferences->Protocols->SSL,然后点击RSA keys list的Edit按钮,点击New,添加一个新的Rule,IP和Port设置为代理机器A的地址和端口,然后Protocol设置为http,Key File选择我们刚生成的文件,然后确定,如下图:

图3. 在Wireshark中添加新的SSL private key

好了,现在在Wireshark中,是不是就可以看到已经解密的绿色的HTTP流量了呢?

Reference

  1. https://en.wikipedia.org/wiki/Secure_Sockets_Layer
  2. http://wiki.wireshark.org/CaptureSetup/Loopback
  3. http://www.hsc.fr/ressources/articles/win_net_srv/missing_loopback.html
  4. https://fiddler2.com/add-ons
  5. http://security14.blogspot.com/2010/07/how-to-use-fiddler-and-wireshark-to.html
  6. http://www.iprotocolsec.com/2012/11/07/wireshark%E6%8A%80%E5%B7%A7-%E8%A7%A3%E5%AF%86ssl%E5%8D%8F%E8%AE%AE/
  7. https://groups.google.com/forum/#!topic/httpfiddler/lofwICmb7PQ
时间: 2024-07-30 03:31:21

利用Fiddler和Wireshark解密SSL加密流量的相关文章

一个最简单的通过WireShark破解SSL加密网络数据包的方法

原文地址: http://article.yeeyan.org/view/530101/444688 一般来说,我们用WireShark来抓取包进行分析是没有多大问题的.但这里有个问题是,如果你碰到的是用SSL/TLS等加密手段加密过的网络数据的时候,往往我们只能束手无策.在过去的话,如果我们拥有的该传输会话的私钥的话我们还是可以将它提供给WireShark来让其对这些加密数据包进行解密的   1. 简介     相信能访问到这篇文章的同行基本上都会用过流行的网络抓包工具WireShark,用它

解密SSL流量,发现隐藏威胁

加密传输技术进一步得到应用,一方面保护了个人隐私信息,另外一方面也助长了犯罪行为. 随着加密传输技术进一步得到应用,过去的五年中,谷歌.YouTube.推特等大公司使用 SSL 的行为推动了其它互联网企业使用加密连接的热情. 加密传输也带来了风险.由于加密信息对第三方不公开,网络罪犯也可以在不引人注意的情况下从事犯罪活动.他们使用传输层安全协议(Transport Layer Security,TLS)和安全套接层协议(Secure Socket Layer,SSL)加密其通信. 来自 Palo

PHP下SSL加密解密、验证、签名方法(很简单)_php技巧

超级简单,依赖于OpenSSL扩展,这里就不多废话了,直接奉上代码 签名: function sign($data) { //读取私钥文件 $priKey = file_get_contents('key/rsa_private_key.pem'); //转换为openssl密钥,必须是没有经过pkcs8转换的私钥 $res = openssl_get_privatekey($priKey); //调用openssl内置签名方法,生成签名$sign openssl_sign($data, $si

发现藏匿在加密流量中的威胁

加密是保护隐私的一个重要手段,能够保护我们的数据不被窥探,能够阻止犯罪分子窃取我们的信用卡信息.应用的使用习惯或密码. 加密的重要性不言而喻,据最新报告显示,截止今年2月,半数的在线流量均被加密.对于特定类型的流量,加密甚至已成为法律的强制性要求. Gartner认为,到2019年,超过80%的企业网络流量将被加密.虽然这对于重视隐私的用户来说是一个福音,但IT团队将面临着严峻挑战.面对大量涌入的流量,如果没有解密技术,IT团队将无法查看流量内包含的信息. 这意味着加密是一把双刃剑,保护隐私的同

黑客攻破SSL加密 网络安全形势堪忧

本文讲的是黑客攻破SSL加密 网络安全形势堪忧,9月21日消息,据外国媒体报道,研究员发现很多受SSL协议保护的网站都存在严重缺陷,攻击者可利用这些漏洞不知不觉中解密网络服务器和终端用户浏览器之间传输的数据. 这些漏洞存在于1.0版本和较早前TLS或是传输层安全中,它们都是SSL技术之后为互联网提供信用证明的基础.虽然TLS的1.1和1.2版本不容易被感染,但是它们几乎不被浏览器和网站支持,这样Paypal,Gmail等网站的数据传输就变得极为脆弱,容易被黑客利用. 本周即将在布宜诺斯艾利斯举行

Android利用Fiddler进行网络数据抓包

主要介绍Android及IPhone手机上如何利用Fiddler进行网络数据抓包,比如我们想抓某个应用(微博.微信.墨迹天气)的网络通信请求就可以利用这个方法. Mac 下请使用 Charles 代替 Fiddler. 相对于tcpdump配合wireshark抓包的优势在于:(1)无需root (2)对Android和Iphone同样适用 (3)操作更简单方便(第一次安装配置,第二次只需设置代理即可) (4)数据包的查看更清晰易懂,Fiddler的UI更简单明了 (5) 可以查看https请求

SSL加密提高FTP服务器安全性

一般的FTP服务器是以明文方式传输数据的,安全性极差,信息很容易被盗,即使它提供了SSL加密功能,默认情况下也可能没有启用,如大家常用的Serv-U FTP服务器(以下简称Serv-U).为了保证特殊环境下的数据安全,有时是有必要启用SSL功能的.下面笔者以Serv-U服务器为例,介绍如何启用SSL加密功能. 创建SSL证书 要想使用Serv-U的SSL功能,当然需要SSL证书的支持才行.虽然Serv-U 在安装之时就已经自动生成了一个SSL证书,但这个默认生成的SSL证书在所有的Serv-U服

nginx配置ssl加密(单/双向认证、部分https)

nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始采用的是全站加密,所有访问http:80的请求强制转换(rewrite)到https,后来自动化测试结果说响应速度太慢,https比http慢慢30倍,心想怎么可能,鬼知道他们怎么测的.所以就试了一下部分页面https(不能只针对某类动态请求才加密)和双向认证.下面分节介绍. 默认nginx是没有安装ssl模块的,需要编译安装nginx时加入--with

Android利用tcpdump和wireshark抓取网络数据包

主要介绍如何利用tcpdump抓取andorid手机上网络数据请求,利用Wireshark可以清晰的查看到网络请求的各个过程包括三次握手,但相对来说使用Fiddler进行网络数据抓包和展现更方便,优点包括: (1)无需root (2)对Android和Iphone同样适用 (3)操作更简单方便(第一次安装配置,第二次只需设置代理即可) (4)数据包的查看更清晰易懂 (5) 可以查看https请求,建议使用Fillder,具体可见:利用Fiddler进行网络数据抓包. 1.下载并安装tcpdump