Berburu Hidden Secret Key di APK: Keseruan Menyelesaikan Tantangan Android CrackMe App

Memahami cara melindungi dan menguji keamanan sistem merupakan dua hal penting dalam cybersecurity. Program CrackMe secara langsung memberikan kesempatan untuk mempelajari kedua aspek tersebut. Teknik reverse engineering berguna untuk mengidentifikasi potensi kerentanan yang dapat terjadi pada suatu aplikasi. Tidak hanya memberikan wawasan teknis untuk eksploitasi sistem, namun juga mengasah pemahaman tentang bagaimana melindungi sistem tersebut.

Pendahuluan

Pertumbuhan yang pesat dan terintegrasi pada berbagai ekosistem menjadikan Android sebagai sistem operasi mobile yang dominan. Popularitasnya sebagai sistem operasi, menjadikan Android sebagai target utama bagi berbagai macam ancaman siber, diantaranya akses tidak sah dan malware dari aplikasi yang diinstal ataupun file lainnya 1.

Android Application Package atau yang lebih dikenal sebagai Android Package Kit (APK) merupakan sebuah file arsip dengan format .apk, di dalamnya terdapat konten aplikasi Android yang dibutuhkan pada runtime, dan file tersebut dikenali perangkat berbasis Android untuk menginstall aplikasi 2. Reverse Engineering merupakan teknik yang dapat digunakan untuk menganalisis file APK. Teknik ini dapat membantu dalam Analisis Keamanan dan Deteksi Malware, Mendeteksi Penyalahgunaan Izin dan Privasi, Pengujian dan Perbaikan Aplikasi, Pembelajaran dan Pengembangan Proteksi, Interoperabilitas dan Pemeliharaan 3.

Crackme merupakan sebuah program sederhana yang dirancang khusus untuk menguji kompetensi sekaligus media pembelajaran melakukan reverse engineering bagi seorang programmer, praktisi maupun peneliti keamanan siber. Skema yang digunakan biasanya mengacu pada ekosistem nyata baik dari segi algoritma maupun sistem keamanan 4. Tantangan utama dalam Crackme adalah menemukan suatu data atau mem bypass sistem keamanan menggunakan teknik reverse engineering.

Android CrackMe App: Can You Find the Key? merupakan salah satu program Crackme aplikasi android yang dibuat oleh ITSEC. Tantangan terdiri dari tiga level kesulitan yang berbeda dengan goal yang dituju adalah menemukan kunci rahasia yang tersembunyi. Tulisan ini tidak hanya menyajikan jawaban yang komprehensif atas tantangan tersebut, tetapi juga menguraikan proses berpikir, pendekatan ilmiah, serta refleksi terhadap strategi pertahanan dan serangan dalam konteks pengujian keamanan aplikasi Android. Detail tantangan dapat dilihat pada halaman berikut 5.

Environment dan Tools Pengujian

Pesatnya pertumbuhan Android sebagai sistem operasi mobile sejalan dengan hadirnya berbagai alat bantu reverse engineering baik yang enterprise maupun open source. Berikut kombinasi tools dan environment yang digunakan dalam tulisan ini:

Pembahasan

Identifikasi target merupakan langkah awal yang dapat dilakukan dalam menentukan scope dan batasan teknis dalam reverse engineering, hal ini bukan tahapan yang baku sehingga memungkinkan setiap orang memiliki teknik yang berbeda dalam identifikasi target. Aplikasi LibChecker pada perangkat android dapat digunakan untuk mengidentifikasi sebuah aplikasi, informasi yang didapat dari penggunaan LibChecker diantaranya: informasi paket, daftar native library, arsitektur dan ABI support, serta tech stack yang digunakan.

Gambar 1 Screenshot LibChecker untuk 3 aplikasi Crack ME
Gambar 1 Screenshot LibChecker untuk 3 aplikasi Crack ME

Gambar 1 menampilkan tangkapan layar aplikasi LibChecker yang menunjukan informasi aplikasi Crack Me dalam tiga level berbeda yang telah terinstall sebelumnya pada perangkat testing.

Level 1: A relatively simple introduction to reverse engineering Android applications.

Aplikasi pertama pada level 1 bernama Crack Me dengan summary informasi yang didapat sebagai berikut:

App Name Crack Me
Package Name itsec.rndforge.crackme
MD5 6e482795292c3f596aeb6ea1472c2e31
SHA1 e95120c69dc4c37598ba5f89b9ebe15b694456ae
SHA256 8f663b44282bac36699473858ce3e276e2783d4042d624084aca680d86683fda
Native Lib Null
Gambar 2 Nilai Hash File aplikasi Crack Me
Gambar 2 Nilai Hash File aplikasi Crack Me

