#!/bin/hack
  • Home
  • Posts
  • Archives
  • Search
  • About

📚 所有文章

深入探索資安研究與技術文章

Modbus TCP 深度解析 (五):安全威脅與攻擊手法分析

0x00 前情提要 在前一集中,我們學習了錯誤處理和診斷技術。今天我們要從資安的角度深入分析 Modbus TCP 的安全威脅,這對於保護工控系統至關重要。 上集練習題答案: 練習 3:錯誤封包分析 00 05 00 00 00 03 01 86 03 解析: - Transaction ID: 0x0005 - 錯誤功能碼: 0x86 (0x06 + 0x80) = 寫入單個暫存器錯誤 - 異常碼: 0x03 = Illegal Data Value - 問題:嘗試寫入的數值超出允許範圍 0x01 Modbus TCP 安全弱點分析 協議層面的安全缺陷 Modbus TCP 協議設計於工業環境安全性要求較低的年代,存在以下根本性安全問題: ┌─────────────────────────────────────────────────────────┐ │ Modbus TCP 安全弱點 │ ├─────────────────┬───────────────────────────────────────┤ │ 認證機制 │ ❌ 無內建身份驗證 │ │ 加密保護 │ ❌ 明文傳輸,無加密機制 │ │ 授權控制 │ ❌ 無存取權限控制 │ │ 完整性檢查 │ ❌ 無資料完整性驗證 │ │ 防重放攻擊 │ ❌ 無時間戳或序號保護 │ │ 會話管理 │ ❌ 無安全會話機制 │ └─────────────────┴───────────────────────────────────────┘ 攻擊面分析 網路層 ←→ TCP 層 ←→ Modbus 應用層 ←→ 設備層 ↓ ↓ ↓ ↓ 網路掃描 連線洪水 協議攻擊 設備控制 ARP 偽造 TCP 劫持 功能碼濫用 參數篡改 連線注入 資料注入 韌體攻擊 0x02 網路層攻擊技術 網路探測與指紋識別 攻擊者首先會進行網路偵察,識別 Modbus 設備: ...

July 5, 2025
modbus

Modbus TCP 深度解析 (四):錯誤處理與異常診斷

0x00 前情提要 在前一集中,我們學習了 Modbus 的資料模型和地址規劃。今天我們要探討當事情出錯時如何處理,這在實際工業應用中至關重要。 上集練習題答案: 練習 1:馬達控制器地址規劃 資料類型 | Modbus地址 | 功能描述 -----------------|-----------|------------------ Coils | 00001 | 馬達啟動控制 Coils | 00002 | 馬達停止控制 Discrete Inputs | 10001 | 運行狀態回饋 Discrete Inputs | 10002 | 故障狀態指示 Holding Registers| 40001 | 速度設定點 (RPM) Holding Registers| 40002 | 加速時間 (秒) Input Registers | 30001 | 實際速度 (RPM) Input Registers | 30002 | 馬達電流 (0.1A) 練習 2:浮點數陣列轉換 def floats_to_registers(float_array): registers = [] for f in float_array: high, low = ModbusDataConverter.float32_to_registers(f) registers.extend([high, low]) return registers result = floats_to_registers([123.45, 67.89, -12.34]) # 結果: [0x42F6, 0xE666, 0x4287, 0x1CAC, 0xC145, 0x70A4] 0x01 Modbus 錯誤處理機制 錯誤回應的基本結構 當 Modbus 伺服器遇到錯誤時,會返回特殊的錯誤封包: ...

July 4, 2025
modbus

Modbus TCP 深度解析 (三):資料模型與地址空間解密

0x00 前情提要 在前兩集中,我們學習了 Modbus TCP 的基礎知識和功能碼。今天我們要深入探討 Modbus 的資料模型,這是理解工控系統資料組織的關鍵。 上集練習題答案: 練習 1: 00 08 00 00 00 09 01 10 00 32 00 02 04 00 64 00 C8 解析: - 功能碼: 0x10 (批次寫入暫存器) - 起始地址: 0x0032 (50) - 數量: 0x0002 (2 個暫存器) - 資料: Register 50 = 0x0064 (100), Register 51 = 0x00C8 (200) 練習 2: 設定線圈狀態為 "1010110011001100" (16 bits) 資料位元組: 0xCC, 0xAC (小端序排列) 請求封包: 00 09 00 00 00 08 01 0F 00 00 00 10 02 CC AC 0x01 Modbus 資料模型概述 Modbus 定義了四種不同的資料區域,每種都有特定的用途和特性: ...

July 3, 2025
modbus

Modbus TCP 深度解析 (二):功能碼詳解與實戰範例

