Sertifikat CA untuk Proxy Interceptor

Sertifikat CA untuk Proxy Interceptor

Latar Belakang

Kebutuhan yang paling mendasar saat menguji keamanan aplikasi Web, API, Mobile dan Web Service adalah kemampuan untuk mencegat atau intercept komunikasi antara client (browser atau perangkat mobile) dengan host servers (aplikasi dan web service) yang menyediakan layanan tersebut.

Semakin hari pengamanan terhadap jalur komunikasi ini terus mengalami peningkatan sehingga semakin sulit untuk di-intercept. Tujuannya adalah untuk mengurangi kemungkinan penyerangan seperti Man-In-The-Middle dan penyerangan lainnya yang dapat mengganggu integritas data yang sedang dalam transit.

Namun hal ini juga akan mempersulit para penguji keamanan atau penetration tester dalam mengidentifikasi kerentanan pada aplikasi Web, API dan Web Service. Penguji perlu memiliki akses atau kemampuan untuk melihat serangkain komunikasi yang dikirim dan diterima oleh client dan host servers. Dengan kemampuan ini, penguji dapat mengidentifikasi potensi kerentanan dan melaporkannya ke pembuat apkikasi utnuk segera diperbaiki.

Dalam artikel ini, saya ingin memaparkan secara singkat bagaimana penguji dapat memanfaatkan sertifikat root CA yang dibuat sendiri agar Proxy Interceptor dapat secara konsisten melakukan pencegatan komunikasi. Perlu diketahui bahwa mulai dari Android versi 7 keatas, sertifikat root CA yang diimport oleh pengguna tidak lagi dipercaya atau trusted oleh Android. Akibatnya android akan stop semua komunikasi apabila hosts servers (aplikasi web, API) yang dikunjunginya tidak memberikan digital certificate yang di-signed oleh trusted CA.

Sertifikat CA untuk Interceptor

Membuat sertifikat root CA

Dalam kesempatan ini kita akan menggunakan tools openssl versi terkini untuk membuat sertifikat root CA. Saat artikel ini ditulis, saya menggunakan versi OpenSSL 1.1.1n 15 Mar 2022 yang terinstal di Mac OSX melalui homebrew. Perlu diketahui bahwa kita harus membuat sertifikat root CA versi 3 agar srtifikat tersebut bisa di-import oleh Android terbaru dan perangkat client lainnya. Versi openssl yang ada secara default di Mac OSX terbaru adalah LibreSSL versi 2.8.3 dan ini masih belum versi LibreSSL yang terbaru. Untuk menghindari permasalahan yang mungkin terjadi saya memutuskan untuk menggunakan openssl.

Prosedur dalam artikel ini juga bisa dijalankan di Ubuntu atau distro linux lainnya namun lokasi atau path perintah perlu disesuaikan. Untuk Ubuntu, openssl dapat dipanggil langsung tanpa harus menyertakan path nya seperti # openssl version.

Untuk mulai, lakukan langkah berikut di terminal OSX atau Linux.

a. Siapkan direktori untuk menyimpan private/public key beserta sertifikat root CA

mkdir ~/rootCA
cd ~/rootCA

b. Dalam direktori ~/rootCA, buat private/public key pair yang akan kita gunakan untuk membuat sertifikat root CA. Berikut parameter yang akan kita gunakan.

Parameter Fungsi
aes256 menggunakan aes 256bit untuk mengenkripsi dan melindungi private key yang akan dibuat
2048 key space atau jumlah bit dari private key yang akan dibuat. Lebih besar key space maka lebih kuat dan aman

Private dan Public key pair akan disimpan dalam file KeyCA.key sesuai dengan opsi -out yang digunakan berikut.

/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl genrsa -aes256 -out KeyCA.key 2048

Untuk memeriksa hasil dari key pair ini, kita bisa menggunakan perintah berikut:

/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl rsa -in KeyCA.key -check

Membuat private key

c. Langkah terakhir adalah membuat Version 3 root CA Certificate menggunakan private key yang sudah kita buat sebelumnya. CA Certificate ini nantinya akan kita import ke Proxy Interceptor seperti burp suite atau mitm proxy dan juga ke perangkat yang akan kita intercept seperti Android, iOS dan Sistem Operasi (OS).

