Pengantar Android Pentesting

Belajar teknik dasar Android Penetration Testing

8bit me wkwkw

Rafi Priatna Kasbiantoro

Pada artikel ini kita akan belajar mengenai teknik Android Peneteration Testing dasar, harapannya kita jadi bisa meningkatkan security-nya.

Saya menulis artikel ini berdasarkan informasi yang saya dapat di internet, dan juga pengalaman saya sebagai Penetration Tester.

Pertama-tama, kita harus menyiapkan environment-nya terlebih dahulu sebelum memulai pengujian penetrasi, selanjutnya menyiapkan tools yang berguna untuk pentesting.

Apa itu Android Pentesting?

Sebagai sistem operasi sumber terbuka, Android memiliki market share sebanyak 69.64% di dunia per 2023.1 Terlebih sekarang Android tidak hanya digunakan untuk perangkat smartphone, tetapi sudah meluas ke perangkat lain seperti EDC, Tablet, TV, Car Dashboard dan lain sebagainya.

Beberapa aplikasi Android modern mengusung fungsi dan tujuan yang sangat penting, seperti untuk tujuan komersil, banking, healtcare, pembelajaran, dan sebagainya.

Hal ini membuat peranan Android Pentesting sangat penting di sini, dengan tujuan untuk mendeteksi kerentanan keamanan dan memastikan aplikasi Android tidak rentan terhadap serangan.

Android Package (APK)

Android Package atau APK, adalah sebuah berkas arsip (archive) dengan ekstensi .apk dan berisi semua file yang diperlukan supaya aplikasi Android dapat berjalan.

Isi dari berkas ini biasanya adalah:

  • Library: Berisi pustaka native dengan kode yang dikompilasi, untuk arsitektur perangkat yang berbeda.
  • Assets: Berisi informasi verifikasi yang dihasilkan ketika aplikasi di-signing.
  • META-INF: Berisi Certificate atau Signature.
  • Res: Berisi resource dari aplikasi, seperti file XML yang menentukan daftar warna, layout UI, font, values, dll.
  • AndroidManifest.xml: Berisi informasi dari aplikasi. Berkas ini juga menjelaskan nama paket aplikasi, activity, resource, versi, dll.
  • Classes.dex: Berisi kode java yang sudah dikompilasi (compiled). Ekstensi .dex sendiri merupakan format berkas dex (Dalvik Executable), untuk dieksekusi oleh Android Runtime.
  • Resources.arsc: Berisi resources yang telah dikompilasi sebelumnya. Memuat informasi yang akan menautkan kode ke resources.

Tools untuk Android Pentesting

Berikut ini adalah daftar tools atau alat untuk melakukan uji penetrasi pada Android. Beberapa adalah tools pengujian otomatis dan lainnya adalah manual.

Pengujian otomatis berguna untuk melakukan scanning kerentanan common, karena pengujian otomatis berjalan cepat, dan dapat mengumpulkan informasi yang lebih mendalam dibandingkan jika melakukan pengujian manual.

Tools Otomatis

Mobile Security Framework (MobSF)

Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis. MobSF supports mobile app binaries (APK, XAPK, IPA & APPX) along with zipped source code and provides REST APIs for seamless integration with your CI/CD or DevSecOps pipeline.The Dynamic Analyzer helps you to perform runtime security assessment and interactive instrumented testing. 2

MobSF dapat melakukan pengujian secara statis ataupun dinamis untuk perangkat Android,iOS, maupun Windows. Sangat direkomendasikan memasang tool ini pada Docker. Karena dependensinya banyak banget wkwkw. 😅

Tools Manual

Android Debug Bridge (ADB)

Untuk menghubungkan komputer ke perangkat Android atau emulator Android, kita membutuhkan ADB. Cara termudah untuk memasang ADB pada perangkat komputer adalah dengan memasang Android Studio. ADB adalah tools yang wajib ada pada komputer sebelum melakukan pentesting Android.

JADX

