Fiddler抓包指南:结合Proxifier⼯具
本⽂介绍如何使⽤Fiddler抓取HTTP和HTTPS协议的包,同时还介绍了如何结合Proxifier⼯具来处理Filddler⽆法抓取到包的情况。⼀、HTTP基本抓包
对浏览器的抓包,就不再赘述,打开这个软件就⼀⽬了然了,本⽂主要讲对普通Windows桌⾯应⽤程序的抓包,点击左下⾓的两个⼩图标,让Fiddler进⼊抓包状态,⽽且作⽤于[All Processes]。
Fiddler抓包的原理,实际上就是相当于给windows设置了⼀个HTTP/HTTPS代理,类似于在IE浏览器中设置了代理,如[Internet 选项] — [连接] — [局域⽹设置] — [⾼级]中设置代理 [127.0.0.1:8888],Fiddler在8888端⼝提供HTTP/HTTPS代理服务。 ⼆、HTTPS抓包
麦博m520针对HTTPS的抓包,需要开启Fiddler的HTTPS抓包功能,否则只能看到HTTP请求的内容,因为HTTPS请求的是密⽂。 在Fiddler中点击[Tools] — [Options] — [HTTPS]勾选如下设置:
点击[Actions] — [Trust Root Certificate] 让系统信任Fiddler的根证书,这是HTTPS抓包解密的关键,接下来就可以愉快的观看HTTPS请求明⽂内容了。
KINGXCON三、为什么抓不到有些应⽤程序的HTTP(s)的包?
开启 [All Processes] 抓包后,我们运⾏第三⽅程序,会发现有的HTTP/HTTPS包可以抓到,⽽有的却抓不到,这是怎么回事?那是因为Fiddler的这种设置全局代理的⽅式,只对以下⼏种情况有效:
IE、Chrome等浏览器。
程序使⽤Windows提供的WinInet库进⾏HTTP/HTTPS通信。
程序内嵌WebBrowser,⽐较常⽤的是IE控件和CEF。
例如如果应⽤程序中使⽤的是libcurl库进⾏HTTP(s)请求,则fiddler就抓不到包了(解决⽅法下⾯会介绍),因为libcurl没有使⽤windows 的WinInet库,⽽是⾃⼰实现了http(s)协议的封装。
如果有程序源码,可以在源码中设置Libcurl使⽤fiddler作为本地代理,如:
curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:8888");
四、处理Fiddler⽆法抓到包的情况
4.1 设置代理
pdp上⾯说到了,Fiddler抓包的原理是在本机的8888端⼝开启HTTP/HTTPS代理,任何通过Fiddler代理的HTTP/HTTPS通信内容都会被解析,那么只要能给⽬标程序设置HTTP/HTTPS代理,⽬标程序的HTTP(s)通讯内容就可以被Fiddler抓到。微拟球藻
仔细查看软件设置,其实有些第三⽅软件⽐如 [百度⽹盘] 本⾝是可以设置HTTP/HTTPS代理的,只要设置为Fiddler的代理端⼝即可截获它的HTTP/HTTPS通讯内容。
4.2 结合Proxifier
以 [⽹易有道词典] 为例:
在Proxifier中添加[127.0.0.1:8888] 这个Fiddler提供的HTTPS代理服务器
设置Proxifier规则,让 [⽹易有道词典] 通过代理访问⽹络。
有⼀点设置通常容易被忽略,就是在Proxifier中,设置[Profile] — [Name Resolution] — 勾选 [Resolve hostnames through proxy],让域名解析的⼯作交给代理服务器,⽽不是在Proxifier上解析。默认情况下Proxifier⾃⾏解析域名,⽐如www.baidu解析为180.97.33.108,然后发请求给Fiddler:
CONNECT 180.97.33.108:443 HTTP/1.1
这样Fiddler并不知道它请求的是哪个域名,于是返回给客户端的伪造证书时,伪造的是为180.97.33.108颁发的证书,有的客户端会做校验,发现这个证书是颁发给180.97.33.108的,⽽不是颁发给www.baidu的,然后报错处理。
修改Proxifier设置后,把域名解析的⼯作交给代理服务器,Proxifier会直接向Fiddler发送请求:
CONNECT www.baidu:443 HTTP/1.1
这样Fiddler就知道客户端请求的是 www.baidu,从⽽返回客户端伪造的www.baidu证书,客户端不报错,Fiddler才能顺利抓包解密。
具体设置步骤如下:
4.3 解决Host为“Tunnel to”的问题
Fiddler之所以能抓到并解密HTTPS包的内容,是因为Fiddler使⽤了中间⼈攻击的⼿段,该⼿段要能成功实施,有⼀个前提条件,就是客户端信任Fiddler提供的根证书,之前我们通过[Actions] — [Trust Root Certificate] 让系统信任Fiddler的根证书后,⼤部分浏览器以及基于WinInet库进⾏HTTP通信的程序,都会信任操作系统中我们添加的Fiddler根证书。但如果第三⽅程序使⽤其它HTTP库进⾏通信,⽐
温敏如libcurl,JAVA的URLConnection库,C#的System.Net.Http,Python的requests,这些HTTP库⼀般⾃带了⼀套可信任的SSL根证书,它们不使⽤操作系统⾃带的SSL根证书,更不会使⽤我们向操作系统中添加的Fiddler根证书,于是就验证出错了。
肺透明膜病Requests bundled a set of root CAs that it trusted, sourced from the Mozilla trust store. The certificates were only updated once for each Requests version.下⾯详细给出解决这种问题的2种⽅法:
1. 在请求时禁⽤证书验证。
2. 在请求时,指定⾃⼰⽣成的证书。
4.3.1 请求时禁⽤证书验证
以python为例:
import requests
<("www.baidu", verify = False)
4.3.2 请求时信任⾃⼰的证书
openssl x509 -inform der - -out fiddler.pem
import requests
<("www.baidu", verify ="./fiddler.pem")