你們拆開後發現裡面居然藏著一塊電路板!原來,這就是你們在找的隱藏的電路板。你們終於可以用電路板來欺騙門禁系統,讓門禁系統以為你們是合法的使用者,這樣你們就可以逃出密室,看到大漂亮了!
你們想到可以用電路板來模擬 USB
裝置(用 Python
的 pyusb
模組來控制 USB
的通訊協定),然後傳送一些指令給門禁系統,讓它認為你們是合法的使用者。你們還分析門禁系統的型號和版本,嘗試找到提示或漏洞。你們發現這個型號的門禁系統是用 Raspberry Pi
作為核心,還使用了 Flask
當作 Web
框架,用一個 Web
介面 來管理和控制門禁系統。這個門禁系統的 Flask
容器沒有設定密碼或驗證機制,所以你們打算用Docker
直接訪問它的 Web
介面,然後用 POST
請求來傳送開門指令。
如果想了解為什麼可以「用
Docker
直接訪問它的Web
介面,然後用POST
請求來傳送開門指令」,可以參考我的用 Docker 架設 Flask Web Server的潛在安全風險的補充,以及參考興趣使然的小胃(2019)翻譯的這篇文章,原文為Luke Paris(2019)寫的這篇文章。
「剛好我發現了一個漏洞。」眼鏡仔興奮地說,「你們看這裡,這個門禁系統的 Flask
容器沒有設定密碼或驗證機制,所以我們可以直接訪問它的 Web
介面,然後用 POST
請求來傳送開門指令。」
「我猜可能是設計門禁系統的時候對自己設計的系統太有自信了。」眼鏡哥繼續說著他的猜測,「她認為我們不知道 Flask 容器
的 IP 位址
和 PORT 號碼
,肯定沒辦法駭入系統。」
「那我們有辦法找出Flask 容器
的 IP 位址
和 PORT 號碼
嗎?」毛帽哥半信半疑地說,「還是這其實是陷阱?」
「我們可以用Docker exec
這個Docker 指令
,來找出Flask 容器
的 IP 位址
和 PORT 號碼
嗎?」你問,「我記得Docker exec
可以在運行中的容器內執行任意命令,例如 docker exec -it <container_id> ip addr show
可以顯示容器的IP 位址
。」
「那我們要先取得 Docker 容器
的存取權限才可以。」眼鏡仔說,「如果我們沒有取得 Docker 容器
的存取權限,也沒辦法用 docker inspect
指令或 docker port
指令來查出容器的 IP 位址
和 PORT 號碼
。因為這些指令需要在 Docker 主機上執行,而且需要有相應的權限。」
關於「
Docker exec
指令」,可以參考小賴(2022)寫的這篇文章。
關於「docker inspect
指令」,可以參考Enoxs(2021)寫的這篇文章。
關於「docker port
指令」,可以參考阿展展展(2021)寫的這篇文章。
「還是我們試試看用 Python
的 requests 模組
來發送 HTTP 請求
,然後用 try-except 語句
來捕捉錯誤和異常。」毛帽哥提議,「如果發送請求成功,就表示找到了正確的 IP 位址
、 PORT 號碼
、還有能夠成功回應的 URL
;如果發送請求失敗,就表示找錯了或者沒有回應。」
關於「
requests
發送HTTP請求
」,可以參考plusone(2018)寫的這篇文章。
- 作者從基本的安裝、使用、到進階的
header 設定
等方面,詳細說明了如何用requests
發送和接收HTTP 請求
。- 作者還舉了一些實例,如如何用
requests
爬取 Google 搜尋結果,並將其儲存為HTML 檔案
。