Rabu, 12 Agustus 2026

Antara Logika Sisi Klien dan Integritas Manusia: Pelajaran Teknis di Balik Maraknya Kasus Absensi Ilegal

Isu penyalahgunaan aplikasi absensi pegawai di satuan pemerintah daerah sudah cukup marak terdengar di media sosial, awalnya saya mendengar kabar penyalahgunaan ini di tahun 2025 atau setahun yang lalu. 

Namun akhir-akhir ini makin banyak terdengar, apalagi sampai terdapat sindikat untuk menerobos keamanan aplikasi presensi pemerintah, seperti berita pada web media Detik bulan Mei kemarin.

Berita absensi fiktif yang dilakukan oleh ribuan ASN.


Mendengar betapa cukup masifnya aksi kurang terpuji ini, saya yang awalnya mungkin tidak ingin mengeluarkan tulisan baru pada akhirnya penasaran dan berniat untuk kembali mengisi blog saya ini.

Dan satu hal pertanyaan mendasar akan timbul:

Mengapa aplikasi absensi ini begitu rentan dimanipulasi?

Tulisan ini akan mengulas cara kerjanya, proteksi apa saja yang telah diterapkan pengembang sampai dengan potensi celah yang bisa dimanfaatkan oleh pada sindikat ataupun oknum pegawai yang tidak jujur ini berdasarkan kacamata keamanan siber.


Disclaimer: Artikel ini ditulis semata-mata untuk tujuan pembelajaran keamanan siber. Analisis yang saya lakukan murni hanya membedah kode aplikasinya saja dari luar secara pasif. Segala bentuk penyalahgunaan atas informasi teknis dalam tulisan ini adalah tindakan ilegal dan sepenuhnya berada di luar tanggung jawab penulis.


Anatomi Aplikasi Absensi Mobile

Sebelum masuk ke analisa yang lebih teknis. Ada baiknya kita memahami dulu konsep dasarnya. Secara sederhana, aplikasi absensi adalah perangkat lunak (dalam konteks tulisan ini perangkat lunak berbasis seluler) yang berfungsi untuk pencatatan atau mengelola kehadiran seorang pegawai, dan ini hanya bentuk digitalisasi dari mesin atau cara absensi konvensional seperti mesin absensi berbasis kartu ataupun sidik jari.

Perbedaan mesin absensi konvensional dan berbasis seluler/mobile.


Berbeda dengan mesin absensi konvensional. Aplikasi absensi mobile ini umumnya mengandalkan tiga komponen utama dalam cara kerjanya, diantara-Nya:

1.    Sensor GPS yang bertugas untuk mendapatkan data koordinat garis lintang serta bujur dari perangkat untuk memastikan pegawai berada di radius lokasi kantor yang telah ditentukan.

2.    Kamera untuk mengambil swafoto pegawai yang sering kali ditambahkan fitur verifikasi wajah agar memastikan foto yang diambil adalah benar foto pegawai itu sendiri juga memastikan foto yang dikirim asli, yaitu bukan foto hasil cetakan.

3.    Koneksi ke API untuk mengirim semua data koordinat, sampel foto, waktu, dan berbagai data ke server absensi untuk disimpan.


Begitulah gambaran dasar cara kerjanya, namun karena objektif saya adalah mengetahui lebih dari itu, maka pendekatan yang lebih teknis menjadi hal yang mesti dilakukan seperti mencoba melihat kode dibalik layar atau biasa disebut static analysis.

Setelah bagian ini saya akan memulai menjelaskannya dengan sedikit lebih teknis, namun saya usahakan untuk tetap menyampaikan dengan semudah mungkin.


Di Balik Layar: Lapisan Proteksi Sisi Klien

Saya menggunakan salah satu aplikasi absensi yang digunakan di suatu pemerintah daerah untuk dijadikan sampel, dan setelah beberapa waktu melihat serta mencoba memahami kode sumbernya, Terlihat dari pihak pengembang aplikasi sebenarnya sudah menerapkan beberapa lapisan perlindungan di dalam aplikasi, seperti:


1. Deteksi Root

Aplikasi akan melakukan pemindaian terhadap perangkat pengguna apakah sistem operasinya sudah diubah ke superuser/root.


