Proxifier+Fiddler 抓取PC客户端数据包

0x00 目的

抓取PC客户端的数据包

(以客户端软件”网易有道词典“演示客户端抓包,默认是抓不到的)

 

0x01 Fiddler抓不到数据原因

Fiddler为什么抓不到PC端数据包,只能抓取:

  • 浏览器数据包

  •  程序使用WinInet库进行HTTP/HTTPS通讯

  • 程序内嵌Webbrower

(如果程序没有使用Windows提供的WinInet库进行HTTP通讯,而是自带的库,直接 在内部实现HTTP包的封装和拆解,最终直接调取操作系统的socket api发送数据。操作系 统就无法给他们设置HTTP/HTTPS代理,因此Fiddler抓不到数据)

 

0x02、查看PC应用是否使用WinInet库进行通信

》》listdlls下载

https://docs.microsoft.com/zh-cn/sysinternals/downloads/listdlls

# 列出有道是否使用了WinInet库进行通信 

》》query process

Proxifier+Fiddler 抓取PC客户端数据包

 

》》有道翻译词典使用的Windows提供的WinInet库进行HTTP通信

Proxifier+Fiddler 抓取PC客户端数据包

 

0x03强行配置代理之-Proxifier

介绍:socks5客户端,可以让不支持通过代理服务器工作的网络程序通过HTTPS或

SOCKS代理或代理链 

原理:使用Windows提供的正规接口,通过安装WinSockLSP模块过滤/转发

TCP/UDP包

 

0x04 抓取PC端“网易有道词典”数据包

》》官网下载proxifier

https://www.proxifier.com 

》》安装安装版本后,输入激活码(应用收费)

Proxifier+Fiddler 抓取PC客户端数据包

 

》》安装完成效果

Proxifier+Fiddler 抓取PC客户端数据包

 

》》配置代理服务器

Proxifier+Fiddler 抓取PC客户端数据包

 

》》添加配置

Proxifier+Fiddler 抓取PC客户端数据包

 

》》代理成功

Proxifier+Fiddler 抓取PC客户端数据包

 

》》配置代理规则

Proxifier+Fiddler 抓取PC客户端数据包

Proxifier+Fiddler 抓取PC客户端数据包

 

(配置好代理规则如下:)

Proxifier+Fiddler 抓取PC客户端数据包

 

# DNS配置

》》点击>Profile >Name Resolution

Proxifier+Fiddler 抓取PC客户端数据包

》》取消勾选“自动检测DNS设置”选择勾选“通过代理解析主机名”
(Tips:域名解析工作交给代理服务器,防止proxifier解析域名后传给服务器的是ip,有
cdn的服务器不知道真正的域名)

 

》》有道词典抓包成功:

参考文章

https://www.52pojie.cn/thread-976016-1-

1.html#26506016_%E6%8A%93%E5%8C%85%E6%95%88%E6%9E%9C

[Windows] Windows抓包指南①:Proxifier+Fiddler对第三方程序强制抓包 

    [复制链接]

Windows抓包指南①:Proxifier+Fiddler对第三方程序强制抓包 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

HOW & WHY

关于Fiddler抓包的文章在网上已经一搜一大把了,但大多数是讲对浏览器的抓包,主要用于分析WEB站点内容,而本文侧重于普通Windows桌面应用程序的HTTP/HTTPS抓包。

网上大部分文章,大多只告诉你How,没有告诉你Why。HTTPS不是加密的吗,为什么Fiddler还能抓到包?我按照网上的文章使用Fiddler抓包,为什么有的程序抓得到,有的程序抓不到?有的程序可以抓到,但是似乎只能抓到一部分,关键的HTTP请求都没有抓到,这是怎么回事?我们该怎么办?本文尽可能的把How和Why讲清楚,并通过后面不断的更新来完善它,在不断的学习和积累中,弄清楚更多东西,抓到更多的包。

抓包的重要性

网络抓包,是软件逆向分析的重中之重,很多时候我们拿到一个软件,不知道从何入手分析,往往是从抓包开始,先弄清楚他与服务器通信的内容,如果一目了然,我们完全可以照搬,自行写一个程序来模拟,如果有一些加密字段和随机字段,也不用担心,我们可以从抓包中了解到一些关键的URL和session之类的信息,然后再分析代码的时候,这些字符串可以帮助我们更快的定位关键代码所在之处。

趋势

现在的Windows桌面应用程序越来越喜欢直接在窗口上放一个Webbrowser或者CEF,直接使用HTML/CSS/Javascript构建用户界面,然后使用HTTP/HTTPS协议与服务器通信,如果该软件同时有WEB界面的话,更是可以直接复用同一个后端,这样使得客户端和服务端的开发效率大大提高,同时也有很好的移植型性。对于逆向分析者来说是好事,至少省去了自定义协议分析这一关,尤其是让人恶心的二进制协议。

