Jumat, 20 September 2024

Death Bed Challenge: Petualangan Menemukan Lokasi Asli Sebuah Foto

Death bed merupakan salah satu challenge yang menarik, karena pada challenge ini kita tidak mencari suatu kerentanan pada suatu sistem, melainkan mencari sebuah lokasi hanya bermodalkan satu foto saja. Ini merupakan challenge keenam dari Komunitas Skill Issue.

Ketika artikel ini ditulis pada tanggal 13 September 2024, sebenarnya hanya terdapat tiga orang yang menyelesaikan challenge ini (saya salah satunya), namun karena beberapa pertimbangan dari author, akhirnya waktunya diperpanjang sampai tanggal 20. 

Pada challenge ini kita hanya diberikan sebuah foto tanpa adanya konteks yang berarti.

Foto yang disertakan pada challenge.


Ketika memeriksa EXIF data pada foto ternyata juga tidak terdapat informasi yang berarti.

Akhirnya saya berasumsi untuk mendapatkan flag pada challenge ini yaitu menemukan tempat di mana tempat pengambilan foto tersebut dengan menggunakan GEOINT.

Untuk memudahkan, foto yang disertakan pada challenge tersebut ke depannya saya akan tulis sebagai Sampel Foto.


Apa itu GeoInt?

GEOINT adalah singkatan dari Geospasial Intelejen yaitu ilmu yang mempelajari dan menganalisis gambar-gambar Bumi (seperti foto satelit atau peta) untuk mendapatkan informasi penting. 

Informasi ini bisa tentang apa saja, mulai dari bangunan, jalan, hingga aktivitas manusia. 


Pendahuluan

Pendekatan yang saya gunakan cukup sederhana untuk menyelesaikan challenge ini, yaitu dengan menganalisis berbagai objek yang ada pada elemen foto atau sering disebut Imagery Analysis.


Imagery Analysis

Tentu dengan memeriksa berbagai objek pada elemen foto seperti pada foreground dan background sangat penting untuk mendapatkan konteks jika EXIF data tidak lagi tersedia, karena konteks sekecil apa pun akan sangat membantu dalam melakukan geoint.


Foreground

Dalam melakukan analisis pada foreground gambar, kita bisa memperhatikan apa saja objek ikonis yang ada di depan gambar seperti sebuah tulisan, muka seseorang, marka jalan, dsb. 

Pada sampel foto ini terdapat beberapa objek yang bisa dijadikan petunjuk seperti koridor, dua antena parabola putih, duct exhaust, atap yang memiliki dua tanda putih serta beberapa atap tipe gable yang sama, untuk lebih jelas perhatikan beberapa tanda merah di bawah ini:

Identifikasi beberapa objek pada foreground


Background

Begitu juga pada background gambar, dengan memperhatikan objek terjauh dari suatu gambar, seperti bangunan memiliki bentuk spesifik, kita bisa mendapatkan petunjuk yang lebih baik.

Sebagai contoh dua gedung coklat tersebut karena memiliki bentuk tepian yang cukup unik dan bisa kita jadikan titik fokus.

Maksud saya titik fokus di sini adalah objek yang akan dijadikan patokan ketika menggunakan Imaging reverse tool, dengan harapan agar anda dapat lebih mudah mengerti.

Identifikasi objek pada backgroud


Image Reverse Search

Setelah mengidentifikasi berbagai objek yang ada. 

Pada tahap ini kita dapat menemukan beberapa informasi dengan menyamakan titik fokus dengan bantuan tool imaging reverse, ada beberapa yang bisa digunakan seperti yandex atau pun google images search.

Tampilan antarmuka google images



Menyamakan bangunan

Melalui google images bisa diketahui gedung itu bernama Sunter Park View di Jalan Yos Sudarso, RT.3/RW.11, Sunter Jaya, Jakarta Utara. 

Hasil pencarian pada lens menunjukkan beberapa bentuk gedung yang mirip

Ternyata gedung tersebut bernama Sunter Park View

Foto gedung Sunter Park View via galeri Trip dot com 

Foto gedung lainnya yang diambil dari Sunter Park View via galeri Trip dot com