0x00 前情提要 在上一集中,我們深入了解了 Modbus TCP 的基本概念和封包結構。今天我們將聚焦於功能碼 (Function Code),這是 Modbus 協議的核心,決定了每個請求要執行什麼操作。 上集練習題答案: Hex: 00 05 00 00 00 06 01 06 00 0A 03 E8 解析: - Transaction ID: 0x0005 (5) - 這是一個請求封包 - 功能碼: 0x06 (寫入單個暫存器) - 目標地址: 0x000A (10) - 寫入數值: 0x03E8 (1000) 0x01 功能碼總覽 Modbus TCP 支援多種功能碼,可分為以下幾類: 標準功能碼分類 類別 功能碼範圍 說明 讀取功能 0x01-0x04 讀取各種資料型別 寫入功能 0x05-0x06 寫入單一數值 批次寫入 0x0F-0x10 批次寫入操作 診斷功能 0x08 診斷和測試 其他功能 0x2B 設備識別等 常用功能碼對照表 功能碼 名稱 資料型別 操作類型 0x01 Read Coils 線圈 (1bit) 讀取 0x02 Read Discrete Inputs 離散輸入 (1bit) 讀取 0x03 Read Holding Registers 保持暫存器 (16bit) 讀取 0x04 Read Input Registers 輸入暫存器 (16bit) 讀取 0x05 Write Single Coil 線圈 (1bit) 寫入 0x06 Write Single Register 保持暫存器 (16bit) 寫入 0x0F Write Multiple Coils 線圈 (1bit) 批次寫入 0x10 Write Multiple Registers 保持暫存器 (16bit) 批次寫入 0x02 讀取功能碼詳解 0x01 - Read Coils (讀取線圈) 線圈是 1 位元的離散輸出,通常用於控制開關、閥門、指示燈等。 ...

July 2, 2025
modbus 工控協議 功能碼

Modbus TCP 深度解析 (一):協議基礎與封包結構

0x00 前言 Modbus TCP 作為工業控制系統中最重要的通訊協議之一,在現代工廠自動化、SCADA 系統和物聯網設備中扮演關鍵角色。本系列教學將帶領大家從零開始,深入理解 Modbus TCP 的方方面面。 系列文章規劃: 協議基礎與封包結構 ← 本篇 功能碼詳解與實戰範例 資料模型與地址空間 錯誤處理與異常診斷 安全威脅與攻擊分析 防護策略與最佳實務 0x01 Modbus TCP 協議概述 什麼是 Modbus TCP? Modbus TCP 是基於乙太網的 Modbus 協議變體,它在傳統的 Modbus 協議基礎上增加了 TCP/IP 網路支援。相比於 Modbus RTU/ASCII,Modbus TCP 具有以下特點: 傳輸層:使用 TCP 協議,預設埠號 502 無需校驗:TCP 本身提供可靠傳輸,無需額外的 CRC 校驗 網路化:支援多個客戶端同時連接 更大的資料量:支援更大的資料封包 跨平台:可在不同作業系統間通訊 協議棧結構 ┌─────────────────────────┐ │ Modbus Application │ 應用層 ├─────────────────────────┤ │ TCP │ 傳輸層 (Port 502) ├─────────────────────────┤ │ IP │ 網路層 ├─────────────────────────┤ │ Ethernet │ 資料鏈結層 └─────────────────────────┘ 0x02 TCP 連線建立過程 三次握手過程 在 Modbus 通訊開始前,首先需要建立 TCP 連線: ...

July 1, 2025
modbus

協助臺科大建置IEC 62443-3-3認證場域之心得分享

前言 近年來,隨著工業 4.0 與智慧製造的浪潮,營運技術 (Operational Technology, OT) 與資訊技術 (Information Technology, IT) 的融合已是不可逆的趨勢。然而,這也使得過去相對封閉的工業控制系統 (Industrial Control Systems, IACS) 面臨了前所未有的資安威脅。在這樣的大背景下,IEC 62443 標準無疑成為了全球公認最完整、最權威的工控資安框架。 近期,我們有幸協助臺灣科技大學(臺科大)的團隊,共同建置一個符合 IEC 62443-3-3 要求的實證場域。這個過程充滿挑戰,但也收穫滿滿。希望藉由這篇文章,分享我們在導入過程中的一些關鍵實踐與心得,提供給同樣走在工控資安路上的朋友參考。 為何是 IEC 62443-3-3? 首先,必須理解 IEC 62443 是一個龐大的標準家族,而 Part 3-3 的全名是「系統安全要求與安全等級 (System Security Requirements and Security Levels)」。 它的核心目標是:定義一個控制系統本身應該具備哪些內建的資安功能,才能抵禦不同程度的威脅。 標準中定義了四個安全等級 (Security Level, SL),從 SL1 到 SL4,代表系統需具備對抗從「意外的非授權存取」到「具備高度資源與專業能力的國家級攻擊」等不同威脅的能力。 對學術單位如臺科大而言,建置一個符合此標準的場域,不僅能讓學術研究與國際產業實務接軌,更能培養出真正理解 OT 環境資安需求的實戰人才。 專案核心挑戰 在專案初期,我們面臨了幾個主要挑戰: 標準解讀與轉化:如何將標準中數十項抽象的要求(例如 “Prohibit public or default accounts”),轉化為具體、可操作、可驗證的技術設定? IT 與 OT 的思維碰撞:IT 資安強調「機密性」,而 OT 環境更重視「可用性」與「即時性」。許多在 IT 界常見的資安措施(如頻繁更新、動態掃描)在 OT 場域可能是災難。 新舊設備的整合:場域中包含了先進的控制器,也保留了部分傳統的 PLC 與 HMI。如何在新舊並存的環境中,實現一致性的安全策略,是一大難題。 定義合理的邊界與目標:整個校園網路太大,我們必須定義出一個清晰的「評估中系統 (System Under Consideration, SUC)」,並設定我們希望達成的安全等級 (SL),以此作為實踐的範疇。 關鍵實踐與心得分享 IEC 62443-3-3 提出了七大基礎要求 (Foundational Requirements, FR)。以下我將圍繞這七大要求,分享我們的具體做法與心得。 ...