Berikut parameter yang digunakan untuk membuat root CA.

Parameter Fungsi
req Opsi untuk membuat Certificate
new Request pembuatan Certificate baru
x509 Sign Certificate
days Jumlah hari Certificate akan berlaku
key Private dan public key yang akan digunakan untuk membuat Certificate
extensions Gunakan Certificate versi 3
out Certificate akan disimpan ke file
/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl req -new -x509 -days 720 -key KeyCA.key -extensions v3_ca -out MyCACert.pem

Untuk melihat hasil root CA Certificate yang baru saja kita buat, gunakan perintah berikut

/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl x509 -in MyCACert.pem -text -noout

Membuat certificate CA

Mengubah format PEM ke DER

Perlu diketahui bahwa private key serta root CA Certificate yang baru saja kita buat tersimpan dalam format PEM. Agar bisa diimport ke burp suite, android, iOS dan perangkat lain maka kita perlu mengubah format PEM ke format DER. Berikut ringkasan beberapa format Digital Certificate dan key pair yang umum digunakan

Format Deskripsi
PEM key pair atau Certificate dalam format text based atau based-64 encoded. Format ini umumnya digunakan karena mudah dibaca oleh banyak Sistem
DER key pair atau Certificate dalam format binary. Format ini umumnya digunakan oleh Windows dan juga Android dan iOS.
PKCS#12 Container yang digunakan untuk menyimpan private key dan Certificate yang dilindungi dengan enkripsi

untuk mengubah format PEM ke DER, gunakan perintah berikut

  • Mengubah PEM ke DER untuk Certificate
/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl x509 -outform der -in MyCACert.pem -out MyCACert.der
  • Mengubah PEM ke DER untuk Private key
/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl rsa -outform der -in KeyCA.key -out keyCA.der
  • Menggabungkan Private Key dan Certificate dalam 1 file format PKCS#12. Perintah dibawah ini menggunakan Private key dan certificate dalam format PEM sebagai input proses konversi. Dalam proses ini openssl akan meminta password untuk membuka private key yang kita buat di langkah awal dan kemudian akan meminta kita untuk memasukan password baru untuk melindungi sertifikat CA berikut dengan private keynya dalam format PKCS#12
/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl pkcs12 -export -out MyCAstore.p12 -inkey KeyCA.key -in MyCACert.pem

Gunakan PKCS#12 apabila proxy Interceptor mendukung format ini karena Private key dan Certificate digabung dalam 1 file sehinggal proses Import lebih sederhana.

Untuk memastikan Certificate dan private key telah dikonversi ke format DER dengan benar, gunakan perintah berikut

  • Memeriksa Certificate
/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl x509 -inform der -in MyCACert.der -text -noout
  • Memeriksa private key
/opt/homebrew/Cellar/openssl@1.1/1.1.1n/bin/openssl rsa -inform der -in keyCA.der -text -noout

Berikut prosedur untuk mengubah sertifikat CA dari format PEM ke DER. Selain itu digital sertifikat juga dapat digabung dengan private key ke satu container penyimpanan yang aman dalam format PKCS#12.

Export ke der dan pkcs12

Import Sertifikat root CA ke Proxy Interceptor.

Langkah selanjutnya adalah mengimpor sertifikat CA berikut dengan private keynya ke Proxy Interceptor. Umumnya Proxy Interceptor akan membuat Digital Sertifikat untuk setiap host yang diintercept.

Sebagai contoh apabila browser atau mobile phone kita mengirim request ke google.com melalui Proxy Interceptor, maka digital certificate atas nama google.com akan otomatis dibuat oleh Proxy Interceptor. Digital sertificate ini kemudian diberikan ke browser atau mobile phone yang kita gunakan. Apabila kita mengakses host lain serperti microsoft.com maka digital certificate untuk microsoft.com akan dibuat oleh Proxy Interceptor dan kemudian diteruskan ke browser atau mobile phone kita seperti ilustrasi berikut.

Burp Proxy

Digital Certificate yang dibuat untuk setiap host ini akan di-digitally signed menggunakan sertifikat CA yang telah kita buat dan import sebelumnya ke Proxy Interceptor. Apabila Sertifikat CA ini telah dipercaya atau ditrusted oleh browser dan mobile phone kita, maka Digital Certficate setiap host yang dibuat dan diteruskan ke browser kita akan dipercaya juga.