Mencari nama tempat yang sama pada google earth

Foto gedung Sunter Park View via galeri Google Maps 

Foto gedung Sunter Park View dari sudut yang berbeda via galeri Google Maps

Menyamakan kedua bentuk antara foto yang ada


Untuk memastikan apakah gedung tersebut sama dengan gedung yang ada di foto, selain dengan menyamakan hasil Imaging reverse dengan foto yang diberikan seperti di atas, kita juga bisa menyamakan objek di dekat titik yang dingin difokuskan (Dalam hal ini Gedung Sunter Park View) dan coba melihat dari berbagai sudut foto yang berbeda. Di sini kita bisa memanfaatkan koleksi foto google Maps dan Trip untuk mencarinya.

Ada tiga objek yang bisa digunakan seperti dua bangunan di depan gedung Sunter Park View dan tujuh gedung tinggi di arah Jam 2.

Tiga objek terdekat dari titik fokus

Dua bangunan di depan gedung Sunter Park View dari sampel foto

Mengecek dua bangunan di depan Sunter Park View melalui google earth.

Untuk memastikan lebih lanjut kita bisa mencari gedung tinggi ini.

Mencari gedung berdasarkan foto via Galeri Trip dot com

Mencari informasi lebih lanjut melalui google earth


Ternyata nama gedung tinggi ini adalah Paladin Park


Setelah menyamakan ketiga objek yang ada, dengan ini bisa dipastikan sampel foto yang ada memang diambil di Daerah Sunter Jaya, Jakarta Utara.

Tiga nama objek terdekat dari titik fokus


Menemukan flag

Jika diperhatikan pada beberapa foto dari sudut berbeda dan mencocokkan objek pada foreground sebelumnya, kita dapat mengetahui foto tersebut diambil dari sudut depan gedung Sunter Park View lalu setelah memeriksanya area tersebut pada Google Earth, pada akhirnya kita tertuju pada suatu kedai kopi yaitu Kopi Astra (Kopi Satu Hati)

Foto dari sudut pandang Gedung Sunter Park View

Jika diperbesar, pada foto ini terdapat objek yang telah kita identifikasi sebelumnya

Jika melalui tampilan satelit arah pandangnya seperti ini

Setelah menyisir area yang telah ditunjukkan di atas, kemungkinan disinilah foto sampel diambil

Mendapatkan lokasi yang tepat dengan menyamakan berbagai objek

Di dekat lokasi tersebut terdapat satu kedai kopi


Ini juga diperkuat dengan nama challengenya sendiri yaitu "Death Bed".

Hasil pencarian kalimat Death Bed pada mesin pencari


Sampai saat ini mungkin anda berpikir, apakah Koordinat kedai kopi yang menjadi flagnya?

Jawabannya tentu tidak, karena ketika membuka informasi tentang kedai kopi tersebut pada google maps dan melihat review yang ada, terdapat satu pesan review yang cukup janggal.

Pesan review yang janggal


Apakah anda bisa melihat kejanggalannya? 

Benar, terdapat beberapa huruf yang ditebalkan.

Setelah menyatukan beberapa huruf yang ditebalkan, sebuah kata akan muncul yaitu:

sianid4bukan

Tetapi tidak sampai di situ, terdapat kejanggalan pada kalimat di bawah ini: 

Tapi overall sih rekomen banget buat kalia𝐧 yang nyari tempat ngopi santai. Bakal balik lagi kesini deh!?

Yaitu terdapat kesalahan penggunaan tanda baca di akhir karena kalimat tersebut bersifat pernyataan jadinya tanda tanya (?) tidak perlu digunakan. Dengan itu bisa disimpulkan tanda tanya ini merupakan bagian dari flag itu sendiri.

Jadi flag yang benar adalah "sianid4bukan?" dan lokasi pengambilan foto itu berada di suatu kedai kopi di daerah Sunter Jaya, Jakarta Utara.

Notifikasi ketika telah menyelesaikan challegenya


Penutup

