Background Image

BLOG

DKHOS - Mobile 300 - Zabaha Kadar Dans
18 Şubat 2018 CTF

DKHOS - Mobile 300 - Zabaha Kadar Dans


Soru Açıklaması:

Pelinsu Hollanda'da bir club'a giriş için önceden biletini almış. Bilet numarası belki Mahmut için faydalı bir bilgi olabilir.

Mahmut'un araştırmasına göre Pelinsu'nun çocukluk arkadaşı Robin Van Persie de bu etkinliğe gidecekmiş. 

Mahmut Vanpersie'nin e-mail ve parolasını biliyordu zaten:

van***@gmail.com:4h4***
Pelinsu'nun eski cep telefonundan çıkan uygulama ile bilet numarasına ulaşmayı denemeliydi...

Soru Çözümü:

Soruda verilen kullanıcı parola bilgisiyle oturum açınca bize bir ticket numarası veriliyor. Bizden beklenen ise Pelinsu'nun ticket numarasını bulmak. Bunun için uygulamanın sunucuyla arasındaki bağlantıyı incelememiz gerek. Bunun için aşağıdaki adımları izleyebiliriz:

  • APK dosyasını cihazımıza ya da emulatore kuruyoruz.
  • Proxy adresi olarak BurpSuite ya da banzeri proxy aracımızın çalıştığı makinenin IP adresini veriyoruz. 
    • Settings -> Wireless -> Advanced -> Manual proxy (Örn: 192.168.1.100:8080)
  • BurpSuite'in CA sertifikasını cihazın Trusted CA's bölümüne ekliyoruz.
  • Uygulamayı baştan açıp oturum açmayı deniyoruz.

Oturum açmayı denediğimiz başarısız olacaktır. Bunun işaretini BurpSuite'in Alerts sekmesinden SSL Handshake Error mesajından görebilirsiniz. Demek ki uygulama SSL pinning tekniği ile sadece kendi içerisinde gömülü olan sertifika ile SSL Handshake'in yapılmasını istiyor. Bunu bypass etmenin 2 yolu bulunmakta;

  1.  Frida ya da Xposed ile SSL Handshake API metodları hooklanabilir.
  2. APK modifiye edilerek HTTPURLConnection class'ının setSSLFactory metodunun çağrılması engellenebilir.
  3. Yine APK modifiye edilerek gömülü olan sertifika yerine Burp CA sertifikası konulabilir.

Eğer Xposed kurulu ise en kolay yöntem birincisi olacaktır. Aşağıdaki Xposed Modülü ile SSL API metodları manipule edilerek iletişimin izlenmesi sağlanır.

  • https://github.com/ac-pm/SSLUnpinning_Xposed

Ardından login sonrası yapılan getTicket isteği aşağıdaki gibi gözükecektir.

Burada oturum açıldıktan sonra UserValue adında bir headerın eklendiği dikkati çekmelidir. Bu değerin sunucu tarafından dönmediği, uygulama tarafından oluşturulduğu anlaşılmaktadır. Nasıl oluşturulduğunu anlamak amacıyla Jadx ile APK dosyasını decompile edip bakıyoruz.

 

Görüldüğü gibi UserValue headerı için a fonksiyonu çağrılmakta ve resimde gözüken parametreleri almakta. a fonksiyonu incelendiğinde MD5 oluşturan bir fonksiyon olduğunu görebiliriz. Yani bu MD5 hash'i sunucu tarafında aynı şekilde oluşturulup kontrol ediliyor olabilir. Token'ın gerçekten kontrol edilmediğini token'ı random bir değer ile değiştirip tekrar MD5'ini alarak anlayabiliriz.

Pelinsu'nun ticketını almak için ise aşağıdaki string'in MD5'ini alıyoruz:

md5(BUILD_NOclubberpelinsu.volledevohermem@yandex.coma) = c8e617bd1210216d40bb7ab6ebd8858a

Request'i ilgili parametrelerle repeat ediyoruz:

 

Flag: DKHOS_{92747462934340364}