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:
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.
mitmproxy resmi dökümanları: https://docs.mitmproxy.org/stable/
Hocam size ulaşabileceğim iletişim adresiniz varmı