Berdasarkan informasi tersebut diketahui package name aplikasi Crack Me Level 1 adalah itsec.rndforge.crackme. Sederhananya, package name adalah identitas unik dari sebuah aplikasi mobile, yang mencakup berbagai class dan library, serta berperan penting dalam identifikasi, pengelolaan, dan keamanan aplikasi.

Gif 1 Tampilan Aplikasi Crack Me
Gif 1 Tampilan Aplikasi Crack Me

Halaman utama aplikasi Crack Me hanya menampilkan sebuah input dan button. Aplikasi akan memberikan respon berupa output “Too bad, try harder next time! 🙁” saat dilakukan verify string text secara random pada form input seperti pada Gif 1. JADX-GUI dipilih sebagai salah satu tools yang dapat mendekompilasi APK ke dalam bentuk yang dapat dipahami dan terstruktur. Halaman utama yang sederhana dengan tiga komponen utama input text, display text dan button sebagai trigger menjadi clue utama dalam tantangan ini. MainActivity.java menjadi file awal yang perlu ditelusuri, karena file tersebut merupakan entry point saat aplikasi dijalankan.

Gambar 3 Code MainActivity Crack Me Level 1
Gambar 3 Code MainActivity Crack Me Level 1

Baris ke-234 menampilkan penggunaan event setOnClickListener() yang digunakan untuk mendeteksi dan menangani interaksi klik pada komponen UI. Event tersebut akan membuat instance dari class ViewOnClickListenerC0000a dan nilai 3 akan menentukan proses berikutnya sebagai handler untuk button “Verify”. Terlihat bahwa class ViewOnClickListenerC0000a disimpan pada package G0. Selain mencarinya secara manual dengan mengakses package tersebut, melakukan dua kali klik pada class yang dituju akan mengarahkan langsung pada lokasi class tersebut di JADX-GUI.

Gambar 4 Lokasi The Hidden Secret Key
Gambar 4 Lokasi The Hidden Secret Key

Mengacu pada potongan kode berikut ((Button) c0021l.f451b).setOnClickListener(new ViewOnClickListenerC0000a(3, this)); terdapat switch case yang digunakan pada class ViewOnClickListenerC0000a dan nilai 3 pada kode tersebut sebagai inisiasi case 3. Baris ke-67 pada case 3 menunjukkan adanya sebuah string “am_i_too_easy_for_you_to_crack” yang diduga sebagai the hidden secret key seperti pada Gambar 4. Crack Me level 1 akan menampilkan output yang berbeda jika string tersebut diinput pada form input aplikasi seperti pada Gif 2

Gif 2 Solved Crack Me Level 1
Gif 2 Solved Crack Me Level 1

Level 2: Introduces more complex techniques.

Aplikasi kedua pada level 2 bernama Crack Me Lvl 2 dengan summary informasi yang didapat sebagai berikut:

App Name Crack Me Lvl 2
Package Name itsec.rndforge.crackme.level2
MD5 b30a09da568434e06eb81d375194da5b
SHA1 589b32be3b2b31b133eec566811c81f4ce140458
SHA256 dc66862b1809389f77e699b1ef28d67552d9d10084159ffe3667ecb0c8ad595b
Native Lib 1
Gambar 5 Nilai Hash Crack Me Lvl 2
Gambar 5 Nilai Hash Crack Me Lvl 2

Berbeda dengan Crack Me Level 1 pada Crack Me Level 2 menggunakan 1 native library, respon text yang ditampilkan Crack Me Level 2 adalah “☹Try again”, posisi form input serta button berada di pojok atas bagian kiri layout seperti pada Gif 3. Namun, secara fungsi dasar keduanya memiliki konsep yang sama hanya teknik menemukan the hidden secret key yang akan berbeda.

Gif 3 Tampilan Aplikasi Crack Me Lvl 2
Gif 3 Tampilan Aplikasi Crack Me Lvl 2

MainActivity masih menjadi fokus awal untuk menentukan teknik berikutnya dalam menganalisis Crack Me Lvl 2. Baris ke-64 sampai ke-71 pada Gambar 6 mengindikasikan keterkaitan dengan the hidden secret key yang dicari. Hal tersebut dimulai dari inisialisasi C0765a sebagai wrapper SharedPreferences (proses penyimpanan data sederhana di Android dalam bentuk key-value) dengan “abcde” sebagai key 6. Penggunaan NativeLib nativeLib = new NativeLib(); nativeLib.stringFromJNI(); merujuk pada sebuah Java class yang berfungsi sebagai jembatan untuk menjalankan fungsi-fungsi pada kode native yang dibuat dalam Bahasa C/C++. Sedangkan stringFromJNI() digunakan pada NativeLib untuk mengembalikan data dari kode native ke Java.