Berbagai cara yang dilakukan pada artikel ini hanyalah contoh sederhana dari penerapan geoint
dalam kehidupan sehari-hari. Saya berharap artikel ini dapat membantu anda melihat gambaran bagaimana memanfaatkan berbagai data yang terbuka untuk keperluan tertentu.

Terima kasih banget buat Mas Dwi, Mas Rio, dan Mas Faizal yang udah bikin challenge seru ini! Berkat kalian, saya bisa menemukan contoh kasus yang relevan dan membuat postingan ini. Terima kasih juga buat Mas Ilen atas masukannya, dan buat semua teman-teman di Skill Issue yang selalu saling mendukung.

Jika terdapat kesalahan definisi atau penjelasan yang kurang jelas dalam postingan ini, silahkan memberikan kritik ataupun sarannya melalui form kontak yang telah disediakan.

Akhir kata saya mengucapkan terima kasih.

Sabtu, 03 Agustus 2024

Skill Issue Challenge: Stasiun Balapan

Stasiun balapan merupakan challenge kedua dari weekly challenges komunitas Skill Issue.

Pada postingan kali ini saya memaparkan bagaimana cara mendapatkan flagnya dengan mereverse engineer programnya.

Challenge dirilis pada hari Senin 28 Juli 2024, sama seperti format pada umumnya, yang mana kita harus menemukan cara untuk mendapatkan flagnya.

Jika deskripsi challengenya sedikit aneh, mohon agar dimaafkan


Informasi file

Di sini diberikan sebuah file zip yang di dalamnya terdapat beberapa file executable.



Ketika mencoba menjalankannya, program ini akan meminta menginput password. Setelah menginputkan password, output yang diterima akan blank/kosong dan pesan akan muncul hanya ketika kita terminate programnya.

Output program blank

Pesan coba lagi muncul hanya ketika program diterminate


Notifikasi

Ketika memasukkan file ini ke IDA Freeware, Sebuah notifikasi akan muncul untuk memberitahukan bahwa segmen pada file ini rusak, dan notifikasi ini biasanya muncul ketika program yang dimasukkan masih dalam kondisi terpack dan dengan melihat nama segmen yang ada, diketahui bahwa file ini dipacking dengan UPX.

Notifikasi dari IDA

Nama segmen program ketika kondisi dipack


FYI : Fungsi packer untuk mengurangi ukuran dan mempersulit analisis.

Jadinya di sini hanya perlu mengunpacknya, setelah itu tinggal memasukkan kembali ke dissasembler.

Setelah diunpack ukuran programnya menjadi lebih besar

Segmen seperti text juga sudah terlihat

Program ini juga ditulis dengan bahasa golang. Untuk mengetahuinya sebenarnya cukup mudah, bisa dengan melihat terdapatnya fungsi seperti fmt dan nama fungsi yang sangat banyak.

Dan ini terjadi karena di Golang, library yang ada akan di linked secara statis, yang berarti segala library yang dibutuhkan akan dimasukkan juga ke dalam program. 

Jadi jangan heran kalau program sesederhana hello world di Golang ukurannya akan cukup besar.


Perulangan

Pada fungsi main, akan terdapat potongan kode pada alamat loc_494918 seperti ini:
loc_494918:
test    al, al
jz      short loc_494960
mov     eax, dword_585F00
test    eax, 1
jz      short loc_494912

Yang mana register al dengan al akan dibandingkan untuk mengatur status zero flag dan jika nilai dari zero flag bernilai 1, maka akan melompat ke alamat loc_494960 dan jika zero flag bernilai 0, maka program akan berlanjut sampai bertemu alamat loc_494912.

Alur loc_494918



Yang menambah keseruan challenge ini ialah ketika mencoba menginput password apa pun, nilai zero flag akan tetap 0, yang berarti kita akan selalu terlempar ke alamat loc_494912, dan akan terus melakukan perulangan tanpa henti.

Alur loc_494912



Maka dari itu kenapa setelah menginputkan password, output yang kita terima akan blank. Sedangkan untuk mendapatkan flag yang dibutuhkan, kita harus melompat ke alamat loc_494960.

