Skip to content

[HTB Challenges] Watch Tower

Updated:

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:


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:

NamaPanjangAksesI/OContoh Penggunaan
Discrete Input1 bitReadDIBaca status pintu (terbuka = 1, tertutup = 0)
Coil1 bitRead + WriteDONyalakan atau matikan lampu dengan relay.
Input Register16 bit (2 byte)ReadAIBaca suhu ruangan dari sensor (misal 26.7 °C)
Holding Register16 bit (2 byte)Read + WriteAOAtur kecepatan kipas (misal 0-100%)

Keterangan jenis I/O:

2.2. Function Code

Function code (FC) adalah kode perintah dalam Modbus agar perangkat (PLC, sensor, aktuator) tahu operasi apa yang harus dilakukan.

FCNamaTarget DataKeteranganContoh
01Read CoilsCoil (1 bit)Membaca status ON/OFF dari output digital.Membaca apakah lampu ruang tamu sedang menyala atau mati.
02Read Discrete InputsDiscrete Input (1 bit)Membaca status ON/OFF dari input digital.Membaca apakah tombol lampu ditekan atau tidak.
03Read Holding RegistersHolding Register (16 bit)Membaca nilai dari register yang dapat diatur.Membaca nilai pengaturan batas suhu AC (misalnya 25 °C).
04Read Input RegistersInput Register (16 bit)Membaca nilai dari register yang hanya dapat dibaca.Membaca suhu ruangan dari sensor (misalnya 27 °C).
05Write Single CoilCoil (1 bit)Menulis status ON/OFF ke satu output digital.Menyalakan atau mematikan lampu ruang tamu.
06Write Single RegisterHolding Register (16 bit)Menulis nilai ke satu register.Mengatur batas suhu AC menjadi 22 °C.
15 (0x0F)Write Multiple CoilsBeberapa Coil (1 bit)Menulis status ON/OFF ke beberapa output digital.Menyalakan atau mematikan semua lampu rumah sekaligus.
16 (0x10)Write Multiple RegistersBeberapa 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:

Terminal
sudo docker run -d --rm --name modbus-server -p 502:5020 oitc/modbus-server

Catatan:
Nilai default untuk semua variabel di modbus-server adalah 0.

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:

FieldUkuranKeterangan
Function Code1 byteJenis operasi
DataN byteField 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:

Terminal
# 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:

Analisis Traffic Read Coils (FC 1)
Analisis Traffic Read Coils (FC 1)

FC 15 - Write Multiple Coils

Terminal
# 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 = 1
modpoll -m tcp -0 -1 -t 0 -r 0 -c 3 127.0.0.1 1 0 1
Analisis Traffic Write Multiple Coils (FC 15)
Analisis Traffic Write Multiple Coils (FC 15)

FC 16 - Write Multiple Registers

Terminal
# 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
Analisis Traffic Write Multiple Registers (FC 16)
Analisis Traffic Write Multiple Registers (FC 16)

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.

Menemukan Flag pada format ASCI
Menemukan Flag pada format ASCI
HTB{3nc2yp710n?_n3v32_h342d_0f_7h47!@^}

Setelah dianalisis, flag ternyata disisipkan pada bagian Reference Number. Berikut beberapa contohnya:

Flag disimpan di Reference Number
Flag disimpan di Reference Number

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.


Web Reconnaissance & Enumeration Cheatsheet