1. 程式人生 > >基於HTTPS的中間人攻擊-BaseProxy

基於HTTPS的中間人攻擊-BaseProxy

前言

在上一篇文章BaseProxy:非同步http/https代理中,我介紹了自己的開源專案BaseProxy,這個專案的初衷其實是為了滲透測試,抓包改包。在知識星球中,有很多朋友問我這個專案的原理及實現程式碼,本篇文章就講解一下和這個專案相關的HTTPS的中間人攻擊。

HTTPS隧道代理

HTTPS隧道代理簡單來說是基於TCP協議資料透明轉發,在RFC中,為這類代理給出了規範,Tunneling TCP based protocols through Web proxy servers。瀏覽器客戶端傳送的原始 TCP 流量,代理髮送給遠端伺服器後,將接收到的 TCP 流量原封不動返回給瀏覽器。互動流程如下圖所示:

HTTP權威指南

以連線百度為例,瀏覽器首先發起 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隧道

HTTPS隧道

在上圖中,隧道代理負責瀏覽器和伺服器之間的TCP流量的轉發。

HTTPS中間人

如果需要對TCP流量進行分析和修改,就要將上圖中的代理功能一分為二,即代理既要當做TLS服務端,又要當做TLS客戶端,如下圖所示。

HTTPS中間人

在上圖中,用一個 TLS 伺服器偽裝成遠端的真正的伺服器,接收瀏覽器的 TLS 流量,解析成明文。這個時候可以對明文進行分析修改,然後用明文作為原始資料,模擬 TLS 客戶端將原始資料向遠端伺服器轉發。

CA證書問題

CA證書是我當時遇到的坑,之前沒接觸過。HTTPS傳輸是需要證書的,用來對HTTP明文請求進行加解密。一般正常網站的證書都是由合法的 CA 簽發,則稱為合法證書。在上圖中,瀏覽器會驗證隧道代理中 TLS 伺服器 的證書:

  1. 驗證是否是合法 CA 簽發。
  2. 驗證該證書 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)))

最後

關注公眾號:七夜安全部落格

d929ae9a466c0f5e20148d538bbc8e17.png

  • 回覆【1】:領取 Python資料分析 教程大禮包
  • 回覆【2】:領取 Python Flask 全套教程
  • 回覆【3】:領取 某學院 機器學習 教程
  • 回覆【4】:領取 爬蟲 教程

知識星球已經50多人了,隨著人數的增多,價格之後會上漲,越早關注越多優惠。星球的福利有很多:

  • 比如上面的教程,已經提前在知識星球中分享
  • 可以發表一些問題,大家一塊解決
  • 我之後寫的電子書,錄製的教學視訊,對於知識星球的朋友都是優惠的(基本上免費)
  • 一些節假日會給大家發個紅包或者贈書

3899727832f58c3e9359943ed9a2e047.png

相關推薦

基於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