Gambar 6 Main Activity Crack Me Lvl 2
Gambar 6 Main Activity Crack Me Lvl 2

Penelusuran method nativeLib.stringFromJNI() mengarah pada file NativeLib.java yang terletak pada package itsec.rndforge.crackme.nativelib. File tersebut mendefinisikan sebuah class Bernama NativeLib, System.loadLibrary("nativelib"); melakukan pencarian dan memuat file dengan format .so, berikutnya kata “native” menjelaskan bahwa fungsi akan dijalankan pada kode native menggunakan bahasa C/C++.

Gambar 7 NativeLib Crack Me Lvl 2
Gambar 7 NativeLib Crack Me Lvl 2

Library native terletak pada package yang berbeda dengan sumber kode utama, pada JADX-GUI file tersebut dapat ditemukan pada Resources > lib > (arsitektur cpu). Gambar 8 menunjukkan konten yang ditampilkan pada file libnativelib.so berupa nilai-nilai hex dump, sehingga dekompilasi pada file tersebut perlu dilakukan supaya bisa dibaca. Fokus hasil dekompilasi tertuju pada method stringFromJNI() dan didapatkan sebuah hardcoded “was_it_still_too_easy_for_you?”.

Gambar 8 Hasil Dekompilasi libnativelib.so Crack Me Lvl 2
Gambar 8 Hasil Dekompilasi libnativelib.so Crack Me Lvl 2

Penggunaan Frida menjadi teknik alternatif yang lebih sederhana untuk menjalankan method stringFromJNI() pada libnativelib.so untuk mengetahui data apa yang dikembalikan dari kode native ke Java. JADX-GUI menyediakan Frida snippet untuk mempermudah pengkodean pada objek yang dituju menggunakan Frida. Block method yang akan digunakan “stringFromJNI()” lalu klik kanan dan pilih “Copy as Frida snippet” seperti pada Gambar 9.

Gambar 9 Copy as frida snippet
Gambar 9 Copy as frida snippet

Simpan snippet tersebut pada text editor dengan format file .js dan tambahkan potongan kode berikut di awal snippet Java.perform(function () { dan di akhir snippet });. Sehingga kode lengkap dari file tersebut seperti berikut:

Java.perform(function () {
    let NativeLib = Java.use("itsec.rndforge.crackme.nativelib.NativeLib");
    NativeLib["stringFromJNI"].implementation = function () {
        console.log(`NativeLib.stringFromJNI is called`);
        let result = this["stringFromJNI"]();
        console.log(`NativeLib.stringFromJNI result=${result}`);
        return result;
    };
});

Jalankan script tersebut menggunakan Frida dengan command frida -l lvl2.js -U -f itsec.rndforge.crackme.level2, kemudian script tersebut akan menampilkan data apa yang dikembalikan oleh method stringFromJNI() dan didapatkan data “was_it_still_too_easy_for_you?”, terlihat pada Gambar 10.

Gambar 10 Proses frida lvl2.js
Gambar 10 Proses frida lvl2.js
Gif 4 Solved Crack Me Level 2
Gif 4 Solved Crack Me Level 2

Level 3: A challenging level requiring advanced reverse engineering skills.

Aplikasi ketiga pada level 3 bernama Crack Me Lvl 3 dengan summary informasi yang didapat sebagai berikut:

App Name Crack Me Lvl 3
Package Name itsec.rndforge.crackme.level3
MD5 a787a04a3da848cd62cd6163fb00a156
SHA1 00f2526ac5686a0c43c221a898e0f774a6ebe7ff
SHA256 c0a34871552ec4631bb4fabfa2a6383168b076d3c95dbbb700b0c59115c9e07a
Native Lib 1
Gambar 11 Nilai Hashfile Crack Me Lvl 3
Gambar 11 Nilai Hashfile Crack Me Lvl 3

Crack Me Lvl 3 memiliki tampilan dan alur aplikasi yang sama dengan Crack Me Lvl 2, memiliki satu native library dan respon output yang sama “☹Try again” saat text yang di input bukan secret key.

Gif 5 Tampilan Aplikasi Crack Me Lvl 3
Gif 5 Tampilan Aplikasi Crack Me Lvl 3

