基於HTTPS的中間人攻擊-BaseProxy
前言
在上一篇文章BaseProxy:非同步http/https代理中,我介紹了自己的開源專案BaseProxy,這個專案的初衷其實是為了滲透測試,抓包改包。在知識星球中,有很多朋友問我這個專案的原理及實現程式碼,本篇文章就講解一下和這個專案相關的HTTPS的中間人攻擊。
HTTPS隧道代理
HTTPS隧道代理簡單來說是基於TCP協議資料透明轉發,在RFC中,為這類代理給出了規範,Tunneling TCP based protocols through Web proxy servers。瀏覽器客戶端傳送的原始 TCP 流量,代理髮送給遠端伺服器後,將接收到的 TCP 流量原封不動返回給瀏覽器。互動流程如下圖所示:
以連線百度為例,瀏覽器首先發起 CONNECT 請求:
CONNECT baidu.com:443 HTTP/1.1
代理收到這樣的請求後,根據 host 地址與伺服器建立 TCP 連線,並返回給瀏覽器連線成功的HTTP 報文(沒有報文體):
HTTP/1.1 200 Connection Established
瀏覽器一旦收到這個響應報文,就可認為與伺服器的 TCP 連線已打通,後續可直接透傳。
在BaseProxy專案中,https=False
是對於https實行透傳。
HTTPS中間人攻擊
HTTPS 代理本質上是隧道透傳,僅僅是轉發 TCP 流量,無法獲取其中的GET/POST請求的具體內容。這就很麻煩,現在 HTTPS 越來越普遍,做安全測試也就拿不到 HTTP 請求。那怎麼做呢? 代理需要對 TCP 流量進行解密,然後對明文的HTTP請求進行分析,這樣的代理就稱為HTTPS中間人。
正常的HTTPS隧道
在上圖中,隧道代理負責瀏覽器和伺服器之間的TCP流量的轉發。
HTTPS中間人
如果需要對TCP流量進行分析和修改,就要將上圖中的代理功能一分為二,即代理既要當做TLS服務端,又要當做TLS客戶端,如下圖所示。
在上圖中,用一個 TLS 伺服器偽裝成遠端的真正的伺服器,接收瀏覽器的 TLS 流量,解析成明文。這個時候可以對明文進行分析修改,然後用明文作為原始資料,模擬 TLS 客戶端將原始資料向遠端伺服器轉發。
CA證書問題
CA證書是我當時遇到的坑,之前沒接觸過。HTTPS傳輸是需要證書的,用來對HTTP明文請求進行加解密。一般正常網站的證書都是由合法的 CA 簽發,則稱為合法證書。在上圖中,瀏覽器會驗證隧道代理中 TLS 伺服器 的證書:
- 驗證是否是合法 CA 簽發。
- 驗證該證書 CN 屬性是否是所請求的域名。即若瀏覽器開啟
www.baidu.com
,則返回的證書 CN 屬性必須是www.baidu.com
。
對於第一點,合法的 CA 機構不會給我們簽發證書的,否則HTTPS安全性形同虛設,因此我們需要自制CA證書,並匯入到瀏覽器的信任區中。
對於第二點,我們由於需要對各個網站進行HTTPS攔截,因此我們需要實時生成相應域名的伺服器證書,並使用自制的CA證書進行簽名。
BaseProxy原始碼分析
通過以上的講解,HTTPS中間人的原理已經基本清楚,下面簡要地說明一下BaseProxy原始碼。
HTTP伺服器
代理其實就是一個HTTPS伺服器,使用了Python中的HTTPServer類,為了增加非同步特性,將其放到執行緒池中。
class MitmProxy(HTTPServer):
def __init__(self,server_addr=('', 8788),RequestHandlerClass=ProxyHandle, bind_and_activate=True,https=True):
HTTPServer.__init__(self,server_addr,RequestHandlerClass,bind_and_activate)
logging.info('HTTPServer is running at address( %s , %d )......'%(server_addr[0],server_addr[1]))
self.req_plugs = []##請求攔截外掛列表
self.rsp_plugs = []##響應攔截外掛列表
self.ca = CAAuth(ca_file = "ca.pem", cert_file = 'ca.crt')
self.https = https
def register(self,intercept_plug):
if not issubclass(intercept_plug, InterceptPlug):
raise Exception('Expected type InterceptPlug got %s instead' % type(intercept_plug))
if issubclass(intercept_plug,ReqIntercept):
self.req_plugs.append(intercept_plug)
if issubclass(intercept_plug,RspIntercept):
self.rsp_plugs.append(intercept_plug)
class AsyncMitmProxy(ThreadingMixIn,MitmProxy):
pass
HTTPS請求與響應
對HTTP請求的解析與響應,關鍵在於ProxyHandle類,實現其中的do_CONNECT和do_GET方法,並在do_CONNECT方法中判斷是使用透傳模式還是中間人模式。
class ProxyHandle(BaseHTTPRequestHandler):
def __init__(self,request,client_addr,server):
self.is_connected = False
BaseHTTPRequestHandler.__init__(self,request,client_addr,server)
def do_CONNECT(self):
'''
處理https連線請求
:return:
'''
self.is_connected = True#用來標識是否之前經歷過CONNECT
if self.server.https:
self.connect_intercept()
else:
self.connect_relay()
def do_GET(self):
'''
處理GET請求
:return:
'''
......
do_HEAD = do_GET
do_POST = do_GET
do_PUT = do_GET
do_DELETE = do_GET
do_OPTIONS = do_GET
CA證書生成以及代理證書的自簽名
與CA證書相關的內容都放在了CAAuth類中。生成CA證書程式碼如下:
def _gen_ca(self,again=False):
# Generate key
#如果證書存在而且不是強制生成,直接返回證書資訊
if os.path.exists(self.ca_file_path) and os.path.exists(self.cert_file_path) and not again:
self._read_ca(self.ca_file_path) #讀取證書資訊
return
self.key = PKey()
self.key.generate_key(TYPE_RSA, 2048)
# Generate certificate
self.cert = X509()
self.cert.set_version(2)
self.cert.set_serial_number(1)
self.cert.get_subject().CN = 'baseproxy'
self.cert.gmtime_adj_notBefore(0)
self.cert.gmtime_adj_notAfter(315360000)
self.cert.set_issuer(self.cert.get_subject())
self.cert.set_pubkey(self.key)
self.cert.add_extensions([
X509Extension(b"basicConstraints", True, b"CA:TRUE, pathlen:0"),
X509Extension(b"keyUsage", True, b"keyCertSign, cRLSign"),
X509Extension(b"subjectKeyIdentifier", False, b"hash", subject=self.cert),
])
self.cert.sign(self.key, "sha256")
with open(self.ca_file_path, 'wb+') as f:
f.write(dump_privatekey(FILETYPE_PEM, self.key))
f.write(dump_certificate(FILETYPE_PEM, self.cert))
with open(self.cert_file_path, 'wb+') as f:
f.write(dump_certificate(FILETYPE_PEM, self.cert))
根據域名實時生成伺服器證書,並對伺服器證書進行自簽名。程式碼如下:
def _sign_ca(self,cn,cnp):
#使用合法的CA證書為代理程式生成伺服器證書
# create certificate
try:
key = PKey()
key.generate_key(TYPE_RSA, 2048)
# Generate CSR
req = X509Req()
req.get_subject().CN = cn
req.set_pubkey(key)
req.sign(key, 'sha256')
# Sign CSR
cert = X509()
cert.set_version(2)
cert.set_subject(req.get_subject())
cert.set_serial_number(self.serial)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(31536000)
cert.set_issuer(self.cert.get_subject())
ss = ("DNS:%s" % cn).encode(encoding="utf-8")
cert.add_extensions(
[X509Extension(b"subjectAltName", False, ss)])
cert.set_pubkey(req.get_pubkey())
cert.sign(self.key, 'sha256')
with open(cnp, 'wb+') as f:
f.write(dump_privatekey(FILETYPE_PEM, key))
f.write(dump_certificate(FILETYPE_PEM, cert))
except Exception as e:
raise Exception("generate CA fail:{}".format(str(e)))
最後
關注公眾號:七夜安全部落格
- 回覆【1】:領取 Python資料分析 教程大禮包
- 回覆【2】:領取 Python Flask 全套教程
- 回覆【3】:領取 某學院 機器學習 教程
- 回覆【4】:領取 爬蟲 教程
知識星球已經50多人了,隨著人數的增多,價格之後會上漲,越早關注越多優惠。星球的福利有很多:
- 比如上面的教程,已經提前在知識星球中分享
- 可以發表一些問題,大家一塊解決
- 我之後寫的電子書,錄製的教學視訊,對於知識星球的朋友都是優惠的(基本上免費)
- 一些節假日會給大家發個紅包或者贈書
相關推薦
基於HTTPS的中間人攻擊-BaseProxy
前言 在上一篇文章BaseProxy:非同步http/https代理中,我介紹了自己的開源專案BaseProxy,這個專案的初衷其實是為了滲透測試,抓包改包。在知識星球中,有很多朋友問我這個專案的原理及實現程式碼,本篇文章就講解一下和這個專案相關的HTTPS的中間人攻擊。 HTTPS隧道代理 HTTPS隧道代
中間人攻擊之劫持HTTPS明文數據
滲透測試 https 中間人劫持攻擊 修復建議 敏感數據的安全傳輸是網絡安全技術的一個重要的組成部分,多數認為只有https是最好的實踐,姑且不考慮ssl證書的價格,至少https也不是絕對安全的,當遭受中間人劫持攻擊的時候也會獲取到傳輸中的明文數據,具體攻擊原理見《HTTPS連接過程以及中間
BaseProxy:異步http/https中間人
response 默認 chrom version 下載 安裝ca證書 image www. 參考 BaseProxy 異步http/https代理,可攔截並修改報文,可以作為中間人工具.僅支持py3.5+.項目地址:BaseProxy。 意義 BaseProxy項目的本意
https 不會被中間人攻擊——因為中間人即使拿到了數據,也是加密的
https height 狀態 進行 style 被人 是你 pan lin 只要你登陸了一個使用 HTTPS 數據加密的網站,瀏覽的頁面的內容如果被人中途看見,將會是一團亂碼。它也能保證,你瀏覽的頁面就是你想瀏覽的,不會被黑客在中途修改,網站收到的數據包也是你最初發的那個
Android中Https通訊實現_中間人攻擊、DNS欺騙和會話劫持
上一篇文章記述了在Android中使用Https進行單向認證的配置,但單向認證存在中嚴重的安全漏洞,其中最容易受到中間人攻擊和DNS欺騙以及會話劫持,本文主要講述進行中間人攻擊、DNS欺騙和會話劫持的方式。 概覽 什麼是中間人攻擊 模擬中間人攻擊
BaseProxy:非同步http/https中間人
BaseProxy 非同步http/https代理,可攔截並修改報文,可以作為中間人工具.僅支援py3.5+.專案地址:BaseProxy。 意義 BaseProxy專案的本意是為了使HTTP/HTTPS攔截更加純粹,更加易操作,學習成本更低。 在Python領域,中間人工具非常強大和成功的是MitmProx
遠程桌面協議中間人攻擊漏洞解決方案
com 選擇 右鍵 ima log font 技術 終端服務 fips 1.啟動“終端服務配置” 2.選擇“連接”,看到“RDP-Tcp”,在其上右鍵,選擇“屬性” 3.“常規”選項卡,將加密級別修改為“符合FIPS標準”,點擊應用 4.重啟主機(?)
【安全牛學習筆記】SSL、TLS中間人攻擊
信息安全 security+ ssl tls ╋━━━━━━━━━━━━━━━━━╋┃SSL中間人攻擊 ┃┃攻擊者位於客戶端和服務器通信鏈路中┃┃ ARP
2017-2018-2 20155315《網絡對抗技術》免考四:中間人攻擊
win TE mtp redirect libev tool 無需 echo 百度網站 原理 中間人攻擊(Man-in-the-Middle Attack, MITM)是一種由來已久的網絡入侵手段,並且在今天仍然有著廣泛的發展空間,如SMB會話劫持、DNS欺騙等攻擊都是典
ARP欺騙與MITM(中間人攻擊)例項
ARP協議(address resolution protocol):地址解析協議 一臺主機和另一臺主機通訊,要知道目標的IP地址,但是在區域網中傳輸資料的網絡卡卻
MTIM(中間人攻擊)
所謂的MITM攻擊就是通過攔截正常的網路通訊資料,並進行資料篡改和嗅探,而通訊的雙方卻毫不知情。 資訊篡改 當 主機A、和主機B通訊時,都由主機C來為其“轉發”,如圖一,而A、B之間並沒有真正意思上的直接通訊,他們之間的資訊傳遞同C作為中介來完成,但是A、B卻不會意識到,而以為它們之間是
mitmf 中間人攻擊簡單演示
mitmf 是一款用來進行中間人攻擊的工具,它可以結合 BeEF 一起來使用,並利用 BeEF強大的 hook 指令碼來控制目標客戶端。 下面讓我們一起看看如何在 Kali2.0上安裝與使用 mitmf 。mitmf預設在Kali2.0上並未安裝,在之前的版本有安裝。 Ka
中間人攻擊——ARP欺騙的原理、實戰及防禦(轉載)
1.1 什麼是閘道器 首先來簡單解釋一下什麼是閘道器,閘道器工作在OSI七層模型中的傳輸層或者應用層,用於高層協議的不同網路之間的連線,簡單地說,閘道器就好比是一個房間通向另一個房間的一扇門。 1.2 ARP協議是什麼 ARP(Address Resolution Protoco
kali arp中間人攻擊
先用nmap找到目標(或zenmap等等) nmap -sP 192.168.0.1-200 192.168.0.105  
中間人攻擊工具ettercap
中間人攻擊工具ettercap (一).簡介 (二).模組劃分 1.Snifer 2.MITM 3.Filter 4.Log 5.Plugin (三).特性 (四).使用者操作介面 (五).指定目標 (六)許可權 (七)基於偽造證書的SSL MITIM (
web 滲透 --- SSL、TLS中間人攻擊
目錄 利用方法 偽造證書 ARP欺騙 偽造成功 安裝證書 一、SSL、TLS中間人攻擊 攻擊者位於客戶端和伺服器通訊鏈路中 利用方法 手動修改閘道器 修改DNS設定 修改HOSTS檔案【高於DNS】
HTTPS 降級攻擊的場景剖析與解決之道
HTTPS 一定安全麼 HTTP 協議,本身是明文傳輸的,沒有經過任何安全處理。那麼這個時候就很容易在傳輸過程中被中間者竊聽、篡改、冒充等風險。這裡提到的中間者主要指一些網路節點,是使用者資料在瀏覽器和伺服器中間傳輸必須要經過的節點,比如 WIFI 熱點,路由器,防火牆,反
ettercap 實施中間人攻擊
oca strip 不能 lte ane 嗅探 顯示 nic 二進制 中間人攻擊(Man-in-the-MiddleAttack 簡稱"MITM攻擊")中間人攻擊很早就成為了黑客常用的一種古老的攻擊手段,並且一直到如今還具有極大的擴展空間,在網絡安全方面
MySQL曝中間人攻擊Riddle漏洞,可致用戶名密碼洩露
針對MySQL 5.5和5.6版本的Riddle漏洞會經由中間人攻擊洩露使用者名稱密碼資訊。請儘快更新到5.7版本。 Riddle漏洞存在於DBMS Oracle MySQL中,攻擊者可以利用漏洞和中間人身份竊取使用者名稱和密碼。 “Riddle是一個在Oracle MySQL 5.5和5.6客戶
JAX-RS RESTful webservice 服務端及客戶端實現(基於HTTPS雙向認證)
在ApacheCXF的Sample裡以及網上很多有關RESTful HTTPS雙向認證的文章介紹僅僅是理論,沒有涉及實際環境的實現(客戶端和服務端都是localhost);這幾天使用Apache的CXF以及 Apache portable HttpClient實現跨IP的J