Hooking Aplikasi Android di 2022: Magisk, Zygisk, LSPosed dan JShook

Artikel ini ditujukan untuk para reverse engineer dan pentester yang ingin mengetahui situasi terbaru hooking Android pada awal tahun 2022. Hooking Android artinya kita menulis kode untuk mengintercept fungsi yang ada dan menggantinya dengan milik kita. Tujuan hooking ada banyak, misalnya: bypass SSL Pinning, security testing, cheating game, dsb.

Di tahun 2019 saya pernah menuliskan tentang Magisk, Frida, dan XPosed Framework. Artikel ini merupakan update situasi terkini. Untuk Frida, saya pernah menulis lebih detail di sini (2019), dan XPosed pernah saya tulis di sini (2016).

Zygisk

Setelah capek kucing-kucingan dengan Google dalam hal Safety Net, akhirnya Magisk Hide dihapus. Selain Magisk Hide, Magisk memiliki banyak modul. Modul Magisk sifatnya low level, seperti menyembunyikan, memindahkan, menggantikan atau menambahkan file tertentu di Android.

Modul Magisk yang saya pakai

Sekarang ini ada modul magisk baru bernama Zygisk. Ini sekedar untuk meload sebuah .so di setiap proses (dan otomatis dipanggil ketika proses dimulai). Dengan ini, developer Magisk hanya ingin bilang: ini saya sediakan akses untuk hook low level, silakan dimanfaatkan untuk apapun.

Lanjutkan membaca “Hooking Aplikasi Android di 2022: Magisk, Zygisk, LSPosed dan JShook”

Memakai Postman untuk Testing Web API

Postman merupakan aplikasi komersial (tapi ada versi gratisnya) untuk merancang API (Application Programming Interface), mendokumentasikan API, memonitor API, dan testing API berbasis web. Tool ini bisa dipakai oleh developer dan tester.

Di tulisan ini saya hanya akan membahas penggunan Postman untuk testing API. Artinya saya hanya akan membahas bagian Collections dan Environment. Testing API bisa dilakukan untuk development, QA, ataupun pentesting. Postman memudahkan banyak hal untuk testing, misalnya kita bisa melakukan otorisasi, bisa menyimpan token, dan bisa kita program menggunakan JavaScript.

Postman memiliki banyak fitur, hanya dua ini saja yang akan dibahas di tulisan ini
Lanjutkan membaca “Memakai Postman untuk Testing Web API”

Reverse Engineering Cython

Setelah berbagai obfuscator Python berhasil dibongkar, banyak orang sekarang mulai menggunakan Cython agar modulnya sulit dibongkar. Menurut saya ini cara yang sangat baik, karena selain lebih sulit dibongkar, kode yang dihasilkan juga sering kali lebih cepat dari modul Python yang ditulis langsung dalam Python.

Karena kebanyakan yang mencari tahu soal RE Cython ini adalah newbie yang berusaha mencuri kode Python orang lain, maka ini saya tuliskan di awal. Karena biasanya orang-orang ini tidak sabar membaca sampai akhir:

  • Jika punya file.so hasil kompilasi Cython, maka tidak bisa dikembalikan lagi menjadi .py secara otomatis.
  • Proses reversing bisa dilakukan manual, tapi butuh waktu lama dan butuh kesabaran tinggi

Mengenal Modul Python dalam C/C++

Kita bisa menulis modul Python dalam C/C++ dan juga bahasa lain. Bahasa yang resmi didukung hanya C/C++, tapi bahasa lain seperti Rust juga bisa dipakai. Bahkan sebenarnya banyak modul Python yang dipakai sehari-hari yang ditulis dalam C/C++, misalnya numpy, tensorflow, dan bebagai modul AI lain.

Ada berbagai cara untuk menulis modul Python, pertama adalah cara 100% manual. Manual artinya kita menulis sendiri kodenya dalam C/C++ tanpa library tambahan atau tool tambahan. Dokumentasi lengkap cara manual ini bisa dilihat situs resmi Python.

Membuat modul secara manual ini butuh waktu lama, maka ada berbagai cara lain untuk memudahkan pembuatan modul ptyhon. Tapi perlu dicatat bahwa semua cara lain ini pada akhirnya akan memanggil API Python yang sama seperti jika kita menggunakan cara manual. Jadi pertama kita perlu memahami dulu modul yang dibuat secara manual.

Lanjutkan membaca “Reverse Engineering Cython”

CORS (Cross-Origin Resource Sharing)

Untuk pembaca yang lahir setelah generasi milenial, silakan baca tentang The Corrs di Wikipedia

Topik CORS ini adalah topik security web yang sulit dimengerti bagi sebagian orang. Dalam pentest, kadang temuan CORS diperdebatkan mengenai severity-nya. Di tulisan ini saya akan berusaha menjelaskan apa itu CORS dan dampaknya untuk security.

Dasar Teori

Saya ingin sekali bisa menjelaskan CORS ini secara singkat, supaya nggak perlu ngetik panjang, tapi kenyataannya dibutuhkan pemahaman dulu mengenai request di browser. Jadi sebelum masuk masalah securitynya, saya jelaskan dulu mengenai CORS.

Sebelum ada XHR (XMLHTTPRequest)

Sebelum JavaScript mulai dipakai, yang bisa dibuat dengan HTML hanyalah menyisipkan konten dengan menggunakan tag yang ada, misalnya memakai <img src=""> atau <frame src="">. Konten ini (misalnya gambar) boleh berasal dari domain mana saja. Browser akan meminta konten dari domain lain. Hidup masih sangat sederhana.

