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

抓不住的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根證書。接下來就可以愉快的抓它的包,讀它的心。

在後續文章中,我們將有針對性的舉一些例子,來詳解具體該怎麼做。


本文由encoderlee發表於CSDN博客:https://blog.csdn.net/CharlesSimonyi/article/details/90486208 轉載請註明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章