Fiddler的使用

Fiddler简直是HTTP抓包分析的神器,比Chrome等浏览器自带的调试工具高不知道哪去了,浏览器自带的调试工具,基本只能查看包内容,而Fiddler除了查看,还可以针对不同类型的内容进行格式化,观赏效果真的不要太爽。除了“看”数据包,它还可以一键重发HTTP请求,修改请求内容并重发HTTP请求,拦截修改数据包,返回预设的欺骗性内容等,还可以编写脚本进行更高级的自动化处理。

废话不多说,到Fiddler官网下载安装:https://www.telerik.com/fiddler

 

 

对浏览器的抓包,就不再赘述,打开这个软件就一目了然了,本文主要讲对普通Windows桌面应用程序的抓包,点击左下角的两个小图标,让Fiddler进入抓包状态,而且作用于[All Processes]。实际上这相当于给windows设置了一个HTTP/HTTPS代{过}{滤}理,相当于在IE的 [Internet 选项] — [连接] — [局域网设置] — [高级] 中设置了代{过}{滤}理 [127.0.0.1:8888],Fiddler在8888端口提供HTTP/HTTPS代{过}{滤}理服务。

 

 

接下来,我们要开启Fiddler的HTTPS抓包功能,否则只能看到HTTP请求的内容,而HTTPS请求则是密文。
在Fiddler中点击 [Tools] — [Options] — [HTTPS] 勾选如下设置:

 

 

点击 [Actions] — [Trust Root Certificate] 让系统信任Fiddler的根证书,这是HTTPS抓包解密的关键,Fiddler对HTTPS包解密的原理是中间人攻击,对客户端声称自己的服务端,对服务端声称自己的客户端,两头欺骗。当然要想欺骗成功,前提是让客户端信任自己的根证书。接下来就可以愉快的观看HTTPS请求明文内容了。

抓包的条件

开启 [All Processes] 抓包后,我们运行第三方程序,会发现有的HTTP/HTTPS包可以抓到,有的抓不到,这是怎么回事?那是因为Fiddler的这种设置全局代{过}{滤}理的方式,只对以下几种情况有效:

  • IE Chrome等浏览器
  • 程序使用WinInet库进行HTTP/HTTPS通信
  • 程序内嵌Webbrowser

这也很好理解,如果程序没有使用Windows提供的WinInet库进行HTTP通信,而是自带了一个库,比如VC程序使用libcurl,JAVA程序使用JDK中的URLConnection或第三方OkHttp,C#使用System.Net.Http等,这些库在程序内部实现了HTTP包的封装与拆解,那么最终他们将直接调用操作系统的socket api发送数据,操作系统当然就没法给他们设置HTTP/HTTPS代{过}{滤}理了。所以Fiddler在这里其实有很大局限性,但如果比较幸运,你要分析的第三方程序,使用WinInet通信或者内嵌了Webbrowser,你仍然可以这样对它进行HTTP/HTTPS抓包分析。

 

 

一个典型的例子就是 [招商银行专业版] PC网银客户端,你可以用 [depends] 工具查看它是否依赖WININET.DLL,如果依赖,它很有可能使用它进行HTTP/HTTPS通信。

 

 

也可以用VisualStudio自带的工具 [spy++] 查看是否内嵌Webbrowser控件,如果有内嵌,则Webbrowser中的内容可以用Fiddler抓包。

当然,有的程序也有例外,比如Python的requests包,如果你用Fiddler设置了全局代{过}{滤}理,而Python程序使用requests进行通信而没有在代码里设置HTTP/HTTPS代{过}{滤}理,则requests默认会使用系统全局代{过}{滤}理通信,从而能在Fiddler中看到Python程序的HTTP通信内容。至于其它编程语言和类库实现的程序,是否会被Fiddler设置的全局代{过}{滤}理影响,由于没法一一去测试,还需要大家的反馈,汇集结果。

抓不到包怎么办

不满足上述条件的第三方程序,没法用Fiddler抓包,也许我们只能放弃。要知道有一句话叫“抓不住的流沙,学会放手,留不住的人心,学会忘记”。既然抓不住,说明她不属于你,那么无论你做什么事情都是无谓的,搞去搞来,最终你仅仅是感动了自己而已,对于她来说,你从头到尾什么都不是,无足轻重,也许离开你的她会更开心。但如果你确信她是你命中注定的那个包,就一定要把她抓住,没有条件就去创造条件,努力未必会成功,但不努力注定失败。那如何创造条件去抓住她的包呢?

给它设置代{过}{滤}理

