APP有用HTTPS傳輸,但資料還是被偷了。
iOS+MacOS 使用 mitmproxy 進行中間人攻擊(Man-in-the-middle attack) 嗅探API傳輸資料教學及如何防範?
前言
前陣子剛在公司辦完一場內部的 CTF競賽 ,在發想題目時回想起大學時候還在做後端(PHP)時經手的專案,一個集點的APP,大概就是有個任務列表,然後觸發條件完成就Call API獲得點數;老闆認為Call API有經過HTTPS加密傳輸資料就很安全了 — 直到我向他展示中間人攻擊,直接嗅探傳輸資料,偽造API呼叫獲得點數….
再加上最近幾年大數據崛起,網路爬蟲滿天飛;爬蟲攻防戰日漸白熱化,爬取與防爬之間花招百出,只能說道高一尺魔高一丈啊!
爬蟲的另一條下手對象就是APP的API,如果沒有任何防範幾乎等於門戶大開;不但好操作而且格式也乾淨,更不容易被識別阻擋;所以如果網頁端已經費盡全力阻擋,資料還是不段被爬,不妨檢查一下APP的API有無漏洞。
因為這個議題我不知道該如何出在 CTF比賽中 ,所以就單拉出一篇文章作為紀錄 ;本篇只是粗淺給個概念 — HTTPS能透過憑證替換進行傳輸內容解密、如何加強安全性防止;實際網路理論不是我的強項也都還給老師了,如果已經有這方面概念的朋友就不用花時間看這篇,或拉到底看APP該如果保護!
實際操作
環境: MacOS + iOS
Android 使用者可以直接下載 Packet Capture (免費)、iOS 用戶可使用 Surge 4 這套軟體(付費)解鎖中間人攻擊功能、MacOS也可以使用另一套付費軟體Charles。
本文章主要講解iOS使用免費的 mitmproxy 進行操作,如果您有上述的環境就不用這麼麻煩啦,直接APP打開在手機上掛載VPN替換掉憑證就能進行中間人攻擊!(ㄧ樣請直接下拉到底看該如何保護!)
[2021/02/25 更新]:Mac 有新的免費圖形化介面程式 (Proxyman) 可以用,可搭配參考此篇文章的第一部分。
安裝 mitmproxy
直接使用 brew 安裝:
brew install mitmproxy
安裝完成!
p.s 如果你出現 brew: command not found 請先安裝 brew 套件管理工具:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
mitmproxy 使用
安裝完成後,在 Terminal 輸入以下指令啟用:
mitmproxy
讓手機跟Mac在同個區域網路內&取得Mac的IP位址
方法(1) Mac 連接 WiFi、手機也使用同個 WiFi
Mac的IP位址 = 「系統偏好設定」->「網路」->「Wi-Fi」->「IP Address」
方法(2) Mac 使用有線網路,開啟網路分享;手機連上該熱點網路:
Mac的IP位址 = 192.168.2.1 (️️注意⚠️ 不是乙太網路網路的IP,是Mac用做網路分享基地台的IP)
手機網路設置WiFi — Proxy伺服器資訊
這時網頁打不開、出現憑證錯誤是正常的;我們繼續往下做…
安裝 mitmproxy 自訂 https 憑證
如同上述所說,中間人攻擊的實現方式就是在通訊之中使用自己的憑證做抽換加解密資料;所以我們也要在手機上安裝這個自訂的憑證。
1.用手機safari打開 http://mitm.it
⚠️到這裡還沒結束,我們還要去關於裡啟用描述檔
完成!這時我們再回去瀏覽器就能正常瀏覽網頁了。
回到Mac 上操作 mitmproxy
常用操作按鍵集:
「 ? 」= 查看按鍵操作集文檔
「 k 」/「⬆」= 上
「 j 」/「⬇」= 下
「 h 」/「⬅」= 左
「 l 」/「➡️」️= 右
「 space 」= 下一頁
「 enter 」= 進入查看詳情
「 q 」= 返回上一頁/退出
「 b 」= 匯出response body到指定path文字檔
「 f 」= 篩選紀錄條件
「 z 」= 清除所有紀錄
「 e 」= 編輯Request(cookie、headers、params...)
「 r 」= 重新發送Request
不習慣CLI? 沒關係,可以改用 Web GUI !
除了 mitmproxy 啟用方式之外,我們可以改下:
mitmweb
就能使用新的 Web GUI 進行操作觀察
重頭戲,嗅探APP資料:
上述環境都建置完成也熟悉之後,就可以進入我們的重頭戲;嗅探APP API的資料傳輸內容!
這邊以某房屋APP作為範例,無惡意純學術交流使用!
我們想知道物件列表的API是如何請求和回傳什麼內容!
開啟目標 APP 嘗試「下拉重整」或觸發「載入下一頁」的動作。
🛑若你的目標APP打不開、連不上;那抱歉了,代表APP有做防範無法用這招嗅探,請直接下拉到如何保護的章節🛑
回到 mitmproxy 查看紀錄,發揮偵探的精神猜測哪個API請求紀錄是我們想要的並進入查看詳細!
Request 部分可以看到 請求傳遞了哪些參數
搭配「e」編輯與「r」重新發送,並觀察 Response 就可以猜到每個參數的用途囉!
Response 也能直接獲得原始回傳內容。
🛑若Response內容是一堆編碼;那也抱歉了,代表APP可能有自己再做一次加解密無法用這招嗅探,請直接下拉到如何保護的章節🛑
很難閱讀?中文亂碼?沒關係,這邊可以用「b」匯出成文字檔到桌面,再將內容複製到Json Editor Online解析即可!
*或是直接使用 mitmweb 使用 web gui 直接瀏覽、操作
經過嗅探、觀察、過濾、測試之後就能知道APP API的運作方式,藉此就能利用,用爬蟲爬取資料。
*蒐集完所需資訊記得關閉mitmproxy、手機網路Proxy代理伺服器改回自動,才能正常使用網路。
APP 該如何自保?
若掛上 mitmproxy 之後發現APP不能用、回傳內容是編碼,代表APP有做保護。
做法(1):
大略是將憑證資訊放一份到APP中,若當前HTTPS使用的憑證與APP中的資訊不符則拒絕訪問,詳細可以看此或找SSL Pinning相關資源。缺點可能就是要注意憑證有效期的問題吧!
作法(2):
APP端在資料要傳輸前先進行編碼加密,API後端收到後解密取得原始請求內容;API回傳內容一樣先進行編碼加密,APP端收到資料後解密取得回傳內容;步驟很煩瑣也耗效能,但的確是個方法;據我所知好像某數字銀行就是用這招進行保護!
不過….
作法1,依然有破解方法:如何在iOS 12上绕过SSL Pinning
作法2,透過反編譯工程也能獲得編碼加密用的密鑰
⚠️沒有100%的安全⚠️
或是乾脆挖個洞讓它爬,邊搜集各種證據,再用法務解決(?
還是那句話:
「 NEVER TRUST THE CLIENT」
mitmproxy 的更多玩法:
1.使用mitmdump
除 mitmproxy
、mitmweb
,mitmdump
可直接將所有紀錄匯出到文字檔中
mitmdump -w /log.txt
並且能使用玩法(2)python程式,設定、篩選流量:
mitmdump -ns examples/filter.py -r /log.txt -w /result.txt
2.搭配python程式做請求參數設定、訪問控制、轉址:
from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
# pretty_host takes the "Host" header of the request into account,
# which is useful in transparent mode where we usually only have the IP
# otherwise.
# 請求參數設定 Example:
flow.request.headers['User-Agent'] = 'MitmProxy'
if flow.request.pretty_host == "123.com.tw":
flow.request.host = "456.com.tw"
# 將123.com.tw的訪問全導到456.com.tw
轉址範例
啟用mitmproxy時加上參數:
mitmproxy -s /redirect.py
or
mitmweb -s /redirect.py
or
mitmdump -s /redirect.py
補個坑
在使用 mitmproxy 觀察使用 HTTP 1.1 及 Accept-Ranges: bytes、 Content-Range 長連接片段持續拿取資源的請求時,會等到 response 全部回來才會顯示,而不是顯示分段、使用持久連接接續下載!
踩坑在這。
延伸閱讀
後記
因為我沒有網域權限無法取得ssl憑證資訊,所以也無法實作;看程式碼感覺並不困難,雖然沒有100%安全的方法,但多一道防護至少能更安全一些,再繼續攻需要花費很多時間研究,應該能勸退90%的爬蟲了!
這篇文章可能有點含金量太低,medium荒廢了一陣子(跑去玩單眼),主要為本週六日(2019/09/21–2019/09/22)的 iPlayground 2019 提前熱熱寫文手感;期待今年的議程🤩,希望回來後能吸收產出更多精品文章!
[2019/02/22 更新文章] iPlayground 2019 是怎麼樣的體驗?
有任何問題及指教歡迎與我聯絡。