mitmproxy, HTTP bağlantılarını debug etmek için kullanılan bir çeşit açık kaynak araçtır. Bu araç bize, debug edilecek bağlantının arasına sokabileceğimiz bir proxy oluşturur ve proxy ettiği bağlantıya ait HTTP isteklerini bize sunar. Bu yazıda bir Android emülatörü ile mitmproxy’i nasıl birlikte kullanabileceğimizi göstereceğim.

Buradan önce mitmproxy’nin son sürümünü indiriyoruz. Linux ve macOS için binary’lerini indirelim ve uygun bir yere çıkartalım.

sudo tar -xzf mitmproxy-x.x.x-xxxxxx.tar.gz -C /usr/local/bin

Konsoldan mitmweb -p 8080 komutunu gönderdiğiniz zaman 8080 portunda bir proxy servisi başlatılacaktır. 8081 portunda ise web arayüzü için ayrı bir servis başlatılacaktır. Tarayıcıdan mitmproxy’nin web arayüzüne http://localhost:8081 adresinden girdiğimizde karşımıza şöyle bir ekran gelecektir:

mitmweb

Burada proxy üzerinden yapılan tüm istekler listelenecektir. Şu aşamada yalnızca TLS kullanılmayan HTTP istekleri gönderebiliriz çünkü henüz root sertifikamızı emülatöre yüklemedik. Android API sürüm 24 ve sonrası versiyonlarda özel root sertifikası yükleme özelliği kaldırıldı. Eğer kullandığınız emülatördeki Android versiyonu 24’ten düşükse web tarayıcısını açıp mitm.it adresine bağlanıp sertifikayı yükleyebilirsiniz.

API sürümü 24 ve üstü ise tüm yazı boyunca anlattığım adımları uygulayın. cd ~/.mitmproxy/ ile mitmproxy’nin sertifika dosyalalarının bulunduğu konuma gidin. Eğer böyle bir klasör bulunmuyorsa mitmproxy komutunu çalıştırıp kapattıktan sonra oluşacaktır. Android’de root sertifikalar isimlerinin hash değerlerine göre saklandığı için bizim root serfifikamızın hash’ini aşağıdaki komutla ediniyoruz:

cd ~/.mitmproxy/
openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.cer | head -1

Bu komut konsola bende c8750f0d çıktısı verdi. Sizde de farklı bir değer verecektir. Emülatöre kopyalayacağımız sertifikanın adını, oluşan değerin sonuna .0 ekleyerek yani c8750f0d.0 ismini vereceğiz. Android’de root sertifikalar “0” dosya uzantısıyla saklanıyor.

cp mitmproxy-ca-cert.cer c8750f0d.0

Android Studio’nun sistemimizde kurulu olması gerekiyor. Çünkü Android’in SDK araçlarından ve AVD Manager’ından yararlanmamız gerekiyor. Şimdi Android Studio’dan AVD Manager’ı açalım ve yeni bir emülatör oluşturalım. Oluştururken seçmeniz gereken Android imajı çok önemli çünkü chipsetimizle uyumlu olmalı ve Google Play built’ı olmamalı. Aksi taktirde root erişimi veremiyorsunuz. Ben “Android 9.0 (Google APIs)” imajını indirdim (API level: 28, CPU: x86_64) daha sonra “Nexus 4” cihazını seçip yeni bir emülatör oluşturdum.

Önce oluşturulan emülatörleri emulator aracını kullanarak -list-avds parametresi ile listeliyoruz, daha sonra -writable-system ve -http-proxy parametresini kullanarak oluşturulan emülatörü başlatıyoruz.

~/Android/Sdk/tools/emulator -list-avds
~/Android/Sdk/tools/emulator -avd Nexus_4_API_28 -writable-system -http-proxy localhost:8080

Buradaki Nexus_4_API_28 daha önce oluşturduğum bir emülatör. Emülatör açıldıysa başka bir terminal penceresi daha açıp aşağıdaki komutu kullanarak mevcut emülatörü root olarak tekrar başlatın.

~/Android/Sdk/platform-tools/adb root

Bu komut restarting adbd as root çıktısı vermeli.

Root sertifikasını yüklemeden /system dizini için yazma izni vermelisiniz.

~/Android/Sdk/platform-tools/adb shell "mount -o rw,remount /system"

Eğer bu komut mount: '/system' not in /proc/mounts hatası verirse /system yerine / dizinini ayarlayın. Bu dizin, versiyona göre değişebiliyor.

Şimdi root sertifikasını emülatöre yükleyelim ve izinlerini ayarlayalım:

~/Android/Sdk/platform-tools/adb push ~/.mitmproxy/c8750f0d.0 /system/etc/security/cacerts
~/Android/Sdk/platform-tools/adb shell "chmod 664 /system/etc/security/cacerts/c8750f0d.0"

En sonunda ~/Android/Sdk/platform-tools/adb reboot komutuyla emülatörü yeniden başlatıyoruz. Artık emülatördeki tüm HTTP istekleri (TLS bağlantılar dahil) mitmproxy üzerinden gerçekleşecektir. Unutmayın, Android Studio yerine bundan sonra yalnızca yukarıdaki emülatörü başlattığımız komutla emülatörü çalıştıracağız.

mitmweb with tls

mitmproxy resmi dökümanları: https://docs.mitmproxy.org/stable/