上面说到了,Fiddler抓包的原理是在本机的8888端口开启了HTTP/HTTPS代{过}{滤}理,任何通过Fiddler代{过}{滤}理的HTTP/HTTPS通信内容都会被解析,那么只要能给目标程序设置HTTP/HTTPS代{过}{滤}理,目标程序的HTTP通讯内容就会乖乖的出现在Fiddler里。

 

 

仔细查看软件设置,其实有些第三方软件比如 [百度网盘] 本身是可以设置HTTP/HTTPS代{过}{滤}理的,只要设置为Fiddler的代{过}{滤}理端口即可截获它的HTTP/HTTPS通讯内容。但是有的第三方软件就是没有代{过}{滤}理功能,怎么办?

强行设置代{过}{滤}理

伟大领袖毛主席曾经说过:有条件要上,没有条件创造条件也要上!

既然它不支持设置代{过}{滤}理,我们就借助其它软件给它设置代{过}{滤}理,比如:
Proxifier: https://www.proxifier.com
SocksCap64:https://www.sockscap64.com/sockscap64-official-homepage-chinese

这两款软件都可以让任意程序通过HTTPS/SOCKS5代{过}{滤}理访问网络,其中SocksCap64使用黑科技API HOOK技术,HOOK了Windows Sockets API,然后把所有的TCP/UDP包通过代{过}{滤}理转发。而Proxifier则是正规军,使用了Windows提供的正规接口,通过安装WinSock LSP模块过滤/转发TCP/UDP包,当然此处还是推荐Proxifier,稳定性和兼容性更好。SocksCap64依赖API HOOK和DLL注入技术,但不是所有程序都随便给你注入的,比如腾讯TP保护下的游戏客户端,所以兼容性和可用性不如Proxifier。不过Proxifier是收费的商业软件,不过有30天免费试用,以及网上随便一搜一大把的激活码,你懂的。

接下来,我们拿 [网易有道词典] 开刀,强行给它设置代{过}{滤}理,看看它是怎么和服务器通讯的。

 

 

在Proxifier中添加 [127.0.0.1:8888] 这个Fiddler提供的HTTPS代{过}{滤}理服务器

 

 

设置Proxifier规则,让 [网易有道词典] 通过代{过}{滤}理访问网络

一个重要的设置

 


 

还有一点设置通常容易被忽略,就是在Proxifier中,设置 [Profile] — [Name Resolution] — 勾选 [Resolve hostnames through proxy],让域名解析的工作交给代{过}{滤}理服务器,而不是在Proxifier上解析。默认情况下Proxifier自行解析域名,比如www.baidu.com解析为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.com的,然后报错处理。
修改Proxifier设置后,把域名解析的工作交给代{过}{滤}理服务器,Proxifier会直接向Fiddler发送请求:

CONNECT www.baidu.com:443 HTTP/1.1

这样Fiddler就知道客户端请求的是 www.baidu.com,从而返回客户端伪造的www.baidu.com证书,客户端不报错,Fiddler才能顺利抓包解密。

抓包效果

接下来就是对  [网易有道词典] 抓包的结果:

 

 

Perfect!

所有HTTP通信内容历历在目,点击 [翻译] 按钮,它发送了什么内容,服务器返回什么内容清晰可见。接下来稍作分析,就可以用Python直接向这个URL发送HTTP请求,提交翻译文本,就可以拿到翻译结果了。

这下,你知道很多程序,官方没有提供API的情况下是怎么实现功能的了吧。当然有道翻译是提供了OpenAPI的,虽然API服务是收费的,但是并不贵。分析有道词典的通信协议其实意义并不大,但是分析其它各种各样的第三方软件呢,这么大的脑洞,就留给你来填吧,嘿嘿。。。

未完待续

不要高兴得太早,如果所有程序都那么容易分析就好了,显示中你还会遇到各种各样莫名其妙的情况,有的第三方软件,你用这个方法去抓HTTP/HTTPS包,会出现一些意想不到的情况,比如程序表现为无法联网、功能不正常,Fiddler中抓到的HTTPS包仍然是加密的,无法解密,等等。这些问题需要根据情况一点一点去分析,在下一篇文章中,我们来讲一讲常见的一些无法抓包的异常情况,以及处理办法。。。

《Windows抓包指南②:Fiddler抓不到的包是怎么回事?》

本文由encoderlee发表于CSDN博客:https://blog.csdn.net/CharlesSimonyi/article/details/90383486 转载请注明出处

 

 

Windows抓包指南②:Fiddler抓不到的包是怎么回事?_fiddler抓不到微信的包-CSDN博客

抓不住的HTTPS包

《Windows抓包指南①:Proxifier+Fiddler对第三方程序强制抓包》