Compiler DEX ke Java. Dengan JADX, kita jadi bisa sedikit membaca kode Java yang sudah dikompilasi. Termasuk decode AndroidManifest.xml, dan deobfuscator. Meskipun JADX tidak selalu 100% bisa melakukan decompile, tapi tools ini cukup membantu kita untuk membaca logika cara kerja aplikasi.

Apktool

Salah satu tools untuk melakukan Reverse Engineering aplikasi Android. Dengan Apktool, kita bisa melakukan decompile, lalu memodifikasi source code-nya, kemudian melakukan compile ulang. Ikuti panduan berikut untuk memasang Apktool.

Frida

Salah satu tools untuk melakukan analisis dinamis, dan juga Reverse Engineering aplikasi Mobile (Android/iOS). Untuk memasang tool ini, kita perlu memasang Python 3 terlebih dahulu. Jika sudah memasang, kita bisa langsung memasang frida menggunakan pip.

pip3 install frida-tools

Objection

Runtime yang berguna untuk melakukan eksplorasi aplikasi mobile, tanpa memerlukan jailbreak. Objection ini membutuhkan frida agar dapat berjalan. Jadi, pastikan sudah memasang frida. Untuk memasang objection, kita cukup menggunakan pip, sama halnya seperti frida.

pip3 install objection

Ghidra

Salah satu tool untuk Reverse Engineering, tapi ditujukan khusus untuk menganalisis native library. Terkadang, aplikasi Android yang kita pentest menggunakan native library khusus, kita dapat menggunakan Ghidra untuk menganalisis library tersebut.

Menyiapkan Lingkungan Untuk Android Pentesting

Karena kita akan melakukan pentest aplikasi Android, maka kita butuh Android. Jika kalian punya smartphone Android fisik, itu bagus. Baiknya kita punya perangkat sendiri, tapi jika tidak punya, kita bisa menggunakan emulator Android yang disedikan oleh Android Studio (Android Virtual Device/AVD).

Android Virtual Device
Android Virtual Device

Dengan AVD ini, kita bisa memilih banyak tipe Android, mulai dari Android Nougat yang udah jadul, sampai Android UpsideDownCake yang terbaru.

Secara umum, terdapat dua versi sistem operasi yang bisa kita pilih, yaitu:\

  • PlayStore: Ada Google PlayStore, tapi belum rooted.
  • Non PlayStore: Tidak ada Google PlayStore, dan aplikasi Google lainnya, tapi sudah rooted.

Untuk tujuan pentest, ada baiknya kita memilih yang sudah rooted. Karena Android yang sudah rooted itu sangat membantu kita dalam melakukan analisis terhadap aplikasi Android.

Mengaktifkan ADB Debugging

Secara bawaan, ADB Debugging belum aktif. Untuk itu, kita harus mengaktifkannya terlebih dahulu. Caranya sangat mudah:

  • Buka Android (emulator/perangkat).
  • Ke Settings > About Device > Tap beberapa kali pada bagian "Build Number" hingga muncul tooltip "You are now a developer!".

Setelah beberapakali tap Build number
Setelah beberapakali tap Build number

  • Kembali ke menu Settings > System, maka akan muncul menu baru yaitu "Developer Options".

Menu Developer Options
Menu Developer Options

  • Selanjutnya aktifkan USB debugging.

USB Debugging
USB Debugging

Sejauh ini udah cukup baik, mari kita coba jalankan di terminal adb devices

$ adb devices
List of devices attached
emulator-5554   device

Kebetulan lagi pake emulator, jadi terbaca emulator-5554. Jika sudah muncul device nya, maka sudah berhasil.

Bedah isi APK

Terkadang, melakukan Reverse Engineering APK dapat membantu kita untuk selangkah lebih maju melewati pemeriksaan keamanan. Misalnya, dengan melakukan reverse APK, kita jadi tahu bahwa di APK tersebut terdapat pemeriksaan perangkat Jailbreak. Sehingga, kita bisa menghapus blok kode pemeriksaan tersebut supaya APK dapat dijalankan pada perangkat rooted.

