Watch Tower adalah tantangan CTF kategori ICS dengan tingkat kesulitan very easy dari HTB Challenges. Soal ini dibuat oleh diogt dan telah dirilis pada 16 Juli 2023.
Berikut adalah deskripsi dari tantangan ini:
Our infrastructure monitoring system detected some abnormal behavior and initiated a network capture. We need to identify information the intruders collected and altered in the network.
1. Analisa Awal
Diberikan file bernama tower_logs.pcapng
. Berdasarkan deskripsi, kita diminta menganalisis traffic jaringan untuk mengidentifikasi informasi yang didapatkan dan diubah oleh penyerang.
Setelah dibuka, isi file berupa traffic Modbus TCP, dengan rincian:
192.168.1.150
→ User (mengirim request ke PLC).192.168.1.252
→ PLC (memberikan respons).- Karena hanya ada 2 IP dalam PCAP, dapat disimpulkan penyerang menggunakan IP
192.168.1.150
. - Function code yang digunakan dalam komunikasi ini:
15
: Write Multiple Coils1
: Read Coils16
: Write Multiple Registers
2. Memahami Modbus
Untuk bisa mengetahui data apa saja yang diambil dan diubah oleh penyerang, kita perlu memahami dasar protokol Modbus terlebih dahulu.
2.1. Tipe Data
Modbus memiliki 4 tipe data dengan 2 tipe panjang data. Berikut adalah penjelasan singkatnya:
Nama | Panjang | Akses | I/O | Contoh Penggunaan |
---|---|---|---|---|
Discrete Input | 1 bit | Read | DI | Baca status pintu (terbuka = 1, tertutup = 0) |
Coil | 1 bit | Read + Write | DO | Nyalakan atau matikan lampu dengan relay. |
Input Register | 16 bit (2 byte) | Read | AI | Baca suhu ruangan dari sensor (misal 26.7 °C) |
Holding Register | 16 bit (2 byte) | Read + Write | AO | Atur kecepatan kipas (misal 0-100%) |
Keterangan jenis I/O:
- DI (Digital Input) → Baca status ON/OFF.
- DO (Digital Output) → Kontrol ON/OFF
- AI (Analog Input) → Baca angka.
- AO (Analog Output) → Kontrol angka.
2.2. Function Code
Function code (FC) adalah kode perintah dalam Modbus agar perangkat (PLC, sensor, aktuator) tahu operasi apa yang harus dilakukan.
FC | Nama | Target Data | Keterangan | Contoh |
---|---|---|---|---|
01 | Read Coils | Coil (1 bit) | Membaca status ON/OFF dari output digital. | Membaca apakah lampu ruang tamu sedang menyala atau mati. |
02 | Read Discrete Inputs | Discrete Input (1 bit) | Membaca status ON/OFF dari input digital. | Membaca apakah tombol lampu ditekan atau tidak. |
03 | Read Holding Registers | Holding Register (16 bit) | Membaca nilai dari register yang dapat diatur. | Membaca nilai pengaturan batas suhu AC (misalnya 25 °C). |
04 | Read Input Registers | Input Register (16 bit) | Membaca nilai dari register yang hanya dapat dibaca. | Membaca suhu ruangan dari sensor (misalnya 27 °C). |
05 | Write Single Coil | Coil (1 bit) | Menulis status ON/OFF ke satu output digital. | Menyalakan atau mematikan lampu ruang tamu. |
06 | Write Single Register | Holding Register (16 bit) | Menulis nilai ke satu register. | Mengatur batas suhu AC menjadi 22 °C. |
15 (0x0F) | Write Multiple Coils | Beberapa Coil (1 bit) | Menulis status ON/OFF ke beberapa output digital. | Menyalakan atau mematikan semua lampu rumah sekaligus. |
16 (0x10) | Write Multiple Registers | Beberapa Holding Register (16 bit) | Menulis nilai ke beberapa register. | Mengatur batas suhu AC dan kecepatan kipas dalam satu perintah. |
2.3. Praktik Modbus
Agar lebih memahami traffic Modbus, kita sebaiknya mencoba langsung mengirimkan request ke Modbus.
Kita akan menggunakan docker untuk menjalankan Modbus server:
sudo docker run -d --rm --name modbus-server -p 502:5020 oitc/modbus-server
Catatan:
Nilai default untuk semua variabel di modbus-server adalah0
.
Lalu untuk mengirimkan request, kita akan menggunakan modpoll.
Sebelum melihat contoh penggunaannya, penting untuk memahami terlebih dahulu bagaimana struktur pesan dalam Modbus dibentuk.
PDU (Packet Data Unit) adalah bagian inti dari pesan Modbus.
Struktur PDU terdiri dari:
Field | Ukuran | Keterangan |
---|---|---|
Function Code | 1 byte | Jenis operasi |
Data | N byte | Field tambahan (alamat, jumlah, nilai, dsb.) |
Berikut adalah contoh praktik request dan respons di Modbus:
FC 1 - Read Coils
Jalankan Wireshark dan lakukan capture traffic pada interface loopback. Kemudian jalankan request Modbus dengan perintah berikut:
# PDU = 01 00 001 00 02# - 01 → Function Code (1)# - 00 01 → Reference Number (1)# - 00 04 → Bit Count (2)modpoll -m tcp -0 -1 -t 0 -r 1 -c 2 127.0.0.1
Keterangan:
-m tcp
: Pilih protokol Modbus TCP (via IP/port 502).-0
: Aktifkan zero-based addressing.- Alamat pertama = 0.
- Kalau tanpa
-0
, alamat pertama = 1.
-1
: Poll sekali saja, tidak looping. Tanpa ini,modpoll
terus mengulang setiap 1 detik.-t 0
: Tipe data yang diakses.0
= Coil1
= Discrete Input3
= Input Register4
= Holding Register
-r 0
: Reference Number = alamat coil awal yang dibaca (mulai dari coil #1).-c 2
: Bit Count = jumlah coil yang dibaca, dimulai dari Reference Number dan berlanjut ke alamat selanjutnya (increment +1).- Jadi di sini: coil #1 → lalu coil #2.

FC 15 - Write Multiple Coils
# PDU = 0f 00 00 00 03 01 05# - 0f → Function Code (15)# - 00 00 → Reference Number (0)# - 00 03 → Word Count (3)# - 01 → Byte Count (1)# - 05 → Coil Value #0 = 1, #1 = 0, #2 = 1modpoll -m tcp -0 -1 -t 0 -r 0 -c 3 127.0.0.1 1 0 1

FC 16 - Write Multiple Registers
# PDU = 10 00 34 00 02 04 03 e8 07 d0# - 10 → Function Code (16)# - 00 34 → Reference Number (52)# - 00 02 → Word Count (2)# - 04 → Byte Count (4 = 2 register × 2 bytes)# - 03 e8 → Register Value #1 = 1000 (big-endian)# - 07 d0 → Register Value #2 = 2000 (big-endian)modpoll -m tcp -0 -1 -t 4 -r 52 -c 2 127.0.0.1 1000 2000

3. Mendapatkan Flag
Setelah memahami cara kerja Modbus, buka Wireshark lalu pilih menu Follow → TCP Stream.
Pada bagian ASCII terlihat bahwa terdapat flag dari sekumpulan request yang dikirim oleh penyerang.

HTB{3nc2yp710n?_n3v32_h342d_0f_7h47!@^}
Setelah dianalisis, flag ternyata disisipkan pada bagian Reference Number. Berikut beberapa contohnya:
72
→H
84
→T
66
→B
123
→{
123
→}

4. Penutup
Dari tantangan ini, saya belajar banyak tentang Modbus: mulai dari tipe data, function code, hingga bagaimana paket dikirim dan dianalisis.
Semoga tulisan ini bermanfaat untuk pembaca yang ingin memahami dasar analisis traffic ICS.