Fokus pada MainActivity Crack Me Lvl 3 untuk mengidentifikasi bagaimana button menjadi trigger untuk memproses input melalui JADX-GUI. Baris ke-73 menjelaskan adanya pembuatan instance baru dari class NativeLib dan disimpan dalam variabel f5913z dan baris ke-81 terdapat method secretKey() yang dijalankan dari native library seperti pada Gambar 12. Berdasarkan informasi ini Crack Me Lvl 3 memiliki kemiripan dengan Crack Me Lvl 2 dalam alur kasusnya, sehingga libnativelib.so menjadi kunci di mana letak the hidden secret key berada.

Gambar 12 MainActivity Crack Me Lvl 3
Gambar 12 MainActivity Crack Me Lvl 3

Dogbolt kembali menjadi pilihan untuk dekompilasi file libnativelib.so dan fokus untuk menemukan alur method secretKey() dan apa yang diproses dari method tersebut. Gambar 13 pada baris ke-2297 terdapat method secretKey dan baris berikutnya 2310 terdapat sebuah string “aGVoZWhlX3llc190aGlzX2lzX2l0” yang diidentifikasi sebagai base64 encode. Base64 hanya menggunakan karakter “A–Z, a–z, 0–9, +, / (atau - dan _ dalam URL-safe base64)” dan panjang string 28 karakter sesuai dengan base64 ukuran blok 4 (28 mod 4 = 0) 7.

Gambar 13 Hasil Dekompilasi libnativelib.so Crack Me Lvl 3
Gambar 13 Hasil Dekompilasi libnativelib.so Crack Me Lvl 3

Banyak tools yang dapat digunakan untuk mendecode base64 salah satunya menggunakan command windows dengan perintah powershell -Command "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('stringBase64'))", setelah perintah tersebut dijalankan maka didapatkan string “hehehe_yes_this_is_it” seperti pada Gambar 14.

Gambar 14 Hasil decode base64 Crack Me Lvl 3
Gambar 14 Hasil decode base64 Crack Me Lvl 3

Hooking secretKey() menggunakan Frida dapat digunakan sebagai alternatif untuk mengetahui proses yang dilakukan method secretKey() sama seperti Crack Me Lvl 2, script frida yang digunakan sedikit berbeda karena method yang dijalankan tidak sama, namun perintah yang digunakan untuk menjalankan script Frida tersebut masih sama.

Gambar 15 Hasil script frida lvl3.js
Gambar 15 Hasil script frida lvl3.js

Gambar 15 merupakan hasil tangkapan layar dari output script Frida yang telah dijalankan dengan mengembalikan data string “YUdWb1pXaGxYM2xsYzE5MGFHbHpYMmx6WDJsMA==” yang terlihat sebagai bentuk base64 encode. Gambar 13 pada baris 2312 terlihat ada fungsi base64_encode(v5, v7); yang artinya v7 merupakan input string dari v1 dan isi dari v1 adalah “aGVoZWhlX3llc190aGlzX2lzX2l0”, sehingga ada dua kali proses encoding base64 untuk menyembunyikan the hidden secret key ini seperti Gambar 16.

Gambar 16 Hidden secret key Crack Me Lvl 3
Gambar 16 Hidden secret key Crack Me Lvl 3
Gif 6 Solved Crack Me Level 3
Gif 6 Solved Crack Me Level 3

Penutup

Tantangan Crack Me ini menjadi salah satu media pembelajaran yang efektif untuk mengukur sejauh mana pemahaman dan praktiknya suatu sistem bekerja. Tingkat kesulitan yang berbeda memberikan wawasan bahwa tidak semua alur yang terlihat memiliki proses yang sama. Penggunaan tools open-source seperti JADX-GUI, Frida dan dogbolt terbukti bisa diandalkan untuk membongkar sistem proteksi meskipun aplikasinya sudah di obfuscate atau dilindungi.

Berikut flag yang didapatkan sepanjang tantangan Crack Me ini:

Referensi

  1. IEEE Xplore. (2020). Android Security: A Survey of Issues, Malware Penetration, and Defenses.

  2. Android Developers. (n.d.). Application Fundamentals.

  3. Hidayat, T., & Mulyono, A. (2022). Analisis Reverse Engineering terhadap File APK Berbasis Android.

  4. Rada Reversing. (n.d.). Crackmes Introduction.

  5. ITSEC Asia. (n.d.). Android CrackMe App: Can You Find the Key?.

  6. Android Developers. (n.d.). Save key-value data.

  7. Internet Engineering Task Force (IETF). (2006). The Base16, Base32, and Base64 Data Encodings (RFC 4648).