public static boolean DeviceRooted() {
    try {
        return findBinary("su") || isRooted() || isPackageInstalled("eu.chainfire.supersu", BA.applicationContext)
|| new File("/system/app/Superuser.apk").exists();
    } catch (Throwable unused) {
        return false;
    }
}

public void checkAndEnforceSecurity(Activity currentActivity) {
    boolean isDeviceRooted = DeviceRooted();
    
    if (isDeviceRooted) {
        Common.ToastMessageShow("ROOT DETECTED! Maaf aplikasi tidak dapat berjalan pada rooted device.", true);
        
        if (currentActivity != null) {
            currentActivity.finish();
        }
    }
}

Seperti yang terlihat pada kode sumber di atas, mekanisme ini akan memanggil beberapa method untuk pemeriksaan seperti findBinary, isRooted, isPackageInstalled , dan melakukan pengecekan apakah file Superuser.apk ini ada. 

Kemudian jika salah satu method bernilai benar maka perangkat tersebut ialah perangkat yang memiliki akses super user. dan selanjutnya akan melakukan pengecekan kondisi jika nilai dari isDeviceRooted bernilai true maka pesan “ROOT DETECTED! Maaf aplikasi ini tidak dapat berjalan pada rooted device”, lalu menutup aplikasi.


Kenapa Ini Penting?

Sebagai pembaca, Anda mungkin bertanya.


“Mengapa mesti ada pengecekan ini?”

Jawabannya, ada banyak alasan mengapa aplikasi ini melakukan pemeriksaan akses superuser, namun satu hal yang mesti diketahui, yaitu perangkat yang memiliki akses superuser/root memiliki akses penuh terhadap sistem operasi.


2. Deteksi Mock Location

Selain mendeteksi apakah perangkat yang digunakan memiliki akses superuser, aplikasi ini juga sudah melakukan pengecekan untuk memastikan fitur mock location-Nya nonaktif.


JavaObject javaObject = (JavaObject) AbsObjectWrapper.ConvertToWrapper(new JavaObject(), this._location1.getObject());

this._ismock = BA.ObjectToBoolean(javaObject.RunMethod("isFromMockProvider", (Object[]) Common.Null));

if (this._ismock) {
    Common.ToastMessageShow("Silahkan matikan Fake GPS/Location terlebih dahulu!", true);
    presensi2.mostCurrent._activity.Finish();
}

Namun ternyata jika mock locationnya aktif aplikasinya akan menampilkan pesan “Silahkan matikan Fake GPS/Location terlebih dahulu!” kemudian menutup aplikasi.

Fitur mock ini harus dipastikan dalam keadaan nonaktif karena aplikasi seperti fake gps yang beredar umumnya mengharuskan agar fitur mock location pada perangkat harus aktif.


3. Deteksi Emulator

Pengembang juga melakukan antisipasi jika terdapat pengguna menggunakan perangkat selain handphone seperti laptop atau komputer yang mencoba menggunakan emulator untuk melakukan absensi, dengan menerapkan beberapa kombinasi seperti pengecekan direktori spesifik dari beberapa emulator dan penggunaan pustaka pendeteksi tingkat lanjut.


public static boolean checkBluestacksDirectory() {
    return File.Exists(File.getDirRootExternal(), "Android/data/com.bluestacks.home");
}

public static boolean checkIsEmulator() {
    boolean isEmulatorFound = false;

    if (checkBluestacksDirectory()) {
        isEmulatorFound = true;
    }

    EmulatorDetector.with(context)
        .addPackageName("com.bluestacks")        // Deteksi Bluestacks
        .addPackageName("com.bignox.app")        // Deteksi Nox Player
        .addPackageName("com.mumu.store")        // Deteksi MEmu / MuMu Player
        .addPackageName("com.android.ld.appstore") // Deteksi LDPlayer
        .detect(new OnEmulatorDetectorListener() {
            @Override
            public void onResult(boolean isEmulator) {
                if (isEmulator) {
                    // isEmulatorFound = true;
                }
            }
        });
        
    return isEmulatorFound;
}

Common.WaitFor("complete", main.processBA, this, starter.checkIsEmulator());

this._boolhasil = ((Boolean) objArr[0]).booleanValue();