Ketika JavaScript mulai dipakai, kemampuannya masih terbatas untuk memodifikasi DOM (Document Object Model). Ini pun masih belum jadi masalah. Javascript hanya sekedar membuat elemen HTML dan browser yang akan melakukan request ke server tujuan. JavaScript tidak memproses data secara langsung.

Lanjutkan membaca “CORS (Cross-Origin Resource Sharing)”

SSL Pinning dan Pentester Ngawur

Tulisan ini saya buat untuk mengkritik para pentester yang nggak paham apa tujuan SSL pinning dan menyusahkan programmer. Kasusnya adalah SSL Pinning yang bisa dibypass dianggap sebagai bug, sedangkan cara bypassnya memerlukan Magisk dan Frida. Ibaratnya di dunia fisik begini: kalau ada jendela terbuka, itu bug. Tapi setelah jendelanya ditutup, dilaporkan lagi begini: pak, ini ada celah keamanannya: kalau kita masuk ke dalam rumah, ternyata jendelanya bisa dibuka dari dalam pak. Logikanya: kalau seseorang sudah bisa masuk, ngapain lagi buka jendela?

Maksud dan Tujuan SSL Pinning

Mari kita mundur sejenak, sebenarnya apa sih tujuan SSL Pinning? Saya sudah membuat artikel yang lebih detail di sini, tapi sekarang saya akan membahas versi sederhananya saja: tujuan SSL pinning adalah memastikan kita terhubung ke server yang memang kita tuju. Ini untuk mencegah MITM (Man In the Middle Attack) jika attacker dapat membuat certificate baru yang dipercaya oleh aplikasi/sistem operasi.

Jika aplikasi mengecek tidak melakukan SSL Pinning maka ada dua kelemahan yang bisa dieksploitasi. Pertama adalah melakukan attack terhadap ponsel spesifik, dan kedua adalah membuat certificate yang dipercaya secara default oleh sistem operasi.

Lanjutkan membaca “SSL Pinning dan Pentester Ngawur”

Membuat Burp Extension

Burp adalah tool intercepting proxy proprietary yang bisa digunakan untuk melakukan penteting aplikasi web (dan juga mobile yang memakai koneksi HTTP/HTTPS). Tool ini seperti Zaproxy yang pernah saya bahas di posting yang lain, tapi Burp sifatnya tertutup (tidak open source). Tool ini sangat populer di kalangan pentester dan bounty hunter.

Burp ada versi gratis serta berbayarnya, tapi versi gratisnya memiliki keterbatasan tidak bisa menyimpan session, sehingga tidak cocok untuk pekerjaan pentest professional. Versi professionalnya 399 USD per tahun. Memang cukup mahal, tapi bagi saya tool ini cukup membantu proses pentest, jadi saya berlangganan versi pronya. Dilihat dari sudut pandang lain biaya ini tidak mahal: biaya transportasi harian 20 ribu rupiah sehari selama 300 hari sudah lebih mahal daripada harga langganan burp setahun.

Walau sudah membeli lisensi Burp, tapi saya juga masih memakai Zaproxy. Masing-masing punya kelebihan dan kekurangannya sendiri. Beberapa fitur sudah ada lama di Zaproxy (misalnya launch built in web browser) baru ada di Burp, dan juga sebaliknya. Contoh fitur lain yang tidak ada di burp adalah headless scan (ada extension untuk ini, tapi sudah tidak diupdate, dan tidak jalan di versi baru). Secara umum Burp lebih cepat dari zaproxy dan lebih stabil, selain itu banyak riset dilakukan oleh PortSwigger (perusahaan pembuat burp) yang langsung dijadikan extension Burp.

Lanjutkan membaca “Membuat Burp Extension”

Secure coding: memproses password

Topik memproses password ini sebenarnya topik sederhana, tapi banyak developer yang tidak tahu. Di artikel ini akan saya jelaskan bagaimana cara yang baik memproses password dari mulai sejak dimasukkan user, sampai masuk ke database. Saya juga akan menjelaskan mengenai kemungkinan kebocoran password di file log, baik log aplikasi maupun log server (web server dan mungkin server lain).

Kecepatan hash di GPU saya yang sudah relatif tua
Kecepatan hash di GPU saya yang sudah relatif tua

Di tulisan ini saya banyak menggunakan kata “jika mungkin”. Alasannya adalah:

  • kadang sistem perlu diintegrasikan dengan sistem yang sudah ada, jadi beberapa hal tidak bisa diubah tanpa mengubah sistem yang sudah ada
  • kadang library yang dibutuhkan tidak tersedia di bahasa/teknologi yang dipakai
  • kadang ada batasan tertentu (requirement dari user/atasan/pemerintah)
  • kadang ada batasan hardware (misalnya algoritma terlalu kompleks untuk embedded system)

Menerima password dari user

Password sebaiknya dibaca dengan API/fungsi yang sudah disediakan untuk tujuan itu. Contohnya di form web kita memakai input type=”password”, di program Java versi console kita bisa memakai Console.readPassword. Jangan sok pintar membuat sendiri form input (misalnya dengan manual membaca key satu karakter demi satu karakter), atau membuat perilaku yang tidak standar.

Sekarang ini OS Mobile (iOS dan Android) memiliki password manager built in, tapi ini tidak berfungsi jika form login tidak standar. Jika memang ingin membuat yang custom, pastikan bisa bekerja dengan password manager standard milik sistem.

Jika password merupakan bagian dari login, tampilkan form user dan password di satu layar. Ini akan membantu password manager mengetahui password mana yang bisa dimasukkan secara otomatis. Saat ini sebagian password manager sudah bisa menangani form yang terdiri dari banyak halaman (halaman pertama hanya isian user/email, dan halaman kedua pertanyaan password), tapi secara umum hal ini kurang baik.

Lanjutkan membaca “Secure coding: memproses password”