在Day 26:繼電器的控制悖論中,你的室友們想要潛入女生宿舍送宵夜,還拉你下水,但當室友A──眼鏡仔破解門禁系統時,卻觸發了保護機制,結果你、眼鏡仔、毛帽男三人被困在一個女生房間裡。
你們發現房間裡有一個盆栽,上面的樹莓正閃爍著紅色LED亮光,裡面還有一條線連接到DHT22溫溼度感測器。你們發現如果溫度跟濕度達到一定的標準,就會觸發繼電器。你們想盡辦法成功觸發繼電器後,發現這個繼電器連接到風扇的插頭,然後風扇開始緩緩轉動。
你們在風扇後面找到一張紙條,上面寫著要你們用WebCam攝影機拍照,然後用Python程式把照片轉換成ASCII碼,再用GPIO4接腳控制LED燈,讓它閃爍出ASCII碼。
最後,眼鏡仔成功寫出Python程式,接著按下執行。你們三個屏氣凝神觀察著LED燈的閃爍情況。結果發現風扇的扇葉在燈光閃爍下越轉越快,呈現出一個類似鈑手的圖案,似乎暗示著你們要把電風扇拆開。
你們拆開後發現裡面居然藏著一塊電路板!原來,這就是你們在找的隱藏的電路板。你們終於可以用電路板來欺騙門禁系統,讓門禁系統以為你們是合法的使用者,這樣你們就可以逃出密室,看到大漂亮了!
你們拿著電路板,想要找到一個可以連接到門禁系統的接口。你們發現門上有一個小小的孔,裡面有一個 USB 孔。你們猜測這個 USB 孔可能是用來更新門禁系統的軟體或資料的。你們想到可以用電路板來模擬 USB 裝置,然後傳送一些指令給門禁系統,讓它認為你們是合法的使用者。
「我來試試吧!」眼鏡仔說,他把電路板上的一條線接到 USB 插槽上,然後用筆電連接到電路板上的另一條線。他打開筆電,開始在畫面輸入一些 Python 程式碼。
「這是什麼?」毛帽哥問,他看著眼鏡仔輸入的程式碼。
「這是用來模擬 USB 裝置的程式碼。」眼鏡仔說,「我要用 Python 的 pyusb 模組來控制 USB 的通訊協定。」
如果想了解「為什麼要用
Python
的pyusb
模組來控制USB 的通訊協定
」,可以參考我的用Python
的pyusb
模組來控制USB 的通訊協定
的補充,也可以參考阿甘的小窩(2020)寫的這篇文章。
「pyusb
模組可以幹嘛?」毛帽哥又問。
「pyusb
模組可以讓我們用 Python
來操作 USB
裝置,例如讀取和寫入資料,或者發送和接收控制訊號。」眼鏡仔說。
「那要怎麼知道門禁系統要接收什麼指令才會開門呢?」毛帽哥再問。
「我不知道啊。」眼鏡仔說,「所以我要嘗試用不同的指令來測試門禁系統的反應,看看有沒有什麼規律或漏洞。」
「蛤?要是觸發了什麼警報或自毀裝置怎麼辦?」毛帽哥擔心地說。
「我不會亂試啦!」眼鏡仔說,「我會先分析門禁系統的型號和版本,然後查資料看文件,看看有沒有什麼提示或漏洞。」
「那你快啊!時間不多了!」在毛帽哥催促下,眼鏡仔按下執行鍵。
眼鏡仔的程式開始跑了,筆電上跑出一些資訊和訊息。
門禁系統的型號是`RPi-DoorLock V2.0`,版本是 `1.5.3` 。
你們在網路上查了一下,發現這個型號的門禁系統是用 Raspberry Pi
作為核心,還使用了 Flask
當作 Web 框架
,用一個 Web 介面
來管理和控制門禁系統。
「Flask
?這是我們最近在學的嗎?用 Python 寫的輕量級 Web 框架?」毛帽哥說,他想起了前幾天上課,老師好像有講到。
「對啊, Flask
可以快速建立 Web 應用程式
。」眼鏡仔說,「而且 Flask
還可以用 Docker
來部署和運行。」
「 Docker
?那是啥?」毛帽哥問。
「 Docker
是一種使用作業系統等級的虛擬化技術,可以讓我們將程式和函式庫打包成容器,方便遷移和擴展。」你想起之前在前一個密室學到的內容……突然覺得恍如隔世,「我們可以用 Dockerfile
來定義容器的內容和設定,然後用 docker
指令來建立和執行容器。」
「欸!不錯喔!」眼鏡仔用手肘輕輕撞你一下,表示讚美,「剛好我發現了一個漏洞。」
眼鏡仔興奮地說:「你們看這裡,這個門禁系統的 Flask
容器沒有設定密碼或驗證機制,所以我們可以直接訪問它的 Web 介面
,然後用 POST
請求來傳送開門指令。」
如果想了解「用 Docker 架設 Flask Web Server的潛在安全風險」,可以參考我的用 Docker 架設 Flask Web Server的潛在安全風險的補充,以及興趣使然的小胃(2019)寫的這篇文章。