Digital Certificate untuk setiap host harus dibuat salah satunya untuk menghindari Common Name mismatch yang umum terjadi karena menggunakan sertifikat tunggal untuk seluruh host yang akan kita intercept.

Berikut langkah untuk mengimport sertifikat CA ke beberapa Proxy Interceptor.

    1. Burp suite

a. Buka burp suite dan kemudian navigasi ke TAB Proxy.

b. Klik Import / export CA Certificate

Burp Proxy

c. Kemudian pilih import certificate and private key from PKCS#12

Burp Proxy

d. Pilih Sertifikat CA dan private key yang telah kita gabungkan dalam PKCS#12 di langkah sebelumnya. Jangan lupa untuk memasukan password saat kita membuat PKCS#12.

Burp Proxy

e. Setelah proses import berhasil, lakukan pemeriksaan dengan mengunjungi http://burp dari browser yang telah kita arahkan proxy nya ke burp suite. Download CA Certificate dari site tersebut dan kemudian periksa sertifikat CA menggunakan langkah pemeriksaan CA yang telah dijelaskan sebelumnya

Burp Proxy

Import Sertifikat root CA ke perangkat client.

Setelah Sertifikat CA berhasil diimport ke Proxy Interceptor, langkah selanjutnya adalah melakukan import sertifikat CA ke perangkat client yang akan kita gunakan. Sedikit berbeda dengan proses import sertifikat CA yang kita lakukan di proxy interceptor sebelumnya, kali ini proses import ke perangkat client tidak menyertakan private key. Hal ini karena perangkat client tidak berfungsi membuat dan melakukan signing terhadap digital certificate host atau web server yang akan dikunjungi.

Tugas perangkat client adalah memastikan bahwa web server / site yang akan diakses memiliki Digital Certificate yang valid dan disigned oleh CA yang terpercaya atau trusted. Apabila tidak maka perangkat client akan stop mengirim request selanjutnya ke host tersebut.

Untuk memastikan perangkat client percaya bahwa Digital Certificate yang dibuat oleh proxy interceptor adalah benar dan trusted maka kita perlu Import Sertifikat CA ke perangkat client tersebut.

Import Sertifikat root CA ke Mac OSX

Terdapat dua cara untuk mengimport Sertifikat root CA ke Mac OSX yaitu melalui Certificate Manager Firefox atau melalui KeyChain Access tools yang telah disediakan oleh Mac OSX. Apabila kita import melalui Certificate Manager Firefox maka Sertifikat root CA hanya akan berlaku atau trusted di Firefox saja. Apabila kita menggunakan browser lain atau tools lain untuk mengirim request ke proxy Interceptor maka request tersebut tidak akan dipercaya oleh perangkat client.

Berikut contoh saat kita melakukan request menggukana curl ke google.com melalui proxy interceptor. Saat request ini dikirim, Sertifikat root CA telah diimport melalui Certificate Manager Firefox

curl failed

Agar sertifikat root CA dapat ditrusted oleh perangkat Mac OSX terlepas dari browser atau tools yang digunakan, kita bisa melakukan import Sertifikat root CA melalui KeyChain Access. Berikut proses import menggunaan KeyChain Access.

import CA OSX

Setelah Sertifikat root CA berhasil diimport, maka request menggunakan curl akan berhasil seperti dalam gambar berikut.

curl success

Import Sertifikat root CA ke Android Emulator (AVD).

Sama seperti perangkat client lainnya, Sertifikat root CA juga perlu di-import ke Android agar Proxy Interceptor dapat mencegat atau intercept request dari Android. Google telah meningkatkan keamanan pada Android versi 7 keatas dimana Sertifikat root CA yang di-import oleh pengguna tidak lagi di-trusted atau dipercaya oleh Sistem. Akibatnya Android tidak akan melanjutkan request ke proxy interceptor karena digital certificate milik host atau web server di-signed oleh sertifikat CA yang tidak dipercaya.