if (this._boolhasil == true) {
    Common.ToastMessageShow("EMULATOR DETECTED! Maaf aplikasi tidak dapat berjalan pada emulator.", true);
    main.mostCurrent._activity.Finish();
    return;
}


Ilusi Keamanan : Kenapa Semua Cara Di Atas Bisa Runtuh?

Dari beberapa lapisan keamanan yang sudah dilakukan oleh pengembang cukup terlihat kuat bukan? 

Iyakan?

Sialnya ini hanya kelihatan kuat, namun ada beberapa celah yang bisa dimanfaatkan oleh oknum yang tidak bertanggungjawab untuk mengakali diantara-Nya:


Ini Hanya Sebatas Benar atau Salah

Semua proteksi yang telah dibahas seperti deteksi root, mock location, dan emulator memiliki satu kesamaan fatal.


“Semuanya dieksekusi di sisi perangkat pengguna”


Pemeriksaan keamanan tersebut pada dasarnya hanyalah pertanyaan bersyarat yang meminta jawaban apakah benar atau salah dan akan melakukan berdasarkan kondisinya.

Sebagai contoh pada pemeriksaan fake gps, aplikasi ini akan mencoba bertanya ke sistem android dan akan melihat jawabannya melalui variabel _ismock.


if (this._ismock) {

    Common.ToastMessageShow("Silahkan matikan Fake GPS/Location terlebih dahulu!", true);

    presensi2.mostCurrent._activity.Finish();

}

Jika para oknum tercela ini mengubah nilai ismock menjadi selalu salah/false melalui bentuk bahasa mesin atau biasanya disebut smali patching, maka setiap aplikasi bertanya ke sistem android seperti “Hey android, apakah mock locationnya aktif?” maka jawaban yang selalu diterima aplikasinya ialah “Tidak, mock locationnya tidak aktif!”.

Begitu juga pada bagian proteksi seperti pendeteksi root, dengan ini aplikasi akan selalu merasa bahwa perangkat yang digunakan dalam keadaan tidak memiliki akses superuser/root. Namun kenyataannya adalah sebaliknya. 

Dengan ini para oknum tersebut akan bisa melakukan beberapa hal seperti dapat mengubah nilai dari suatu variabel di memori, membaca isi data apa saja yang dikirim menggunakan framework tertentu seperti Frida atau Xposed. atau menyuntikan aplikasi dengan kamera palsu menggunakan modul LPosed tertentu untuk mencurangi face recognition atau bahkan liveness detection.


Menembak API Adalah Cara Alternatif

Jika para oknum ini merasa modifikasi seperti smali patching dirasa terlalu merepotkan, ada celah yang jauh lebih berbahaya dari sebatas mengubah nilai suatu variabel: kelemahan pada jalur komunikasi datanya!

Dari ketiga komponen utama di awal, saya sudah membahas mulai dari aplikasi ini akan mengumpulkan data seperti koordinat dari sensor gps, foto dari kamera, dan beberapa data yang akan dikumpulkan untuk dikirim ke server api untuk disimpan, untuk detailnya silakan lihat contoh source berikut:


Map data = new Map();

data.Put("timezone", this._tz);

data.Put("latt", Double.valueOf(this._latt)); // Titik Lintang GPS

data.Put("lng", Double.valueOf(this._lng));   // Titik Bujur GPS


int isWfh = 0;

if (presensi.isWfhModeAktif) {
    isWfh = 1;
}

data.Put("workfrom", isWfh);


data.Put("checkintype", this._ct);

data.Put("address", this._alamat);

data.Put("kesehatan", "");

data.Put("devicetype", "0");

data.Put("accu", this._acu); // Tingkat akurasi GPS

data.Put("fg", 0);


String jsonPayload = new JSONGenerator(data).ToString();


HttpJob httpJob = new HttpJob();

String urlEndpoint = starter.ws_endpoint + "/absence";

httpJob.PostString(urlEndpoint, jsonPayload);


httpJob.setHeader("Content-Type", "application/json");


String sessionId = starter.checkParam("session_id");

httpJob.setHeader("Cookie", "absence_session" + sessionId + "; Path=/; Domain=api.absensi.com;");


Common.WaitFor("jobdone", presensi.processBA, this, httpJob);