回顾上一篇文章,我们使用Proxifier将第三方程序的所有TCP流量导向Fiddler的HTTPS代理,于是Fiddler便可以解析HTTP/HTTPS协议的通信内容,倒是在实际使用过程中,我们会发现HTTP请求解析没有问题,但是有的第三方程序,无法解析其HTTPS通信内容,表现为Fiddler中能看到Tunnel to 443端口,但是就没有下文了,同时,程序表现为无法联网,出错等提示,无法正常工作。
在这里插入图片描述

分析原因

知己知彼,百战不殆。要搞清楚是怎么回事,最好的办法就是自己写一个程序,进行HTTPS请求,然后通过此方法抓自己的包,看看哪个地方出错。于是用最简单的Python代码进行测试:

import requests
requests.get("https://www.csdn.net")

然后用Proxifier+Fiddler对它强制抓包,发现Python程序抛出了异常,

Traceback (most recent call last):
File “C:\Python36\lib\site-packages\urllib3\contrib\pyopenssl.py”, line 453, in wrap_socket
cnx.do_handshake()
File “C:\Python36\lib\site-packages\OpenSSL\SSL.py”, line 1907, in do_handshake
self._raise_ssl_error(self._ssl, result)
File “C:\Python36\lib\site-packages\OpenSSL\SSL.py”, line 1639, in _raise_ssl_error
_raise_current_error()
File “C:\Python36\lib\site-packages\OpenSSL_util.py”, line 54, in exception_from_error_queue
raise exception_type(errors)
OpenSSL.SSL.Error: [(‘SSL routines’, ‘tls_process_server_certificate’, ‘certificate verify failed’)]

SSL证书验证错误,所以可以理解,其它第三方程序内部也应该抛出了异常,而无法正常联网,无法正常工作。之前说到,Fiddler之所以能抓到并解密HTTPS包的内容,是因为Fiddler使用了中间人攻击的手段,该手段要能成功实施,有一个前提条件,就是客户端信任Fiddler提供的根证书,之前我们通过 [Actions] — [Trust Root Certificate] 让系统信任Fiddler的根证书后,大部分浏览器以及基于WinInet库进行HTTP通信的程序,都会信任操作系统中我们添加的Fiddler根证书。但如果第三方程序使用其它HTTP库进行通信,比如VC程序使用libcurl,JAVA程序使用JDK中的URLConnection或第三方OkHttp,C#使用System.Net.Http,Python使用requests,这些HTTP库一般自带了一套可信任的SSL根证书,它们不使用操作系统自带的SSL根证书,更不会使用我们向操作系统中添加的Fiddler根证书,于是就验证出错了。
以Python为例,这一点可以在requests文档中得到证实:
https://2.python-requests.org/en/master/user/advanced/#ca-certificates

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.

解决办法

那么解决的办法有两种,一种是让HTTP客户端禁用证书验证:

import requests
requests.get("https://www.csdn.net", verify = False)

一种是让HTTP客户端信任Fiddler根证书
在这里插入图片描述
访问 http://127.0.0.1:8888 下载Fiddler根证书,用openssl转换成Python requests支持的格式:

openssl x509 -inform der -in FiddlerRoot.cer -out fiddler.pem

让Python的HTTP客户端信任它:

import requests
requests.get("https://www.csdn.net", verify = "./fiddler.pem")

然后Fiddler就能顺利抓到该程序的HTTPS包并解密

然并卵?

至此我们通过自己写程序,自己抓自己的包,搞清楚了为什么在抓第三方程序的时候,有的HTTPS包抓不到,也无法解密的原因,我们也找到了两种解决办法,一种是让目标程序禁用SSL验证,一种是让目标程序信任Fiddler根证书。
到这里,有的小伙伴就要吐槽了,我要抓的目标程序,又不是我写的,我也没有它的代码,怎么可能修改它,让它禁用SSL验证或者信任Fiddler根证书?

有解

在分析目标程序的时候,我们通过反编译目标程序,大致搞清楚目标程序使用的是什么HTTP Client库,一般很少有程序会自行实现一个HTTP Client,大多是使用语言标准库自带的或者第三方开源的HTTP Client库。比如VC一般使用WinInet或WinHttp,C#一般使用System.Net.Http,Java一般使用URLConnection或OkHttp,基本都八九不离十,再结合反编译确定下来以后,通常这些HTTP Client都是开源的,即使不开源,那API都是公开的,我们不难找到这个库如何禁用SSL验证,如何信任指定根证书的方法。然后就可以通过反编译、重编译,APIHook,Dll注入,Shellcode等手段,让目标程序禁用SSL验证或信任Fiddler根证书。接下来就可以愉快的抓它的包,读它的心。

在后续文章中,我们将有针对性的举一些例子,来详解具体该怎么做。

posted @ 2024-03-25 11:27  CharyGao  阅读(648)  评论(0编辑  收藏  举报