Untuk mengatasi ini kita hanya perlu mengubah alur agar alamat loc_494960 tereksekusi dengan mengubah jz    short loc_494960 menjadi jnz    short loc_494960.

    Sebelum loc_494960 diubah

Setelah loc_494960 diubah


Alur loc_494918 setelah diubah


Ada kelanjutannya

Memang setelah mengubah alur seperti di atas masalah perulangan tanpa henti bisa diatasi. Namun untuk mendapatkan flagnya tidak cukup sampai disitu.

Karena pada fungsi getFlag ini, akan terjadi pengecekan sekali lagi. 

Nilai register eax akan diisi dengan angka acak lalu ditambahkan dengan 50 (32h kalau dalam hexa), setelah itu akan dibandingkan dengan nilai dword_585EFC seperti potongan kode di bawah ini:
mov     [esp+38h+var_38], 32h
call    math_rand_Intn
mov     eax, [esp+38h+var_34]
add     eax, 32h ;
cmp     dword_585EFC, eax
jl      loc_494C33

Jika nilai dword_585EFC lebih kecil dari nilai register eax maka akan melompat ke alamat loc_494C33.

Yang mana, jika mengikuti alur alamat ini, kita akan berakhir pada pemanggilan fungsi runtime_gopanic.




Namun jika nilai dword_585EFC lebih besar atau sama dengan nilai register eax, flag akan dimunculkan.

Alur loc_494B54


Jadi pada tahap ini hanya perlu mengubah nilai jl    loc_494C33 menjadi jge   loc_494C33.

Sebelum loc_494C33 diubah

Setelah loc_494C33 diubah

Alur loc_494B54 setelah diubah



Setelah mengubah alur program dan menjalankan programnya, kita tinggal memasukkan password apa saja, maka flag yang dicari akan muncul.

Program berhasil menampilkan flag


Cara Alternatif

Selain dengan mengubah alur program, kita juga bisa mendapatkan flag dengan cara yang cukup mudah daripada mengubah alur program, yaitu dengan mencari langsung flagnya di dalam program.

Di sini kita hanya perlu mengunjungi fungsi skill_issue_org_stasiun_balapan_pkg_vars_init dan mengubah nilai hex menjadi char pada word_586180 sampai dengan dword_586192.



Nilai yang tersimpan akan terbalik, ini dikarenakan arsitektur Intel menyimpan alamat dengan format little endian.

Setelah dibalik akan menjadi seperti berikut:

n1ng$etasiyun\xE2\x82\xBFalapan 

Tapi tidak seperti challenge sebelumnya yang flagnya bisa terbaca jelas, di challenge ini akan ada 3 byte yang tidak terkonversi ke char.

Untuk mengetahui 3 byte tersebut merepresentasikan apa, kita hanya perlu tahu bagaimana komputer mengenali simbol emoticons atau huruf selain alfabet seperti kanji.

Ya benar sekali, UTF/Unicode.

xE2\x82\xBF jika dikonversi ke UTF-8 akan menjadi Bitcoin Sign atau ₿.

Penutup

Selain dua cara di atas, sebenarnya masih ada beberapa cara yang bisa digunakan untuk menyelesaikan challenge ini, seperti memasukan input terus-menerus sampai dword_585EFC menjadi lebih dari 50. Namun pendekatan seperti mengubah alur program lebih menarik buat saya.
  
Menurut saya challenge ini tentunya lebih menantang dari challenge sebelumnya karena alurnya lebih rumit dan flag yang disimpan di dalam program juga tidak serta merta terlihat.

Selain itu, penggunaan bahasa golang juga semakin menyulitkan dalam melakukan analisis, konsep seperti mutex dan gouroutine tentunya cukup menyulitkan, apa lagi yang kurang familier dengan bahasa yang satu ini seperti saya contohnya.

Tapi sebagai reverser, tentu kita tidak bisa memaksa pembuat program harus memakai bahasa yang kita tahu saja. Kita perlu fleksibel dan siap beradaptasi dengan berbagai bahasa pemrograman yang digunakan.

Jika terdapat kesalahan dalam penulisan, istilah, ataupun metode yang digunakan, saya menerima kritik dan sarannya dengan terbuka.