Terlihat data yang dikirim ke server backend adalah zona waktu, koordinat (nilai garis lintang dan bujur), apakah pengguna memiliki status bekerja dari rumah jika iya maka data wfh juga akan dikirimkan, tipe absensi (absensi datang dan pulang), alamat, kesehatan, tipe perangkat, tingkat akurasi sensor GPS dan fg yang kemungkinan adalah flag atau penanda untuk diproses lebih lanjut di server backend dalam format JSON.

Permasalahannya karena data tersebut dikirim secara mentah tanpa adanya pengamanan seperti SSL Pinning ataupun tanda tangan kriptografi seperti HMAC, apalagi alamat endpoint APInya juga disimpan dalam bentuk plainteks tanpa adanya usaha untuk menyamarkan isi source code.

Akibatnya maka para oknum dapat memanfaatkan celah ini dengan hanya perlu mengetahui sessionIdnya lalu menembak langsung dengan data yang telah dimanipulasi ke server tanpa melalui perantara aplikasi, dan bahayanya lagi jika server backend menerima permintaan tersebut karena mengira semua permintaan sah yang dikirim berasal dari aplikasi.


Temuan Tambahan Lainnya

Tidak hanya alamat endpoint yang terlihat jelas, di dalam aplikasi tersebut juga menyimpan informasi kredensial secara mentah seperti username dan password di dalam file lokal.


Mungkin Lupa

Tambahan kedua tidak kalah menarik, setelah mencoba analisis aplikasi ini, pihak pengembang sepertinya lupa untuk menghilangkan satu blok kode yang cukup menggelitik sebenarnya: terdapat kredensial yang dihardcoded dalam aplikasi.


if (this._user.equals("makoli_innaka_yama_gufron") && this._password.equals("semua_sandi_milik_allah_swt")) {
    starter._accountInfo("isdemo", "1");
    starter._accountInfo("nama", "Demo Account");
}

Catatan: data kredensial ini hanyalah contoh, bukan kredensial yang sebenarnya.


“Tapi kan itu hanya akun buat demonstrasi, apa salahnya jika dimasukkan?”


Memang, blok kode tersebut diadakan pasti untuk keperluan uji coba, namun meninggalkan kredensial secara mentah dalam aplikasi dalam versi produksi atau yang dirilis ke publik adalah suatu kecerobohan yang cukup berbahaya.

Dengan adanya informasi ini, pihak seperti sindikat di awal tulisan ini bisa mendapatkan beberapa informasi tambahan yang cukup berguna karena mereka tidak harus melakukan usaha lebih seperti mencari kredensial yang bocor ataupun melakukan aksi brute force untuk bisa masuk lalu memeriksa beberapa fungsi di dalam aplikasi.


Mitigasi: Apa Yang Mesti Dilakukan Oleh Pengembang?

Melihat beberapa bagian yang rentan pada aplikasi absensi di satuan pemerintah daerah yang mana terlalu percaya dengan perangkat pengguna, ada baiknya dari pihak pengembang atau instansi terkait untuk memperkuat sistem aplikasi ini, diantara-Nya:


1. Gunakan Sesuatu Yang Lebih Baik 

Pengecekan seperti root/super user, mock location dan emulator sebenarnya cukup baik. Namun, jangan hanya berharap dengan itu.

Tambahkan beberapa proteksi yang lebih baik seperti Google Play Integrity API untuk memastikan aplikasi berjalan di perangkat yang bersih dan sah, ini juga bisa untuk menghindari modifikasi seperti smali patching yang telah saya bahas di atas, pihak pengembang mungkin bisa membuat server backend hanya mau menerima permintaan dari aplikasi yang sudah teruji menurut aturan google play integrity ini. 

Jadinya aplikasi akan meminta sejenis token ke google, lalu google akan memeriksa apakah perangkat yang digunakan dalam keadaan bersih atau tidak, lalu jika perangkatnya aman, google akan mengembalikan token yang telah terenkripsi berisi status keasliannya.

Lalu token dari google tersebut juga akan dikirim bersama request api yang ada ke server backend.


{
  "timezone": "Asia/Jakarta",
  "latt": -7.5446651,
  "lng": 110.8052415,
  "workfrom": 0,
  "checkintype": 0,
  "address": "Jl. Kutai Utara No.1",
  "kesehatan": "",
  "devicetype": "0",
  "accu": 5,
  "fg": 0,
  "integrity_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjRiY...Wx1ZXN0YWNrcy5ob2ll"
}

