Hacking the ICS: A Step-by-Step Guide to Solve a Critical Infrastructure IT-OT CTF Challenge

  liuyuancheng        2025-06-09 04:33:11       566        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

title21.png

การแข่งขัน Capture The Flag (CTF) ด้านความปลอดภัยทางไซเบอร์ในสาขาเทคโนโลยีสารสนเทศ (IT) มักจัดขึ้นบ่อยครั้งทั่วโลก แต่ CTF ที่เน้นด้านเทคโนโลยีปฏิบัติการ (OT) ยังคงค่อนข้างหายากและเข้าถึงได้ยากกว่า เมื่อเทียบกับ IT CTF แบบดั้งเดิมที่เน้นแอปพลิเคชันบนเว็บหรือช่องโหว่ของเครือข่าย ความท้าทายของ OT CTF จะเกี่ยวข้องกับระบบต่างๆ เช่น PLC, SCADA, RTU และระบบควบคุมทางอุตสาหกรรม (ICS) สถานการณ์เหล่านี้กำหนดให้ผู้เข้าร่วมต้องมีความรู้เฉพาะทางด้าน ICS ในการระบุช่องโหว่ ใช้ประโยชน์จากการกำหนดค่าที่ไม่ถูกต้อง และปกป้องโครงสร้างพื้นฐานที่สำคัญที่พบได้ทั่วไปในโครงข่ายไฟฟ้า สภาพแวดล้อมการผลิต การขนส่ง และโรงบำบัดน้ำเสีย OT CTF มอบโอกาสพิเศษในการเชื่อมช่องว่างระหว่างความปลอดภัยด้าน IT และ OT โดยผสมผสานทักษะด้านความปลอดภัยทางไซเบอร์เข้ากับความเข้าใจอย่างลึกซึ้งเกี่ยวกับโปรโตคอลอุตสาหกรรม เช่น Modbus, DNP3, S7Comm และ IEC 61850

The Critical Infrastructure Security Showdown (CISS) เป็นหนึ่งในงานระดับนานาชาติเพียงไม่กี่งานที่จัดให้มีแพลตฟอร์ม OT CTF โดยเฉพาะสำหรับผู้เข้าร่วมเป็นประจำทุกปี ซึ่งจัดขึ้นที่ Singapore University of Technology and Design (SUTD) และจัดโดยศูนย์วิจัย iTrust CISS มอบโอกาสอันดีในการรวบรวมผู้เชี่ยวชาญ CTF ระดับโลกเพื่อจัดการกับความท้าทายด้านความปลอดภัยทางไซเบอร์ OT ที่สมจริง หากต้องการรายละเอียดเพิ่มเติม โปรดเยี่ยมชม เว็บไซต์ CISS 2024