July 5, 2024
IEC62443

常見十大工控協定與攻擊手法

常見十大工控協定與攻擊手法 Modbus 協定十大攻擊手法 1. 設備枚舉 (Device Enumeration) 攻擊手法: 透過系統性地發送讀取指令並遍歷所有可能的 Slave ID (0-247),攻擊者可以掃描並繪製出整個 Modbus 網路的拓撲,識別所有在線的從站設備及其支援的資料區,為後續攻擊提供精確目標。 參考來源: CISA (Cybersecurity and Infrastructure Security Agency) - Control Systems Network Auditing: https://www.cisa.gov/sites/default/files/recommended_practices/RP_Control_Systems_Network_Auditing_S508C.pdf SANS Institute - ICS410: ICS/SCADA Security Essentials: https://www.sans.org/cyber-security-courses/ics-scada-cyber-security-essentials/ Nmap Scripting Engine - modbus-discover.nse: https://nmap.org/nsedoc/scripts/modbus-discover.html 2. 未授權讀取 (Unauthorized Read) 攻擊手法: 由於 Modbus 協定本身缺乏認證機制,任何能連上網路的攻擊者都可以發送合法的讀取功能碼 (如 0x01, 0x02, 0x03, 0x04),自由讀取設備的線圈和暫存器狀態,從而竊取關鍵的生產參數、設備組態或製程配方。 參考來源: Modbus-IDA - Modbus Application Protocol Specification V1.1b3: https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf Fortinet - What Is the Modbus Protocol?: https://www.fortinet.com/resources/cyberglossary/modbus-protocol MITRE ATT&CK for ICS - T0859 Read Input/Output Image: https://collaborate.mitre.org/attackics/index.php/Technique/T0859 3. 惡意指令注入 (Command Injection) ...

March 21, 2024
Modbus S7 DNP3

picoCTF 2021 Reverse Write-up

keygenme-py [30 points] 從 source code 中看到已經有一部分 flag,看起來是要找出 key_part_dynamic1_trial key_part_static1_trial = "picoCTF{1n_7h3_|<3y_of_"; key_part_dynamic1_trial = "xxxxxxxx"; key_part_static2_trial = "}"; key_full_template_trial = key_part_static1_trial + key_part_dynamic1_trial + key_part_static2_trial; 把 username 拿去 sha256 後取 4,5,3,6,2,7,1,8 import hashlib flag_part1 = "picoCTF{1n_7h3_|<3y_of_" flag_part2 = "".join([hashlib.sha256(b"GOUGH").hexdigest()[x] for x in [4,5,3,6,2,7,1,8]]) flag_part3 = "}" flag = flag_part1 + flag_part2 + flag_part3 print(flag) Flag: picoCTF{1n_7h3_|<3y_of_f911a486} crackme-py [30 points] 這題看完 source code 後發現他已經有寫好的 function 只是沒有使用 def decode_secret(secret): """ROT47 decode NOTE: encode and decode are the same operation in the ROT cipher family. """ # Encryption key rotate_const = 47 # Storage for decoded secret decoded = "" # decode loop for c in secret: index = alphabet.find(c) original_index = (index + rotate_const) % len(alphabet) decoded = decoded + alphabet[original_index] print(decoded) ┌──(luyee㉿DESKTOP-KADOGNG)-[~/picoCTF] └─$ /bin/python3 /home/luyee/picoCTF/2021/reverse/crackme-py/crackme.py What's your first number? 123 What's your second number? 123 The number with largest positive magnitude is 123 picoCTF{1|\/|_4_p34|\|ut_4593da8a} 所以直接拿來用,Flag 就出來了@@ ...

January 30, 2024
picoCTF2021
« First « Prev 1 2
© 2025 #!/bin/hack · Powered by Hugo & PaperMod