Akhir kata saya mengucapkan terima kasih kepada seluruh member Komunitas Skill Issue.

Minggu, 16 Juni 2024

Mengelabui Mekanisme Pendeteksi Browser CBT Dengan User Agent Spoofing

Menjaga konsistensi adalah hal yang sangat penting ketika aktivitas ujian berbasis komputer (CBT) dilakukan, salah satu caranya dengan membuat sebuah browser yang memiliki fungsi untuk itu dan inilah yang ditawarkan oleh exam browser.

Exam browser adalah browser yang digunakan untuk membuat lingkungan yang aman yang artinya browser ini memiliki fitur untuk membatasi segala hal yang dapat mengganggu konsistensi ujian seperti tindakan membuka tab lain untuk mencari jawaban, beralih ke aplikasi lain, dan sebagainya.

Namun bagaimana jika keamanan browser yang telah dirancang sedemikian rupa tersebut dapat dikelabui dengan cara yang tergolong sederhana?


Menemukan alamat web server

Tentu hal pertama yang dilakukan adalah dengan menemukan alamat web servernya. 

Dengan menangkap paket dan mencari frame yang memuat informasi tertentu di jaringan hal yang kita cari akan ditemukan.

Alamat web server


Mengakses alamat web server

Ternyata setelah menemukan alamat server yang terkait tidaklah cukup, karena terdapat mekanisme pendeteksi jenis browser yang digunakan ketika mengakses alamat tersebut.



Untuk mengetahui cara kerja pendeteksi ini kita hanya perlu tahu dari mana web server bisa mengidentifikasi tentang aplikasi, sistem operasi dan vendor yang kita gunakan.

Ya, dari user agent header!

Webserver CBT menggunakan header user agent untuk mengidentifikasi browser yang digunakan sewaktu mengakses alamatnya.

Jika nilai header yang telah ditentukan web server sama dengan nilai header browser yang mengakses, maka halaman login bakal ditampilkan. 

Namun jika tidak tampilkan pesan error 402.

Adapun gambaran besar alur pengecekannya kira-kira seperti gambar di bawah ini:



Kita hanya perlu menemukan nilai header user agent exambrowsernya untuk menipu fungsi pendeteksi ini yang mana seakan-akan web server mendeteksi kita menggunakan exambrowser dalam mengakses alamatnya. 


Masalah lain

Terdapat masalah ketika mencoba melihat paket yang lewat, di mana paket-paket ini terenkripsi dengan TLS.

Paket yang masih terenkripsi


Kita dapat mendekripsi paket yang ada dengan fitur Pre-Master Secret dari wireshark. 



Kemudian setelah terdekripsi paket HTTP/2 akan terlihat, dengan mengikuti stream paket tersebut, kita akan menemukan nilai header user agentnya. 

Paket yang telah terdekripsi


Menggunakan nilai user agent

Langkah terakhir dengan menyalin nilai header telah didapatkan ke browser yang kita gunakan, 

Contohnya di sini saya menggunakan Fitur Network Condition di Google Chrome, selanjutnya tinggal mengakses kembali alamat webserver dan akhirnya kita bisa mengelabui mekanisme ini dengan digantikannya pesan Error 402 dengan munculnya halaman login CBT.

Menyalin nilai header ke google chrome

Berhasil memuat halaman login CBT


Dampak yang terjadi

Hanya dapat mengakses ujian di luar exambrowser sebenarnya sudah merusak batasan yang seperti dijelaskan di atas. 

Karena peserta ujian dapat membuka tab baru untuk mencari jawaban, beralih ke aplikasi lain, mengunduh soal ujian, dsb.

Contoh dapat membuka tab baru


Penutup

Sebenarnya pada postingan ini saya ingin memperlihatkan bagaimana sebuah fungsi pendeteksinya dapat dikelabui dengan cara yang sangat sederhana.

Postingan Lainnya

Death Bed Challenge: Petualangan Menemukan Lokasi Asli Sebuah Foto

Death bed merupakan salah satu challenge yang menarik, karena pada challenge ini kita tidak mencari suatu kerentanan pada suatu sistem, mela...