Tidak hanya sampai situ disisi server pun juga dilakukan validasi untuk mengecek apakah token yang dikirim bersama request tersebut adalah token yang valid dan beberapa informasi tambahan seperti apakah aplikasinya asli, serta apakah perangkatnya aman?


Alur implementasi play integrity (yang disederhanakan).

Jika request yang dikirim berasal dari aplikasi sah dan perangkat yang aman maka server akan menerima permintaan untuk melakukan proses absensi lalu mengembalikan status "Absensi berhasil dicatat!".

Namun jika request yang dikirim berasal dari aplikasi hasil modifikasi ataupun perangkatnya tidak aman, maka server akan menolak permintaan tersebut secara langsung.


2. Amankan Jalurnya

Selain hal melakukan pemeriksaan pada integritas aplikasi, dari pihak terkait juga bisa melakukan pengamanan pada jalur komunikasi dengan menerapkan SSL Pinning secara ketat untuk menghindari terjadinya aksi penyadapan/intercept pada jaringan. 

Lengkapi juga pengiriman data dengan tanda tangan digital seperti HMAC atau cara sejenis agar setiap paket yang lewat tidak dapat dimanipulasi di tengah jalan.


3. Pindahkan Semua Prosesnya ke Server

Ini adalah kebalikan dari celah yang dimanfaatkan oleh mereka para oknum itu dengan menambahkan “Jangan buat”.

Dari “Semuanya dieksekusi di sisi perangkat pengguna”.

Menjadi

Jangan buat semuanya dieksekusi di sisi perangkat pengguna”.

Aplikasi ini seharusnya hanya untuk mengumpulkan data seperti data wajah dan koordinat, semua proses seperti validasi jarak, pemeriksaan keaslian waktu, sampai dengan verifikasi wajah diproses dan diputuskan sepenuhnya pada server.


4. Bersihkan Yang Tidak Perlu


// Contoh hasil obfuscation profesional menggunakan DexGuard / ProGuard tingkat lanjut

if (X9a.m3122(this.f102a, "\x9f\x42\x88\x11...[ciphertext acak]...")
&& X9a.m3122(this.f103b, "\x33\x7a\x91\xff...[ciphertext acak]...")) {
    C0142z.m5412(1192, 0x14f);
}

Sebelum merilis ke publik, pastikan informasi seperti akun demo, endpoint API, serta informasi penting lainnya disamarkan agar para pegawai ataupun oknum nakal ini lebih sulit untuk menganalisis atau mendapatkan informasi sensitif.


Penutup Cerita

Semoga tulisan hasil iseng saya ini bisa membantu para pihak terkait untuk mengevaluasi ataupun masyarakat untuk lebih mengenal bagaimana gambaran cara para oknum bisa menyalahgunakan sebuah celah pada aplikasi. Dan bisa menjadi bacaan yang menarik dan bermakna bagi semua pembaca.


Akhirnya, pertanyaan mendasar di awal telah terjawab, yaitu:

“Karena aplikasi absensi yang digunakan masih mempercayai sisi dari pengguna. Celah tersebut bisa dimanfaatkan oleh para pegawai dan oknum nakal untuk bisa melakukan absensi fiktif.”

Sebenarnya berbagai cara yang telah dijabarkan tidak seratus persen bisa menutup celah yang ada, namun itulah kenyataan dari keamanan siber, bukan untuk mengamankan secara menyeluruh karena tidak ada hal yang benar-benar aman secara mutlak, tapi membuat para penjahat siber ini lebih rumit dan mahal untuk melakukan kejahatannya.

Tapi selain memperbaiki integritas sebuah sistem aplikasi, ada juga hal yang lebih penting dari itu semua.

“Integritas pegawai negerinya sendiri”.

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.

Postingan Lainnya

Antara Logika Sisi Klien dan Integritas Manusia: Pelajaran Teknis di Balik Maraknya Kasus Absensi Ilegal

Isu penyalahgunaan aplikasi absensi pegawai di satuan pemerintah daerah sudah cukup marak terdengar di media sosial, awalnya saya mendengar ...