資訊科技 (IT) 領域的網路安全奪旗競賽 (CTF) 經常在世界各地舉行,但專注於營運技術 (OT) 的 CTF 仍然相對罕見且較難以接觸。與強調網路應用程式或網路漏洞的傳統 IT CTF 不同,OT CTF 挑戰圍繞著諸如 PLC、SCADA、RTU 和工業控制系統 (ICS) 等系統。這些情境要求參與者具備專業的 ICS 知識,以識別漏洞、利用錯誤配置以及防禦常見於電網、製造環境、運輸和水處理設施中的關鍵基礎設施。OT CTF 提供了一個獨特的機會,可以彌合 IT 和 OT 安全之間的差距,將網路安全技能與對 Modbus、DNP3、S7Comm 和 IEC 61850 等工業協定的深入理解相結合。
關鍵基礎設施安全對決 (CISS) 是少數幾個每年為參與者提供專用 OT CTF 平台的國際活動之一,該活動在新加坡科技設計大學 (SUTD) 舉行,並由 iTrust 研究中心組織。CISS 提供了一個絕佳的機會,匯集全球 CTF 專家來應對實際的 OT 網路安全挑戰。如需更多詳細資訊,請瀏覽 CISS 2024 website。
在本文中,我將介紹我為去年 CISS 設計的 IT-OT 混合挑戰之一(該挑戰是 CISS 2024 中最受歡迎的三個挑戰之一),並逐步說明解決它的步驟。如果您有興趣參加 OT CTF 競賽,請不要錯過即將到來的 CISS 2025:https://itrust.sutd.edu.sg/ciss-2025/。
# Author: Yuancheng Liu
# Created: 2024/06/02
# version: v_0.1.3
挑戰介紹:Palantir Control
每年,CISS CTF 都會推出一個富有創意的故事情節,以激發挑戰設計。2024 年的版本採用了「The Orthanc Obstacles」的主題,該主題基於The Lord of the Rings: The Two Towers。(如下圖 CISS2024 海報和獎牌所示)
Figure-00 CISS2024 海報和獎牌截圖
在這種情況下,我設計的挑戰—Palantir Control—取材於薩魯曼使用 Palantír 控制 Orthanc Tower 的標誌性場景,如下圖所示:
Figure-01 The Lord of the Ring Saruman
這個挑戰模擬了一個迷你 OT ICS 環境(SCADA 層網路),以說明基於 IT 的網路攻擊如何破壞和崩潰 OT 系統。它具有可程式邏輯控制器 (PLC) 和一個遠端控制介面(例如 HMI),該介面模擬了一個簡化的 SCADA 系統。參與者的任務是使用 IT 滲透技術來滲透網路、提升權限,並最終操縱 OT 系統以檢索旗標。
在 Palantir Control 挑戰中,參與者將經歷多個攻擊階段:
-
IT 滲透 – 網路掃描
-
IT 滲透 – UDP 連接埠探測
-
IT 漏洞利用 – HTTP 網路伺服器 CGI 漏洞
-
IT 攻擊 – 網路管理員密碼暴力破解
-
OT 攻擊 - PLC 錯誤配置利用
-
OT 攻擊 – PLC 錯誤資料注入
這個挑戰不僅強調了跨 IT 和 OT 領域的技術技能,還反映了現實世界的風險,即 IT 層的妥協可能導致 OT 故障。準備好突破 Orthanc 並揭開隱藏在其網路牆內的秘密。這個挑戰是基於我的 PLC Honey Pot 專案之一設計的:https://www.linkedin.com/pulse/python-plc-honeypot-project-yuancheng-liu-vks8c
挑戰背景故事和問題
CTF 挑戰背景故事
在艾辛格的陰影下,白袍薩魯曼利用了 Palantír 的黑暗力量,這是一個神秘的黑色水晶球,可以遠端控制位於 Orthanc Tower 頂端的火焰之眼。隨著他發出的每一個命令,眼睛都會移動和燃燒,引導他無情的半獸人軍隊走向統治。
但希望仍然存在。在甘道夫的秘密情報的武裝下,山姆和佛羅多開始了一項危險的任務,以破壞薩魯曼的邪惡控制系統。他力量的關鍵在於一個隱藏的營運技術 (OT) 網路:
-
Orthanc Tower 內的一個可程式邏輯控制器 (PLC) 根據傳入的遠端命令操縱眼睛。
-
一個遠端控制器,由薩魯曼透過 Palantír 操作,使用專用的 OT 協定傳送這些命令。
-
眼睛的狀態透過 PLC 保持暫存器改變,薩魯曼透過 Palantír 的回應資料監控回饋。
為了阻止黑暗的蔓延,哈比人必須迅速採取行動,如下圖所示:
Figure-02 挑戰背景故事概述
-
山姆必須滲透到塔中,突破控制系統,並操縱火焰之眼背後的邏輯。
-
佛羅多必須冒著一切風險接近薩魯曼的領地,並揭開一個隱藏的後門,以直接從黑色水晶中提取資料。
只有透過破壞這個關鍵的控制鏈,他們才能拯救中土世界免於毀滅。
CTF 挑戰問題
挑戰 1 – 山姆的任務 [IT 挑戰]
目標:幫助山姆滲透到 Orthanc Tower 中,並揭開控制系統的內部運作。
任務:
-
掃描網路以識別 Orthanc Tower Controller (PLC)。
-
找到該裝置的基於網路的管理介面。
-
繞過身份驗證以存取內部配置資料。
旗標位置:隱藏在 PLC 網路介面中,可能編碼或嵌入在診斷或配置頁面中。
挑戰 2 – 佛羅多的任務 [OT 挑戰]
目標:協助佛羅多破壞薩魯曼和 Orthanc Tower 之間的通訊。
任務:
-
發現薩魯曼透過 Palantír 使用的遠端 OT 控制器。
-
與之互動以檢索營運資料。
-
執行錯誤資料注入或類似的破壞以操縱火焰之眼的行為。
旗標位置:嵌入在控制器的回饋資料中,在破壞其正常運作後可存取。
🖧 網路配置
網路配置部分將不會提供給參與者,他們需要使用網路掃描工具來找出網路拓撲,並且每個團隊的配置可能不同。
這個挑戰環境由三個虛擬機器 (VM) 組成—兩個用於 IT-OT 模擬,一個用於參與者存取。所有 VM 都放置在同一個子網路中,以允許直接通訊。拓撲如下所示:
Figure-03 挑戰環境網路拓撲
IP 位址配置:
-
PLC 控制器(遠端控制程式)IP:
172.23.155.208
-
PLC 裝置 IP:
172.23.155.209
-
參與者 VM IP:
172.23.144.1
在這個挑戰中,參與者與一個模擬的 IT-OT 環境互動,該環境模擬了一個簡化的 SCADA 系統。設定包括:
-
一個透過 Modbus-TCP 控制的 PLC 裝置
-
一個充當薩魯曼 Palantír 介面的遠端控制器 VM
-
一個交易 VM (Ubuntu 20.04),該 VM 之前已遭到入侵
關鍵情境詳細資訊
-
遠端控制器定期向 PLC 發送 Modbus-TCP 指令,根據 PLC 梯形邏輯觸發動作(例如,線圈啟動)。
-
參與者可以存取 IT 支援工程師 VM,並具有完整的
sudo
權限,但無法直接存取以監控或控制 PLC。 -
但是,遠端控制器公開了一個開放的 UDP 連接埠,參與者可以與之互動以查詢 PLC 的目前運作狀態(例如,輸出線圈狀態)。
-
參與者必須編寫一個自訂的 UDP 用戶端,以從控制器提取即時狀態資料。
-
使用 IT 滲透和 OT 操縱技術,參與者將嘗試破壞或更改 PLC 的預期行為,以便控制器收到意外或錯誤的回應。
最終目標是導致邏輯故障或不一致,使遠端控制器產生狀態錯誤代碼,其中包含旗標。
挑戰設計
參與者將使用 transaction VM 安裝工具或開發自定義攻擊腳本,這些工具對於與 IT-OT 環境交互和利用至關重要。雖然高級別的系統工作流程控制著交互順序,但在 CTF 期間不會向參與者公開,如下所示:
Figure-04 Challenge environment system workflow diagram
挑戰的核心集中在一個 PLC 模擬器上,它執行一個隱藏的階梯邏輯例程。PLC 模擬器 VM 向網絡公開兩個關鍵服務:
-
Modbus-TCP Service: Port
TCP:502
-
Web Interface (HTTP): Port
TCP:5000
每 2 秒,測試環境模擬一個 OT 操作週期:
-
遠程控制器 VM 隨機從其內部數據庫加載預定義的 PLC 保持寄存器配置和相應的預期線圈輸出狀態。
-
它發送一個 Modbus-TCP 寫入請求,以更新 PLC 模擬器中的保持寄存器。
-
PLC 模擬器更新其內部寄存器值,執行其階梯邏輯,並相應地更新其線圈輸出狀態。
-
然後,遠程控制器查詢 PLC 的線圈,以驗證響應是否與預期結果匹配。
-
基於此匹配,遠程控制器確定 PLC 測試是通過還是失敗。
✅ 正常操作(測試通過):
如果 PLC 以正確的線圈狀態響應,則認為系統運行正常。當參與者發送包含 getstate
的 UDP 數據包到 remote controller 的 UDP:3000
端口時,他們將收到如下響應:
state:normal;;;...
❌ 故障情況(測試失敗):
如果 PLC 的響應與預期的線圈輸出不匹配,則遠程控制器會標記錯誤。在這種情況下,當參與者發送 getstate
到 UDP:3000
時,他們將收到:
state:error;{error-code-xxxxxxxxxxxxxxxx}
{error-code}
是 CTF flag。
如果通信挑戰斷開連接,控制器將響應消息 "PLC rejected connection
"。
如果參與者沒有發送正確的字符串 "getstate",控制器將響應 "Error: Input request invalid
" 。
🎯 挑戰目標
CTF 參與者必須創建一個攻擊,導致 PLC 的輸出狀態偏離預期結果,從而在遠程控制器中觸發錯誤情況。
範例情境:
-
控制器將 PLC 的 8 個保持寄存器設置為:
[0, 1, 1, 0, 1, 0, 0, 1]
-
階梯邏輯應產生輸出線圈 1 - 4 為:
[1, 0, 0, 1]
-
如果遠程控制器讀取到:
[1, 0, 1, 1]
這些線圈,它會標記錯誤並通過 UDP 返回 flag。但是參與者需要快速讀取,因為 1 秒後控制器將重置並開始另一個新的循環執行。
參與者必須發現如何破壞邏輯鏈——無論是通過錯誤配置、競爭條件、未經授權的輸入還是注入——以便 PLC 以不正確的線圈狀態響應。我們留出兩秒鐘讓參與者進行錯誤數據注入攻擊,大約一秒鐘讓他們讀取 flag,時鐘時間間隔如下所示:
Figure-05 Inject time stamp and the clock time interval diagram
解決挑戰的步驟
現在讓我們詳細了解解決挑戰的步驟。參與者需要先解決 IT 挑戰,然後才能開始進行 OT 挑戰部分。
解決 Sam 的任務 [IT 挑戰]
步驟 1:發現 PLC Web 和 Modbus-TCP 服務
首先使用 fping
或任何 nmap 主機掃描方法識別子網上的活動主機。識別後,掃描可疑的 PLC IP 以枚舉其打開的端口:
nmap -sS -Pn -T5 -p- 172.23.155.209
典型的掃描會顯示 PLC VM 上打開的 Modbus-TCP (port 502) 和 HTTP Web Interface (port 5000),如下所示:
Figure-06 Nmap port scan result
由於 transaction VM 是 Ubuntu-server 版本(沒有桌面),您需要將 Web 界面端口轉發到您的本地機器:
ssh -L 127.0.0.1:5000:172.23.155.209:5000 -J @ @172.23.144.1
現在,在本地瀏覽器上打開 URL http://127.0.0.1:5000
以導航到 PLC 的 Web 界面。參與者可以瀏覽故事和挑戰介紹頁面,如下所示:
Figure-07 Challenge PLC VM web interface home page
步驟 2:調查 Web UI 並找到隱藏的提示 1
從 Web 閱讀挑戰詳細信息後,單擊頂部導航欄中的“登錄”按鈕以查看登錄表單:
Figure-08 Challenge PLC VM web interface authorization page
現在您需要暴力破解密碼,但在那之前,您需要弄清楚用戶名是什麼。圖片中 Orc 的消息突出了 Saruman,如果您嘗試 saruman
(或其他通用帳戶,例如 admin
)以及一些密碼,例如“1234567
”,該站點會返回登錄拒絕消息:Login account does not exist
。
Figure-09 Challenge PLC VM web interface login fail screen shot
一定有一些關於帳戶的線索,再次查看登錄頁面,底部有一個可疑的下拉按鈕,標記為“Gandalf's Message”。當下拉框展開時,我們可以得到一些消息,如下所示:
Figure-10 Challenge PLC VM web interface login page Gandalf's Message
看看這個字符串,似乎 Gandalf 沒有提供任何有用的消息,但是等等,他消息下的“線”看起來很可疑!也許 Gandalf 的消息已損壞,讓我們檢查一下 Web 源代碼:
Figure-11 Challenge PLC VM web interface login page html source
這條“線”實際上是一個名為 hint01
的5 像素高的圖像。檢查頁面源代碼以顯示圖像:
Figure-12 Challenge PLC VM web interface login page reveal Gandalf's Message
是的!現在 Gandalf 出現並給我們一個打開門的 URL:
http://tower_ip:5000/userlogin/xxxx/xxxx
如果參與者在瀏覽器中嘗試此 URL,它會顯示憑證是否正確,如下所示:
http://172.23.155.209:5000/userlogin/Saruman/xxxx
這會傳回登入錯誤:User name or password incorrect!
(如下所示)
Figure-13 Challenge PLC VM login API test
這確認了端點有效並支援基於 URL 的憑證注入,但此 URL 仍然沒有用!因為它與登入頁面相同,我是否遺漏了什麼?讓我們檢查新的網頁原始碼:
Figure-14 Challenge PLC VM login CGI response source
有一個無法訪問的段落:
Sarumanscrow said:
Sarumanscrow said:
Sarumanscrow
可能是有效的用戶名嗎?嘗試使用它登入:
Figure-15 Find the correct login user name
登入拒絕錯誤變更為 User password incorrect!
。我們可以確認有一個用戶帳戶 "Sarumanscrow" 可用於登入 PLC 網站。
步驟 3:暴力破解密碼並檢索 Flag
有了已發現的用戶名 (Sarumanscrow
),並且確認了憑證注入端點,您現在可以使用 Python 執行基於字典的暴力破解攻擊:
import time
import urllib
import urllib.request
ipAddr = "172.23.155.209"
passwordDictFile = "solveCTFScripts\\10-million-password-list-top-1000000.txt"
passwordList = []
with open(passwordDictFile, 'r') as fh:
passwordList = fh.readlines()
for password in passwordList:
password = password.strip()
url = "http://%s:5000/userlogin/Sarumanscrow/%s" %(ipAddr, password)
response = urllib.request.urlopen(url)
message = str(response.read())
print(message)
if 'User name or password incorrect!' in message:
time.sleep(0.1)
continue
else:
print("Find password: %s" %str(password))
break
在實際的 CTF 中,密碼是從字典中隨機選擇的。例如,在此測試執行中,它是 admin
,如下所示:
Figure-15 Brute force attack to get the password
成功驗證身份後,PLC 網頁介面將變更為登入狀態,並且 PLC 網頁介面將以藍色顯示祝賀訊息:
“恭喜,您已解決 IT 挑戰。從頁面中搜尋 flag。”
簡介下方的左側導覽列將顯示烈焰之眼控制和歐散克塔控制,如下所示:
Figure-17 Challenge PLC VM web interface login successful
當參與者切換到烈焰之眼控制 (PLC 階梯邏輯頁面) 時,將找到 IT 挑戰 flag:
Figure-18 Find the IT challenge flag in the Fiery Eye Control page
我們可以取得 IT 挑戰 flag CISS2024_SAM_FLAG(在實際比賽中,這將是一個隨機產生的 flag 字串)
- 現在 IT 挑戰已解決!
解決佛羅多的任務 [OT 挑戰]
步驟 1:發現控制器的 UDP 服務
根據 PLC 階梯邏輯頁面中的階梯邏輯網頁 Hints02
(如下所示),參與者需要在 PLC 控制器節點 (172.23.155.208) 上找到已開啟的 UDP 服務埠,以取得目前的 PLC 操作驗證狀態。
Figure-19 Get the hint02 from the PLC web
為此,建立一個簡單的 Python 腳本來掃描控制器 VM 上的 UDP 埠,如下所示:
import time
from socket import *
host = "172.23.155.208"
s = socket(AF_INET, SOCK_DGRAM)
for port in range(10,65532):
try:
print("Try port %s" %str(port))
data = b"Test Message"
s.sendto(data,(host,port))
s.settimeout(1)
print ((s.recvfrom(1024)))
print("Find opened port: %s" %str(port))
break
except:
pass
執行 UDP 埠掃描程式並取得結果:
Try port 2991
Try port 2992
Try port 2993
Try port 2994
Try port 2995
Try port 2996
Try port 2997
Try port 2998
Try port 2999
Try port 3000
(b'Error: input request invalid: Test Message', ('172.23.155.208', 3000))
Find opened port: 3000
已確認 UDP 埠 3000 已開啟。
步驟 2:建立 UDP 客戶端連線到 PLC 控制器
有了已發現的 UDP 服務埠,請使用階梯邏輯頁面中的 Hint03(如下所示)將 getstate
字串傳送到控制器 VM 並檢索 PLC 狀態:
Figure-20 Get the hint03 from the PLC web
您可以使用攻擊腳本 https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/blob/main/Modbus_PLC_Simulator/src/udpCom.py 作為範例,以持續傳送 UDP 訊息:
Figure-21 Get the normal response from PLC controller VM
執行客戶端將傳回線圈 C0 到 C3 的目前狀態。如果 PLC 線圈結果驗證通過,控制器將識別 PLC 運作正常,您將在回應訊息中看到「正常」世界。
步驟 3:建立錯誤資料注入 (FDI) 攻擊腳本
OT 挑戰要求參與者覆寫 PLC 保持暫存器以引起故障。根據 OT 挑戰 flag 提示:參與者需要弄亂 PLC 操作,以使遠端控制器偵測到 PLC 工作錯誤,然後讀取錯誤代碼。現在,參與者切換到 PLC 階梯邏輯頁面以了解階梯邏輯,以下是在階梯邏輯中使用的 8 個 PLC 保持暫存器 [HR0 - HR7](如下所示):
Figure-22 Analyze the PLC ladder logic diagram
如果參與者可以在某些暫存器中注入錯誤資料,則輸出可能會變更。例如,如果變更狀態 HR6,HR0 或 HR7 可能會變更線圈的輸出,因為它們位於「AND」閘邏輯中。(如果在「OR」閘邏輯中變更暫存器的單一狀態,例如 HR1,HR4 可能不會影響輸出,等效電路圖如下所示)
Figure-23 Analyze the circuit diagram
參與者可以使用 https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/blob/main/Modbus_PLC_Simulator/src/modbusTcpCom.py 作為範例,建立簡單的 PLC FDI 攻擊腳本程式來覆寫保持暫存器的值。
但是,如果他們僅直接執行腳本,則會顯示攻擊失敗訊息(暫存器值變更請求遭到拒絕):
Figure-24 PLC false data injection failed
問題是攻擊 VM 的 IP 172.23.144.1
不在 PLC 暫存器「允許讀取」和「允許寫入」IP 位址清單中。因此,所有錯誤資料注入請求都會遭到 PLC 拒絕。
點擊滑桿上的 "Orthanc Tower Control",它會變成如下所示的 "PLC Configuration",參與者需要在允許寫入的 IP 位址中新增攻擊 VM 的 IP(如下所示):
Figure-25 Challenge PLC VM web configuration page
在文字欄位中填寫攻擊 VM 的 IP 位址,然後按下綠色的 "Add" 按鈕,攻擊者的 IP 將被新增到允許寫入的 PLC 位址清單中,如下所示:
Figure-26 Add the allow write IP address to PLC configuration
現在參與者可以再次執行攻擊程式,他們可以看到設定結果返回 true,FDI 攻擊程式正在更改 PLC 的 holding register 的值:
Figure-27 PLC false data injection accepted
現在可以使用偽造資料注入攻擊程式了。
步驟 4:觸發控制器錯誤並檢索 OT 標誌
要完成挑戰:
-
也將transaction VM 的 IP 新增到 Allow Read IP List,以便我們可以取得 holding register 狀態
-
修改您的腳本為:
-
讀取
HR0–HR7
的目前值 -
反轉每個位元 (1 → 0, 0 → 1)
-
將反轉的值寫回 PLC
-
這將扭曲線圈輸出,並且控制器邏輯將檢測到異常狀態。由於注入時間也需要準確,因此攻擊者需要同時保持執行 FDI 程式和控制器狀態讀取程式。過一段時間後,他們將看到如下所示的錯誤代碼:
我們可以取得 OT 挑戰標誌 PLC_EXECUTE_ERROR_FLG(在真正的比賽中,這將是一個隨機產生的標誌字串)
- 現在 OT 挑戰已解決!
您已成功使用偽造資料注入攻擊擾亂了 Palantir Control 邏輯,並檢索了操作錯誤標誌。
備註:
參與者有兩個關於他們是否可以使用其他解決方案來「繞過」挑戰的問題:
Q1: Can I use False command injection to modified the coils output directly ?
答:PLC Configuration 沒有提供 PLC 線圈「允許讀取」和「允許寫入」設定 API,使用者無法直接修改 PLC 的線圈。
Q2: Can I use ARP spoofing and MITM attack to modify the controller's Modbus request or Modbus response message directly ?
答:在比賽期間,我們允許參與者下載一些 ARP 欺騙/mitm 工具,例如 ettercap,但參考網路配置部分中的網路拓撲,我們已在交換器上配置了靜態 ARP 條目,因此大多數 ARP 欺騙/mitm 工具將無法運作。
結論
Palantir Control 挑戰展示了 IT 漏洞如何級聯到 OT 系統故障,從而暴露關鍵基礎設施風險。透過結合 Web 漏洞利用、協定操縱和偽造資料注入,參與者彌合了 IT/OT 安全領域——這是防禦工業環境的關鍵技能。如果您對關鍵基礎設施 CTF 比賽感興趣,請不要錯過 9 月 1 日的 CISS2025:https://itrust.sutd.edu.sg/ciss-2025/
感謝您花時間查看文章詳細資訊,如果您有任何問題和建議或發現任何程式錯誤,請隨時給我留言。非常感謝您能提供一些意見並分享任何改進建議,以便我們能夠使我們的工作做得更好~
上次編輯者:LiuYuancheng([email protected]) 於 2025 年 6 月 6 日,如果您有任何問題,請給我發送訊息。