Ambil APK Online

Setidaknya kita harus memiliki file .apk dari aplikasi yang ingin kita uji, bukan? Saat kita melakukan penetration testing Android, biasanya kita diberikan berkas .apk dari aplikasi yang akan diuji. Hanya saja, terkadang kita tidak diberikan karena aplikasi sudah ada di Google PlayStore. Karena kita nggak bisa langsung dapetin APK dari Google PlayStore, maka kita butuh pihak ketiga untuk mendapatkannya.

Ada beberapa situs web tempat mengunduh APK yang biasa saya gunakan:

Decompile APK

Sebagai contoh, di sini saya punya APK yang vulnerable, InjuredAndroid. Silakan di-unduh, kemudian kita coba untuk decompile APK tersebut menggunakan apktool.

$ apktool d InjuredAndroid-1.0.12-release.apk
I: Using Apktool 2.9.0 on InjuredAndroid-1.0.12-release.apk
I: Loading resource table...
I: Decoding file-resources...
I: Loading resource table from file: C:\Users\Extops\AppData\Local\apktool\framework\1.apk
I: Decoding values */* XMLs...
I: Decoding AndroidManifest.xml with resources...
I: Regular manifest package...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
I: Copying META-INF/services directory
Press any key to continue . . .

Kemudian akan dibuatkan direktori oleh apktool berisi decompiled nya. Mari kita buka pake teks editor favorit kalian, di sini saya membukanya menggunakan Visual Studio Code.

Direktori Hasil Decompile
Direktori Hasil Decompile

Seperti yang terlihat, terdapat banyak direktori dan berkasnya, mari kita lihat berkas yang memuat banyak informasi, AndroidManifest.xml.

Berkas AndroidManifest.xml
Berkas AndroidManifest.xml

Karena ini adalah APK yang dibuat dengan gaya CTF, maka ada flag yang bisa kita lihat. Sebagai contoh, mari kita lihat ke direktori smali > b3nac > injuredandroid > FlagOneLoginActivity.smali.

Di sana terdapat flag pertama:

.method public final submitFlag(Landroid/view/View;)V
    .locals 3

    const p1, 0x7f0800a7

    invoke-virtual {p0, p1}, Landroidx/appcompat/app/c;->findViewById(I)Landroid/view/View;

    move-result-object p1

    check-cast p1, Landroid/widget/EditText;

    const-string v0, "editText2"

    invoke-static {p1, v0}, Ld/s/d/g;->d(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {p1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object p1

    invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object p1

    const-string v0, "F1ag_0n3"

    invoke-static {p1, v0}, Ld/s/d/g;->a(Ljava/lang/Object;Ljava/lang/Object;)Z

    move-result p1

    if-eqz p1, :cond_0

    new-instance p1, Landroid/content/Intent;

Smali adalah berkas representasi dari bahasa assembly bytecode Dalvik (DEX) yang berjalan di aplikasi Android.

Membaca Source Code APK

Sebenarnya, dengan melakukan decompile dengan apktool yang sudah kita lakukan sebelumnya, kita sudah bisa membaca source code dari APK, yaitu dengan membaca kode smali-nya.

Bagaimanapun, kode smali meskipun bisa dibaca, tapi masih agak sulit untuk dipahami. Untuk itu, kita bisa gunakan tools JADX GUI. Caranya adalah dengan membuka aplikasinya, lalu pilih APK-nya.

JADX GUI
JADX GUI

Terlihat pada class yang sama seperti sebelumnya, FlagOneLoginActivity.class dan pada method submitFlag, kita dapat kode yang secara alur sama persis seperti smali tadi.

public final void submitFlag(View view) {
    EditText editText = (EditText) findViewById(R.id.editText2);
    d.s.d.g.d(editText, "editText2");
    if (d.s.d.g.a(editText.getText().toString(), "F1ag_0n3")) {
        Intent intent = new Intent(this, FlagOneSuccess.class);
        new FlagsOverview().J(true);
        new j().b(this, "flagOneButtonColor", true);
        startActivity(intent);
    }
}

Recompile APK

Jika decompile itu meng-ekstrak file .apk menjadi source code, maka recompile adalah mengembalikan kembali dari source code hasil decompile menjadi APK.

Tapi sebelumnya, mari kita install APK tadi di Android kita.

InjuredAndroid
InjuredAndroid

Sebagai contoh recompile, mari kita ubah judul dari aplikasi "InjuredAndroid" menjadi "InjuredAndroid2". Untuk melakukannya, mari kita ke hasil decompile tadi, lalu cari string tersebut.

Cari String
Cari String

Seperti yang terlihat pada screenshot di atas, string "InjuredAndroid" terdapat pada file res > values > strings.xml di bagian "app_name". Mari ubah string tersebut.

    <string name="action_settings">Settings</string>
    <string name="activity_bypass_info">There is a way to bypass the main activity and invoke other activities that are exported.</string>
    <string name="app_name">InjuredAndroid2</string>
    <string name="appbar_scrolling_view_behavior">com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior</string>
    <string name="assemblytextview">AssemblyTextView</string>

Selanjutnya, lakukan recompile dengan apktool.

$ apktool b .\InjuredAndroid-1.0.12-release\ -o InjuredAndroid2.apk
I: Using Apktool 2.9.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Copying libs... (/kotlin)
I: Copying libs... (/META-INF/services)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk into: InjuredAndroid2.apk
Press any key to continue . . .

Keterangan:

  • b: artinya build.
  • .\InjuredAndroid-1.0.12-release: nama direktori hasil decompile sebelumnya.
  • -o InjuredAndroid2.apk: nama file APK baru.

Setelah berhasil melakukan recompile, selanjutnya adalah melakukan signing supaya APK dapat di-install kembali.

Signing APK

Setidaknya ada dua cara yang dapat kita lakukan untuk melakukan signing, cara pertama adalah menggunakan uber-apk-signer, dan yang kedua menggunakan Objection.

uber-apk-signer

Pertama-tama, kita unduh dulu binary nya di sini, kita akan mendapatkan file bernama uber-apk-signer-1.3.0.jar, kemudian bisa langsung digunakan dengan cara:

$ java -jar uber-apk-signer-1.3.0.jar --apks /ke/direktori/tempat/apk

Kalian juga bisa menambahkan keystore, atau zipalign. Untuk selengkapnya, silakan baca example uber-apk-signer.

Objection

Pakai objection cenderung lebih mudah, tapi pertama-tama pastikan binary dari build-tools AndroidStudio sudah terdaftar pada Environment kalian, ya.

Selanjutnya, kalian bisa langsung signing APK.

$ objection signapk .\InjuredAndroid2.apk
Checking for a newer version of objection...
Performing zipalign
`Zipalign completed`
Signing new APK.
Signed the new APK
Copying final apk from C:\Users\Extops\AppData\Local\Temp\tmp6v5alfm1.apktemp.aligned.objection.apk to .\InjuredAndroid2.objection.apk in current directory...
Cleaning up temp files...

Akan dibuatkan APK baru dengan nama InjuredAndroid2.objection.apk, mari kita install lagi APK yang baru.

InjuredAndroid2
InjuredAndroid2

Dapat dilihat pada screenshot di atas, nama aplikasi berhasil diubah. 😁

Penutup

Sampai sini, kita sudah belajar banyak, nih. Mulai dari menyiapkan lingkungan, tools, dan dasar-dasar membedah APK. Masih banyak hal yang dapat diulik lagi tentang aplikasi Android ini, misalnya melakukan intercept HTTP, bypass layer keamanan, inject code, dan sebagainya. Itu akan kita pelajar pada artikel-artikel berikutnya. 😊