Untuk mengatasi ini, kita akan menggunakan Magisk Module bernama Magisk Trust User Cert. Module ini memungkinan kita untuk me-bypass kontrol security Android agar memasukan semua sertifikat root CA yang diimport oleh pengguna ke Sertifikat Sistem milik Android. Dalam kata lain, sertifikat yang di-import oleh pengguna akan otomatis masuk ke penyimpanan sistem sertifikat android dan menyamakan levelnya dengan Sertifikat root CA lainnya seperti milik verisign, globalsign dan lain sebagainya.

Sebelum kita menggunakan module magisk ini, kita harus terlebih dahulu menginstal magisk di Android Emulator. Berikut kebutuhan yang harus disiapkan untuk menginstal Magisk.

No Kebutuhan
1 Instal dan gunakan non-build emulator image (Google APIs) di android studio. Hindari penggunaan image (Goole Play)
2 Download rootAVD di rootAVD. Kita akan menggunakan script dari rootAVD untuk menginstal Magisk dengan melakukan patching pada ramdisk image
3 Download Magisk dari Magisk.
4 Download Magisk Module “Magisk Trus User Certs” di Magisk Module

Berikut langkah untuk mempersiapkan dan menginstal Magisk Module.

  1. Instal dan gunakan non-build emulator image

Android 11 Google APIs

  1. Persiapkan rootAVD, Magisk dan module “Magisk Trus User Certs”
  • Download rootAVD
git clone https://github.com/newbit1/rootAVD.git
  • Download Magisk
wget https://github.com/topjohnwu/Magisk/releases/download/v24.3/Magisk-v24.3.apk -O Magisk.apk
  • Pindahkan Magisk.apk ke folder ./rootAVD/Apps
mv Magisk.apk rootAVD/Apps
  • Download module Magisk Trust User Cert
wget https://github.com/NVISOsecurity/MagiskTrustUserCerts/releases/download/v0.4.1/AlwaysTrustUserCerts.zip -O Alwaystrust.zip

Persiapan Instalasi Magisk

  1. Instal Magisk
  • Jalankan emulator dan pastikan adb dapat mendeteksi Android Emulator
adb devices
  • Install Magisk
./rootAVD.sh InstallApps
  • Identifikasi lokasi file ramdisk.img

ramdisk.img file adalah file system-image yang digunakan oleh android emulator untuk menginisialisasi beberapa konfigurasi sebelum Sistem Operasi dijalankan. ramdisk.img ini di-mounted dalam kondisi read-only dan tidak bisa diubah saat berjalan. Untuk kebutuhan instalasi Magisk, kita perlu lakukan perubahan atau patching terhadap ramdisk.img ini menggunakan rootAVD. Untuk melakukan patching atas ramdisk.img file yang benar, kita perlu memastikan dulu level API yang akan kita gunakan di emulator. Berikut Informasi yang bisa kita lihat dari AVD.

Persiapan Instalasi Magisk

Berdasarkan Informasi diatas kita menggunakan API 30 dan lokasi ramdisk.img di Mac OSX bisa ditemukan di ~/Library/Android/sdk/system-images/android-30/google_apis/x86_64/ramdisk.img.

  • Patch ramdisk.img

Setelah mengetahui lokasi ramdisk.img, kita bisa langsung melakukan patching menggunakan rootAVD. Namun sebelum kita melakukan patching, ada baiknya kita melakukan backup terhadap ramdisk.img file dengan perintah berikut.

cp ~/Library/Android/sdk/system-images/android-30/google_apis/x86_64/ramdisk.img ramdisk-backup.img

Kemudian lakukan patching dengan perintah berikut:

./rootAVD.sh ~/Library/Android/sdk/system-images/android-30/google_apis/x86_64/ramdisk.img

Berikut serangkaian proses instalasi Magisk.

  1. Install Module Magisk & Sertifikat root CA

Langkah selanjutnya adalah menginstal Module Magisk dan kemudian menggunakan module tersebut untuk memasukan sertifikat root CA yang kita import ke Sertifikat Sistem milik Android. Berikut proses instalasi Module Magisk dan meng-import sertifikat root CA yang telah kita buat.

Setelah sertifikat root CA berhasil di-import ke Android, lakukan test dengan mencoba mencegat atau intercept request / response dari browser chrome ke web gmail.com.

Selanjutnya

Artikel ini akan diupdate dengan penjelasan proses import di perangkat Google Pixel 2 dan iPhone iOS