ในบทความนี้ ฉันจะแนะนำหนึ่งในความท้าทายแบบผสมผสาน IT-OT ที่ฉันออกแบบไว้สำหรับ CISS เมื่อปีที่แล้ว (ความท้าทายนี้เป็นหนึ่งในสามอันดับแรกที่ชื่นชอบใน 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

ในแต่ละปี CISS CTF จะมีเนื้อเรื่องที่สร้างสรรค์เพื่อเป็นแรงบันดาลใจในการออกแบบความท้าทาย ฉบับปี 2024 นำธีม "The Orthanc Obstacles" มาใช้ โดยอิงจาก The Lord of the Rings: The Two Towers (ดังที่แสดงในโปสเตอร์และเหรียญรางวัล CISS2024 ด้านล่าง)

s_0311.png

รูปที่ 00 โปสเตอร์และภาพหน้าจอเหรียญรางวัล CISS2024

ในบริบทนี้ ความท้าทายที่ฉันออกแบบ—การควบคุม Palantir—ดึงมาจากฉากอันโด่งดังที่ Saruman ใช้ Palantír เพื่อควบคุมหอคอย Orthanc ดังที่แสดงด้านล่างในภาพยนตร์:

s_01.png

รูปที่ 01 Saruman จาก The Lord of the Ring

ความท้าทายนี้จำลองสภาพแวดล้อม OT ICS ขนาดเล็ก (เครือข่ายเลเยอร์ SCADA) เพื่อแสดงให้เห็นว่าการโจมตีทางไซเบอร์ที่ใช้ IT สามารถประนีประนอมและทำให้ระบบ OT ล่มได้อย่างไร โดยมีตัวควบคุมลอจิกแบบโปรแกรมได้ (PLC) และอินเทอร์เฟซควบคุมระยะไกล (เช่น HMI) ที่เลียนแบบระบบ SCADA แบบง่าย ผู้เข้าร่วมมีหน้าที่ใช้เทคนิคการเจาะระบบ IT เพื่อแทรกซึมเข้าไปในเครือข่าย ยกระดับสิทธิ์ และท้ายที่สุดคือจัดการระบบ OT เพื่อดึงธงออกมา

ในความท้าทาย การควบคุม Palantir ผู้เข้าร่วมจะต้องผ่านขั้นตอนการโจมตีหลายขั้นตอน:

  • การเจาะระบบ IT – การสแกนเครือข่าย

  • การเจาะระบบ IT – การตรวจสอบพอร์ต UDP

  • การใช้ประโยชน์จาก IT – ช่องโหว่ CGI ของเว็บเซิร์ฟเวอร์ HTTP

  • การโจมตี IT – การ Brute-force รหัสผ่านผู้ดูแลระบบเว็บ

  • การโจมตี 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

ในเงามืดของ Isengard, Saruman the white ได้ควบคุมพลังมืดของ Palantír ซึ่งเป็นลูกแก้วคริสตัลสีดำลึกลับ เพื่อควบคุม Fiery Eye ที่เกาะอยู่บนยอดหอคอย Orthanc จากระยะไกล ด้วยคำสั่งแต่ละครั้งที่เขาส่งไป ดวงตาจะเคลื่อนและลุกไหม้ นำกองทัพ Orc ที่ไม่ย่อท้อของเขาไปสู่การครอบงำ

แต่ความหวังยังคงอยู่ ด้วยข่าวกรองลับของ Gandalf, Sam และ Frodo จึงออกเดินทางในภารกิจที่อันตรายเพื่อก่อวินาศกรรมระบบควบคุมที่ชั่วร้ายของ Saruman กุญแจสู่พลังของเขาอยู่ที่เครือข่าย เทคโนโลยีปฏิบัติการ (OT) ที่ซ่อนอยู่:

  • ตัวควบคุมลอจิกแบบโปรแกรมได้ (PLC) ภายในหอคอย Orthanc จะจัดการดวงตาตามคำสั่งระยะไกลที่เข้ามา

  • ตัวควบคุมระยะไกล ที่ดำเนินการโดย Saruman ผ่าน Palantír จะส่งคำสั่งเหล่านั้นโดยใช้โปรโตคอล OT เฉพาะ

  • สถานะของดวงตาจะเปลี่ยนไปผ่านรีจิสเตอร์พักข้อมูล PLC และ Saruman จะตรวจสอบข้อเสนอแนะผ่านข้อมูลตอบกลับของ Palantír

เพื่อหยุดการแพร่กระจายของความมืดมิด เหล่าฮอบบิทต้องดำเนินการอย่างรวดเร็วดังที่แสดงด้านล่าง:

s_022.png

รูปที่ 02 ภาพรวมเรื่องราวเบื้องหลังความท้าทาย

  • Sam ต้องแทรกซึมเข้าไปในหอคอย บุกรุกระบบควบคุม และจัดการตรรกะเบื้องหลัง Fiery Eye

  • Frodo เสี่ยงทุกอย่าง ต้องเข้าใกล้ดินแดนของ Saruman และเปิดเผยแบ็คดอร์ที่ซ่อนอยู่เพื่อดึงข้อมูลโดยตรงจากคริสตัลสีดำ

พวกเขาจะสามารถกอบกู้มิดเดิลเอิร์ธจากการล่มสลายได้ก็ต่อเมื่อขัดขวางห่วงโซ่การควบคุมที่สำคัญนี้เท่านั้น

คำถามท้าทาย CTF

ความท้าทายที่ 1 – ภารกิจของ Sam [ความท้าทายด้าน IT]

วัตถุประสงค์: ช่วย Sam แทรกซึมเข้าไปในหอคอย Orthanc และเปิดเผยการทำงานภายในของระบบควบคุม

งาน:

  • สแกนเครือข่ายเพื่อระบุ ตัวควบคุมหอคอย Orthanc (PLC)

  • ค้นหาอินเทอร์เฟซการจัดการบนเว็บของอุปกรณ์

  • ข้ามการตรวจสอบสิทธิ์เพื่อเข้าถึงข้อมูลการกำหนดค่าภายใน

ตำแหน่งธง: ซ่อนอยู่ภายใน อินเทอร์เฟซเว็บ PLC อาจเข้ารหัสหรือฝังอยู่ในหน้าการวินิจฉัยหรือการกำหนดค่า

ความท้าทายที่ 2 – ภารกิจของ Frodo [ความท้าทายด้าน OT]

วัตถุประสงค์: ช่วย Frodo ในการขัดขวางการสื่อสารระหว่าง Saruman และหอคอย Orthanc

งาน:

  • ค้นพบ ตัวควบคุม OT ระยะไกล ที่ Saruman ใช้ผ่าน Palantír

  • โต้ตอบกับมันเพื่อดึง ข้อมูลการดำเนินงาน

  • ดำเนินการฉีดข้อมูลเท็จหรือการหยุดชะงักที่คล้ายกันเพื่อ จัดการพฤติกรรมของ Fiery Eye

ตำแหน่งธง: ฝังอยู่ในข้อมูลตอบกลับของตัวควบคุม สามารถเข้าถึงได้หลังจากขัดขวางการทำงานปกติ


🖧 การกำหนดค่าเครือข่าย

ส่วนการกำหนดค่าเครือข่ายจะ ไม่ มอบให้กับผู้เข้าร่วม พวกเขาต้องใช้เครื่องมือสแกนเครือข่ายเพื่อค้นหาโทโพโลยีเครือข่ายและการกำหนดค่าของแต่ละทีมอาจแตกต่างกัน

สภาพแวดล้อมความท้าทายนี้ประกอบด้วยเครื่องเสมือน (VMs) สามเครื่อง—สองเครื่องสำหรับการจำลอง IT-OT และอีกหนึ่งเครื่องสำหรับการเข้าถึงของผู้เข้าร่วม VMs ทั้งหมดอยู่ในซับเน็ตเดียวกันเพื่อให้สามารถสื่อสารโดยตรงได้ โทโพโลยีแสดงดังด้านล่าง:

s_0415.png

รูปที่ 03 โทโพโลยีเครือข่ายสภาพแวดล้อมความท้าทาย

การกำหนดค่าที่อยู่ IP:

  • ที่อยู่ IP ตัวควบคุม PLC (โปรแกรมควบคุมระยะไกล): 172.23.155.208

  • ที่อยู่ IP อุปกรณ์ PLC: 172.23.155.209

  • ที่อยู่ IP VM ของผู้เข้าร่วม: 172.23.144.1

ในความท้าทายนี้ ผู้เข้าร่วมจะโต้ตอบกับ สภาพแวดล้อม IT-OT จำลอง ที่เลียนแบบระบบ SCADA แบบง่าย การตั้งค่าประกอบด้วย:

  • อุปกรณ์ PLC ที่ควบคุมผ่าน Modbus-TCP

  • VM ตัวควบคุมระยะไกล ทำหน้าที่เป็นอินเทอร์เฟซ Palantír ของ Saruman

  • VM ธุรกรรม (Ubuntu 20.04) ซึ่งถูกบุกรุกไปก่อนหน้านี้

รายละเอียดสถานการณ์สำคัญ

  • ตัวควบคุมระยะไกล จะส่งคำสั่ง Modbus-TCP ไปยัง PLC เป็นประจำ ซึ่งจะกระตุ้นการดำเนินการตามตรรกะบันได PLC (เช่น การเปิดใช้งานคอยล์)

  • VM วิศวกรสนับสนุนด้าน IT สามารถเข้าถึงได้โดยผู้เข้าร่วมโดยมีสิทธิ์ sudo เต็มรูปแบบ แต่ ไม่สามารถเข้าถึงโดยตรงเพื่อตรวจสอบหรือควบคุม PLC

  • อย่างไรก็ตาม ตัวควบคุมระยะไกลเปิดเผยพอร์ต UDP แบบเปิด ซึ่งผู้เข้าร่วมสามารถโต้ตอบด้วยเพื่อ สอบถามสถานะการดำเนินงานปัจจุบัน ของ PLC (เช่น สถานะคอยล์เอาต์พุต)

  • ผู้เข้าร่วมต้อง เขียนไคลเอนต์ UDP ที่กำหนดเอง เพื่อดึงข้อมูลสถานะแบบเรียลไทม์จากตัวควบคุม

  • การใช้เทคนิคการเจาะระบบ IT และการจัดการ OT ผู้เข้าร่วมจะพยายาม ทำให้พฤติกรรมที่คาดหวังของ PLC เสียหายหรือเปลี่ยนแปลง เพื่อให้ตัวควบคุมได้รับการ ตอบสนองที่ไม่คาดคิดหรือผิดพลาด

เป้าหมายสูงสุดคือการทำให้เกิดความล้มเหลวทางตรรกะหรือความไม่สอดคล้องกันที่ทำให้ ตัวควบคุมระยะไกลสร้างรหัสข้อผิดพลาดสถานะ ซึ่งมี ธง


การออกแบบโจทย์

ผู้เข้าร่วมจะใช้ transaction VM เพื่อติดตั้งเครื่องมือหรือพัฒนาสคริปต์โจมตีแบบกำหนดเองที่จำเป็นสำหรับการโต้ตอบและใช้ประโยชน์จากสภาพแวดล้อม IT-OT แม้ว่า system workflow ระดับสูงจะควบคุมลำดับการโต้ตอบ แต่ก็ไม่ได้เปิดเผยให้ผู้เข้าร่วมทราบระหว่างการแข่งขัน CTF ดังแสดงด้านล่าง:

s_0513.png

Figure-04 แผนภาพ workflow ระบบสภาพแวดล้อมของโจทย์

หัวใจหลักของโจทย์อยู่ที่ PLC simulator ซึ่งดำเนินการรูทีน ladder logic ที่ซ่อนอยู่ PLC simulator VM เปิดเผยบริการหลักสองอย่างไปยังเครือข่าย:

  • Modbus-TCP Service: พอร์ต TCP:502

  • Web Interface (HTTP): พอร์ต TCP:5000

ทุกๆ 2 วินาที สภาพแวดล้อมการทดสอบจะจำลองรอบการทำงานของ OT:

  1. remote controller VM จะโหลดการกำหนดค่า register holding ของ PLC ที่กำหนดไว้ล่วงหน้าแบบสุ่ม และสถานะเอาต์พุต coils ที่คาดหวังที่สอดคล้องกันจากฐานข้อมูลภายใน

  2. มันจะส่งคำขอเขียน Modbus-TCP เพื่ออัปเดต register holding ใน PLC simulator

  3. PLC simulator จะอัปเดตค่า register ภายใน ดำเนินการ ladder logic และอัปเดตสถานะเอาต์พุต coil ตามนั้น

  4. จากนั้น remote controller จะสอบถาม coils ของ PLC เพื่อตรวจสอบว่าการตอบสนองตรงกับผลลัพธ์ที่คาดหวังหรือไม่

  5. จากผลการจับคู่ remote controller จะพิจารณาว่าการทดสอบ PLC ผ่านหรือไม่ผ่าน

✅ การทำงานปกติ (การทดสอบผ่าน):

หาก PLC ตอบสนองด้วยสถานะ coil ที่ถูกต้อง ระบบจะถือว่าทำงานได้อย่างถูกต้อง เมื่อผู้เข้าร่วมส่งแพ็กเก็ต UDP ที่มี getstate ไปยัง remote controller ที่พอร์ต UDP:3000 พวกเขาจะได้รับการตอบสนองเช่น:

state:normal;;;...

❌ สภาวะผิดปกติ (การทดสอบล้มเหลว):

หากการตอบสนองของ PLC ไม่ตรงกัน กับเอาต์พุต coil ที่คาดหวัง remote controller จะแจ้งข้อผิดพลาด ในกรณีนี้ เมื่อผู้เข้าร่วมส่ง getstate ไปยัง UDP:3000 พวกเขาจะได้รับ:

state:error;{error-code-xxxxxxxxxxxxxxxx}

{error-code} คือ CTF flag

หากการสื่อสารถูกตัดการเชื่อมต่อ controller จะตอบกลับข้อความ "PLC rejected connection"

หากผู้เข้าร่วมไม่ได้ส่งสตริงที่ถูกต้อง "getstate" controller จะตอบกลับ "Error: Input request invalid"

🎯 วัตถุประสงค์ของโจทย์

ผู้เข้าร่วม CTF ต้องสร้างการโจมตีที่ทำให้สถานะเอาต์พุตของ PLC เบี่ยงเบนไปจากผลลัพธ์ที่คาดหวัง ซึ่งจะทำให้เกิดสภาวะข้อผิดพลาดใน remote controller

สถานการณ์ตัวอย่าง:

  • controller ตั้งค่า 8 holding register ของ PLC เป็น: [0, 1, 1, 0, 1, 0, 0, 1]

  • ladder logic ควรสร้าง output coils 1 - 4 เป็น: [1, 0, 0, 1]

  • หาก remote controller อ่าน: [1, 0, 1, 1] สำหรับ coils เหล่านั้นแทน มันจะแจ้งข้อผิดพลาดและส่งคืน flag ผ่าน UDP แต่ผู้เข้าร่วมต้องอ่านอย่างรวดเร็วเนื่องจากหลังจาก 1 วินาที controller จะรีเซ็ตและเริ่มการดำเนินการรอบใหม่

ผู้เข้าร่วมต้องค้นพบวิธี ขัดขวาง logic chain ไม่ว่าจะผ่านการกำหนดค่าที่ไม่ถูกต้อง สภาวะ race condition ข้อมูลป้อนเข้าที่ไม่ได้รับอนุญาต หรือการ injection เพื่อให้ PLC ตอบสนองด้วยสถานะ coil ที่ไม่ถูกต้อง เราให้เวลาสองวินาทีแก่ผู้เข้าร่วมในการโจมตีด้วยการ injection ข้อมูลที่เป็นเท็จ และประมาณหนึ่งวินาทีเพื่อให้พวกเขาอ่าน flag ช่วงเวลาของนาฬิกาแสดงอยู่ด้านล่าง:

s_0615.png

Figure-05 แผนภาพการ injection timestamp และช่วงเวลาของนาฬิกา


ขั้นตอนในการแก้โจทย์

ตอนนี้มาดูขั้นตอนโดยละเอียดในการแก้โจทย์ ผู้เข้าร่วมต้องแก้โจทย์ IT ก่อนจึงจะสามารถเริ่มทำส่วนโจทย์ OT ได้

แก้ภารกิจของ Sam [โจทย์ IT]

ขั้นตอนที่ 1: ค้นพบบริการ Web และ Modbus-TCP ของ PLC

เริ่มต้นด้วยการระบุโฮสต์ที่ใช้งานอยู่บน subnet โดยใช้ fping หรือวิธีการสแกนโฮสต์ nmap ใดๆ เมื่อระบุแล้ว ให้สแกน PLC IP ที่น่าสงสัยเพื่อแจกแจงพอร์ตที่เปิดอยู่:

nmap -sS -Pn -T5 -p- 172.23.155.209

การสแกนทั่วไปจะเผยให้เห็น Modbus-TCP (พอร์ต 502) และ HTTP Web Interface (พอร์ต 5000) ที่เปิดอยู่บน PLC VM ดังแสดงด้านล่าง:

s_0714.png

Figure-06 ผลการสแกนพอร์ต Nmap

เนื่องจาก transaction VM เป็น Ubuntu-server version (ไม่มี desktop) คุณจะต้อง port-forward web interface ไปยังเครื่องของคุณ:

ssh -L 127.0.0.1:5000:172.23.155.209:5000 -J @ @172.23.144.1

ตอนนี้ เปิด URL http://127.0.0.1:5000 บนเบราว์เซอร์ในเครื่องเพื่อไปยัง web interface ของ PLC ผู้เข้าร่วมสามารถดูเรื่องราวและหน้าแนะนำโจทย์ได้ดังแสดงด้านล่าง:

s_0812.png

Figure-07 หน้าแรกของ web interface ของ Challenge PLC VM

ขั้นตอนที่ 2: ตรวจสอบ Web UI และค้นหา Hint-1 ที่ซ่อนอยู่

หลังจากอ่านรายละเอียดโจทย์จากเว็บแล้ว ให้คลิกปุ่ม “Login” ในแถบนำทางด้านบนเพื่อดูแบบฟอร์มเข้าสู่ระบบ:

s_098.png

Figure-08 หน้าการอนุญาต web interface ของ Challenge PLC VM

ตอนนี้คุณต้อง brute force เพื่อถอดรหัสผ่าน แต่ก่อนหน้านั้นคุณต้องหาว่าชื่อผู้ใช้คืออะไร ข้อความของ Orc ในรูปภาพเน้น Saruman หากคุณลอง saruman (หรือบัญชีทั่วไปอื่นๆ เช่น admin ) ด้วยรหัสผ่านบางอย่างเช่น "1234567" ไซต์จะส่งข้อความปฏิเสธการเข้าสู่ระบบ: Login account does not exist

s_107.png

Figure-09 ภาพหน้าจอการเข้าสู่ระบบล้มเหลวของ web interface ของ Challenge PLC VM

ต้องมีเบาะแสเกี่ยวกับบัญชี ดูหน้าเข้าสู่ระบบอีกครั้ง มีปุ่มดรอปดาวน์ที่น่าสงสัยชื่อ "Gandalf's Message" ที่ด้านล่าง เมื่อขยายกล่องดรอปดาวน์ เราจะได้รับข้อความดังแสดงด้านล่าง:

s_118.png

Figure-10 ข้อความของ Gandalf ในหน้าเข้าสู่ระบบ web interface ของ Challenge PLC VM

ดูที่สตริง ดูเหมือนว่า Gandalf จะไม่ได้ให้ข้อความที่เป็นประโยชน์ แต่เดี๋ยวก่อน "เส้น" ใต้ข้อความของเขาดูน่าสงสัย! ข้อความของ Gandalf อาจเสียหาย ลองตรวจสอบแหล่งที่มาของเว็บ:

s_129.png

Figure-11 แหล่งที่มา html ของหน้าเข้าสู่ระบบ web interface ของ Challenge PLC VM

"เส้น" นี้จริงๆ แล้วคือ ภาพสูง 5 พิกเซล ชื่อ hint01 ตรวจสอบแหล่งที่มาของหน้าเพื่อเปิดเผยภาพ:

s_135.png

Figure-12 เปิดเผยข้อความของ Gandalf ในหน้าเข้าสู่ระบบ web interface ของ Challenge PLC VM

ใช่! ตอนนี้ Gandalf ปรากฏตัวและให้ URL แก่เราเพื่อเปิดประตู:

http://tower_ip:5000/userlogin/xxxx/xxxx 

หากผู้เข้าร่วมลอง URL ในเบราว์เซอร์ของพวกเขา มันจะแสดงว่าข้อมูลรับรองถูกต้องหรือไม่ดังที่แสดงด้านล่าง:

http://172.23.155.209:5000/userlogin/Saruman/xxxx

สิ่งนี้จะส่งคืนข้อผิดพลาดในการเข้าสู่ระบบ: User name or password incorrect! (ดังที่แสดงด้านล่าง)

s_145.png

Figure-13 Challenge PLC VM login API test

สิ่งนี้ยืนยันว่า endpoint works และรองรับการแทรกข้อมูลรับรองตาม URL แต่ URL ยังคงไม่มีประโยชน์! เนื่องจากมันเหมือนกับหน้าเข้าสู่ระบบ มีอะไรที่ฉันพลาดไปหรือไม่? มาตรวจสอบแหล่งที่มาของเว็บใหม่กัน:

s_154.png

Figure-14 Challenge PLC VM login CGI response source

มีหนึ่งย่อหน้าที่ไม่สามารถเข้าชมได้:

Sarumanscrow said:

Sarumanscrow อาจเป็นชื่อผู้ใช้ที่ถูกต้องหรือไม่ ลองเข้าสู่ระบบด้วยสิ่งนั้น:

s_165.png

Figure-15 Find the correct login user name

ข้อผิดพลาดในการปฏิเสธการเข้าสู่ระบบเปลี่ยนเป็น User password incorrect! เราสามารถยืนยันได้ว่ามีบัญชีผู้ใช้หนึ่งบัญชีคือ "Sarumanscrow" ที่สามารถใช้เพื่อเข้าสู่ระบบเว็บไซต์ PLC

ขั้นตอนที่ 3: Brute Force รหัสผ่านและดึง Flag

เมื่อค้นพบชื่อผู้ใช้แล้ว (Sarumanscrow) และยืนยัน endpoint การแทรกข้อมูลรับรองแล้ว ตอนนี้คุณสามารถทำการ dictionary-based brute force attack โดยใช้ 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 ดังที่แสดงด้านล่าง:

s_175.png

Figure-15 Brute force attack to get the password

เมื่อคุณตรวจสอบสิทธิ์สำเร็จ อินเทอร์เฟซเว็บ PLC จะเปลี่ยนเป็นสถานะเข้าสู่ระบบ และอินเทอร์เฟซเว็บ PLC จะแสดงข้อความแสดงความยินดีเป็นสีน้ำเงิน:

“ขอแสดงความยินดี คุณได้แก้ไขปัญหา IT challenge แล้ว ค้นหา flag จากหน้าต่างๆ”

แถบนำทางด้านซ้ายใต้บทนำจะแสดง Fiery Eye Control และ Orthanc Tower Control ดังที่แสดงด้านล่าง:

s_183.png

Figure-17 Challenge PLC VM web interface login successful

เมื่อผู้เข้าร่วมเปลี่ยนไปที่ Fiery Eye Control (หน้า PLC ladder logic) จากนั้นจะพบ IT challenge flag:

s_194.png

Figure-18 Find the IT challenge flag in the Fiery Eye Control page

เราสามารถรับ IT challenge flag CISS2024_SAM_FLAG (ในการแข่งขันจริง นี่จะเป็นสตริง flag ที่สร้างขึ้นแบบสุ่ม)

  • ตอนนี้ IT challenge ได้รับการแก้ไขแล้ว!

แก้ไขภารกิจของ Frodo [OT Challenge]

ขั้นตอนที่ 1: ค้นพบบริการ UDP ของ Controller

จากหน้าเว็บ ladder logic Hints02 ในหน้า PLC Ladder logic (ดังที่แสดงด้านล่าง) ผู้เข้าร่วมต้องค้นหาพอร์ตบริการ UDP ที่เปิดอยู่บนโหนด PLC controller (172.23.155.208) เพื่อรับสถานะการตรวจสอบการทำงานของ PLC ปัจจุบัน

s_204.png

Figure-19 Get the hint02 from the PLC web

ในการทำเช่นนี้ ให้สร้างสคริปต์ Python อย่างง่ายเพื่อสแกนพอร์ต UDP บน controller VM ดังที่แสดงด้านล่าง:

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 Port 3000 เปิดอยู่

ขั้นตอนที่ 2: สร้าง UDP Client Connect ไปยัง PLC Controller

เมื่อค้นพบพอร์ตบริการ UDP แล้ว ให้ใช้ Hint03 ในหน้า ladder logic (ดังที่แสดงด้านล่าง) เพื่อส่งสตริง getstate ไปยัง controller VM และดึงสถานะ PLC:

s_214.png

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 ต่อไป:

s_224.png

Figure-21 Get the normal response from PLC controller VM

การเรียกใช้ไคลเอนต์จะส่งคืนสถานะปัจจุบันของคอยล์ C0 ถึง C3 หากการตรวจสอบผลลัพธ์ของ PLC coils ผ่าน controller จะระบุว่า PLC ทำงานได้ตามปกติ คุณจะเห็นโลก "ปกติ" ในข้อความตอบกลับ

ขั้นตอนที่ 3: สร้างสคริปต์ False Data Injection (FDI) Attack

OT challenge กำหนดให้ผู้เข้าร่วมเขียนทับ PLC holding registers เพื่อกระตุ้นให้เกิดความผิดปกติ จากคำแนะนำ OT- challenge flag: ผู้เข้าร่วมต้องทำให้การทำงานของ PLC ยุ่งเหยิงเพื่อให้ remote controller ตรวจพบข้อผิดพลาดในการทำงานของ PLC จากนั้นอ่านรหัสข้อผิดพลาด ตอนนี้ผู้เข้าร่วมเปลี่ยนไปที่หน้า PLC ladder logic เพื่อเรียนรู้เกี่ยวกับ ladder logic นี่คือ 8 PLC holding registers ที่ใช้ใน ladder logic [HR0 - HR7] (ดังที่แสดงด้านล่าง):

s_232.png

Figure-22 Analyze the PLC ladder logic diagram

หากผู้เข้าร่วมสามารถแทรกข้อมูลเท็จในบางรีจิสเตอร์ เอาต์พุตอาจมีการเปลี่ยนแปลง ตัวอย่างเช่น หากเปลี่ยนสถานะ HR6, HR0 หรือ HR7 อาจเปลี่ยนเอาต์พุตของคอยล์เนื่องจากอยู่ในตรรกะ "AND" gate (หากเปลี่ยนสถานะเดียวของรีจิสเตอร์ในตรรกะ "OR" gate เช่น HR1, HR4 อาจไม่มีผลต่อเอาต์พุต ไดอะแกรมวงจรเทียบเท่าแสดงอยู่ด้านล่าง)

s_241.png

Figure-23 Analyze the circuit diagram

ผู้เข้าร่วมสามารถใช้ https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/blob/main/Modbus_PLC_Simulator/src/modbusTcpCom.py เป็นตัวอย่าง สร้างโปรแกรมสคริปต์ PLC FDI attack อย่างง่ายเพื่อเขียนทับค่าของ holding registers

 

อย่างไรก็ตาม หากพวกเขาเรียกใช้สคริปต์โดยตรง ข้อความโจมตีล้มเหลวจะปรากฏขึ้น (คำขอเปลี่ยนค่ารีจิสเตอร์ถูกปฏิเสธ):

s_251.png

Figure-24 PLC false data injection failed

ปัญหาคือ IP ของ attack VM 172.23.144.1 ไม่อยู่ในรายการ IP addresses "allow read" และ "allow write" ของ PLC register ดังนั้นคำขอ false data injection ทั้งหมดจึงถูกปฏิเสธโดย PLC

คลิกที่ "Orthanc Tower Control" ที่แถบสไลด์ จะเปลี่ยนเป็น "PLC Configuration" ดังที่แสดงด้านล่าง ผู้เข้าร่วมต้องเพิ่ม IP ของ attack VM ใน allow write IP address (ดังที่แสดงด้านล่าง):

s_261.png

Figure-25 Challenge PLC VM web configuration page

กรอก IP address ของ attack VM ในช่องข้อความแล้วกดปุ่ม "Add" สีเขียว จากนั้น IP ของผู้โจมตีจะถูกเพิ่มในรายการ allow write addresses ของ PLC ดังที่แสดงด้านล่าง:

s_271.png

Figure-26 Add the allow write IP address to PLC configuration

ตอนนี้ผู้เข้าร่วมสามารถรันโปรแกรมโจมตีอีกครั้งและพวกเขาจะเห็นว่าผลลัพธ์ที่ตั้งไว้เป็นจริง โปรแกรมโจมตี FDI กำลังเปลี่ยนค่า holding register ของ PLC แล้ว:

s_28.png

Figure-27 PLC false data injection accepted

ตอนนี้โปรแกรมโจมตี false data injection พร้อมใช้งานแล้ว

ขั้นตอนที่ 4: กระตุ้นให้เกิดข้อผิดพลาดของ Controller และดึง OT Flag

เพื่อให้การท้าทายเสร็จสมบูรณ์:

  1. เพิ่ม IP ของ transaction VM ลงใน Allow Read IP List ด้วย เพื่อให้เราสามารถรับสถานะ holding register ได้

  2. แก้ไขสคริปต์ของคุณเป็น:

    • อ่านค่าปัจจุบันของ HR0–HR7

    • สลับแต่ละบิต (1 → 0, 0 → 1)

    • เขียนค่าที่กลับด้านกลับไปยัง PLC

สิ่งนี้จะบิดเบือนเอาต์พุตของคอยล์ และตรรกะของ controller จะตรวจจับสถานะที่ผิดปกติ เนื่องจากเวลาในการ inject ก็ต้องแม่นยำด้วย ดังนั้นผู้โจมตีต้องรันโปรแกรม FDI และโปรแกรมอ่านสถานะ controller ไปพร้อมๆ กัน หลังจากนั้นสักครู่ พวกเขาจะเห็นรหัสข้อผิดพลาดดังที่แสดงด้านล่าง:

s_29.png

เราสามารถรับ OT challenge flag PLC_EXECUTE_ERROR_FLG (ในการแข่งขันจริง นี่จะเป็นสตริง flag ที่สร้างขึ้นแบบสุ่ม)

  • ตอนนี้ OT challenge ได้รับการแก้ไขแล้ว!

คุณได้ขัดขวางตรรกะ Palantir Control สำเร็จแล้วโดยใช้ False Data Injection Attack และดึง operational error flag ออกมา


ข้อสังเกต:

มีสองคำถามจากผู้เข้าร่วมเกี่ยวกับว่าพวกเขาสามารถใช้โซลูชันอื่นเพื่อ "by pass" challenge ได้หรือไม่:

Q1: ฉันสามารถใช้ False command injection เพื่อแก้ไขเอาต์พุตของคอยล์ได้โดยตรงหรือไม่

คำตอบ: PLC Configuration ไม่ได้ให้ PLC Coil "allow read" และ "allow write" setup API ผู้ใช้ไม่สามารถแก้ไขคอยล์ของ PLC ได้โดยตรง

Q2: ฉันสามารถใช้ ARP spoofing และ MITM attack เพื่อแก้ไข Modbus request หรือ Modbus response message ของ controller ได้โดยตรงหรือไม่

คำตอบ: ในระหว่างการแข่งขัน เราอนุญาตให้ผู้เข้าร่วมดาวน์โหลดเครื่องมือ ARP spoofing / mitm บางอย่าง เช่น ettercap แต่โปรดดูที่ topology เครือข่ายในส่วนการกำหนดค่าเครือข่าย สวิตช์ตรงกลางที่เราได้กำหนดค่า static ARP entries บนสวิตช์ ดังนั้นเครื่องมือ ARP spoofing/mitm ส่วนใหญ่จะไม่ทำงาน


สรุป

Palantir Control challenge แสดงให้เห็นว่าช่องโหว่ด้าน IT สามารถลุกลามไปสู่ความล้มเหลวของระบบ OT ได้อย่างไร ซึ่งเผยให้เห็นความเสี่ยงด้านโครงสร้างพื้นฐานที่สำคัญ ด้วยการรวม web exploitation, protocol manipulation และ false data injection ผู้เข้าร่วมเชื่อมช่องว่างระหว่างโดเมนความปลอดภัย IT/OT ซึ่งเป็นทักษะที่สำคัญสำหรับการปกป้องสภาพแวดล้อมทางอุตสาหกรรม หากคุณสนใจเกี่ยวกับการแข่งขัน Critical Infrastructure CTF อย่าพลาด CISS2025 ในวันที่ 1 กันยายนนี้: https://itrust.sutd.edu.sg/ciss-2025/

ขอบคุณที่สละเวลาตรวจสอบรายละเอียดบทความ หากคุณมีคำถามและข้อเสนอแนะ หรือพบข้อผิดพลาดของโปรแกรม โปรดส่งข้อความถึงฉันได้เลย ขอบคุณมากหากคุณสามารถให้ความคิดเห็นและแบ่งปันคำแนะนำในการปรับปรุง เพื่อให้เราสามารถทำให้งานของเราดีขึ้นได้ ~


แก้ไขล่าสุดโดย LiuYuancheng([email protected]) เมื่อ 06/06/2025 หากคุณมีปัญหาใดๆ โปรดส่งข้อความถึงฉัน

 

           

  RELATED


No related articles

  0 COMMENT


No comment for this article.



  PROGRAMMER HUMOR

When rookie fixes bug the first time


  SUPPORT US