DIVA (Damn insecure and vulnerable App) Writeup
Zafiyetli apk dosyasını kurmak için GitHub adresinden indirip kendiniz compile edebilir veya
http://www.payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz adresinden direk apk dosyasını indirebilirsiniz.
APK dosyasını indirdikten sonra ihtiyacımız olacak bazı araç gereçler olacak.
Android Emulator (genymotion, android studio etc.)
adb (Android Debug Bridge)
jadx-gui, jd-gui etc. (İnceleyeceğimiz apk dosyası open-source olduğundan dolayı isterseniz bunları kurmak yerine kaynak kodu bilgisayarınıza indirip veya tarayıcıdan github adresine giderekde inceleyebilirsiniz)
Sanırım şimdilik bu kadarı işimizi görür. Ayağa kaldıracağımız
Android versiyon numarasının çok büyük olmasına gerek yok. Android sürümünü 5,6,7 gibi düşük sürümler seçebilirsiniz.
Gerekli kurulumları yaptıktan sonra çayımızı/kahvemizi/müziğimizi vs de ayarladıysak eğer başlayabiliriz. Öncelikli olarak bu
apk dosyasını cihazımıza yüklememiz gerekecek.
adb install diva-beta.apk
İlgili komutumuzu çalıştırdık ve uygulamamızı yüklemiş olduk.
Ekran görüntüsüne sığmıyor ancak toplamda 13 tane bölüm bulunmakta
1. Insecure Logging 2. Hardcoding Issues – Part 1 3. Insecure Data Storage – Part 1 4. Insecure Data Storage – Part 2 5. Insecure Data Storage – Part 3 6. Insecure Data Storage – Part 4 7. Input Validation Issues – Part 1 8. Input Validation Issues – Part 2 9. Access Control Issues – Part 1 10. Access Control Issues – Part 2 11. Access Control Issues – Part 3 12. Hardcoding Issues – Part 2 13. Input Validation Issues – Part 3
Insecure Logging
İlgili bölüme girdiğimiz zaman bize amacımızın ne olduğunu ve bir adette ipucunun yazdığını görüyoruz. Hem bölümün adından hemde açıklamadan anlayacağımız üzere güvenli olmayan bir şekilde loglama yapılıyormuş. Bunu anlamak için gene
adb kullanacağız.
adb logcat | grep diva
Evet bu şekilde uygulamamızda girmiş olduğumuz input değerinin rahatlıkla loglardan okunabildiğiniz görüyoruz.
Peki bu zafiyet nerden çıktı ?
Görmüş olduğunuz satırdaki işlemi eğer kaldırırsak sorun ortadan kalkacaktır :)
Hardcoding Issues – Part 1
Bize vermiş olduğu bilgilerden anlıyoruz ki burda bizden istenen
key kodun içerisinde mevcut durumda.
Koda baktığımız zaman ise düşündüğümüz şeyde yanılmadığımızı anlıyoruz
Insecure Data Storage – Part 1
Girmiş olduğumuz verinin güvensiz bir şekilde depolandığını düşünüyoruz. Öncelikli olarak bu depolama işleminin nasıl yapıldığına bir bakmamız lazım.
SharedPreferences fonksiyonu kullanılmış. Açıkcası tam olarak ne işe yaradığını bilmiyorum ancak uygulamanın dizinine gidince
shared_prefs isimli bir klasör dikkatimizi çekiyor. Demekki herhangi bir username-password girildiği zaman default olarak buraya yazıyor.
Insecure Data Storage – Part 2
İpucu ve açıklama bir önceki ile aynı sanırım. Hızlıca kaynak kodu inceleyelim.
Bu sefer veriyi yazmak için
SQLite veritabanı kullanılmış.
ids2 isimli bir database oluşturuyor. Bu veritabanının içerisine
myuser isimli bir tablo oluşturuluyor. Bu tablonun içerisinede iki adet kolon oluşturuyor. Girmiş olduğumuz verileride buraya yazıyor.
Insecure Data Storage – Part 3
Gene aynı şeyler yazıyor :( Neyseki kaynak kodu görebiliyoruz
File ddir = ... işlemi sanırım bizim uygulamamızın verilerinin vs tutulduğu yeri bulup kaydediyor. Daha sonra
try işlemi içerisine girdiğimiz zaman gene username-password için alanlarımızın oluştuğunu görüyoruz.
File uinfo = File.createTempFile("uinfo", "tmp", ddir); bu işlem ile uygulamamızın dosyalarının olduğu dizine ismi uinfo ile başlayan bir dosya oluşturuyor. Daha sonra bu dosyayı okunabilir ve yazılabilir yapıyor. Ve girmiş olduğumuz verileri buraya yazıyor.
Insecure Data Storage – Part 4
Bu seferde
Environment.getExternalStorageDirectory() kullanmış. Nedir peki bu diyecek olursanız adındanda anlaşıldığı üzere
ExternalStorage‘a dosyamızı kaydediyor. (/mnt/sdcard/ veya /storage/emulated/0/ olabilir)
NOT: Bu fonksiyon android 10 sürümünde kaldırılmış
NOT-2: Ayarlardan uygulamamızın
storage iznini açmayı unutmayın.
Input Validation Issues – Part 1
Burda bizden yapmamızı istediği alışık olduğumuz SQL Injection
Kaynak koda baktığımız zamanda
sqli ben burdayım diyor :D
Input Validation Issues – Part 2
Bir url adresi girdiğimiz zaman bunu alt tarafa yüklüyormuş/gösteriyormuş.
Tabi biz burda amacına uygun kullanacak değiliz :joy: Web zafiyetlerinden aşina olduğumuz
LFI zafiyetine benzetebiliriz burada oluşan zafiyeti.
Access Control Issues – Part 1
VIEW API CREDENTIALS butonuna bastığımız zaman bize api bilgilerini getiriyor. Bizden istenen şey ise bu butona basmadan api bilgilerinin gösterildiği ekrana ulaşabilmek :/
Kaynak koda bakacak olursak eğer kullanmış olduğu aktiviteyi görebiliriz. Sıra geldi bunu biz nasıl kullanacaz sorusuna. Neyse ki bu konuda da
adb bize yardımcı oluyor :)
adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS
Access Control Issues – Part 2
Register Now. dersek eğer bizden bir “PIN” istiyor.
Already Registered. dersek eğer api bilgilerini getiriyor. Yani anlayacağınız direk açılmasın diye ufak bir kontrol gibi bişi yapmışlar
https://github.com/payatu/diva-android/blob/master/app/src/main/AndroidManifest.xml
... <activity android:name=".APICreds2Activity" android:label="@string/apic2_label" > <intent-filter> <action android:name="jakhar.aseem.diva.action.VIEW_CREDS2" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ...
https://github.com/payatu/diva-android/blob/master/app/src/main/res/values/strings.xml
... <string name="chk_pin">check_pin</string> ...
Şimdi bu şekilde bakacak olursak eğer
check_pin değerimiz true olduğu zaman istediğimiz api bilgilerini göremiyoruz. Yani bu değeri false yapmamız gerekecek. Tabi bunun içinde bir parametremiz mevcut :)
$ adb shell [email protected]:/ # am --help
adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false
Access Control Issues – Part 3
Bu kısımda da bizden aldığı pin değerini uygulamanın bulunduğu dizinde
shared_prefs dizini altına kaydetmekte
Hardcoding Issues – Part 2
Developer arkadaş gene bir yerlere
key saklamış onu bulmamızı istiyor.
Burda dikkatimizi
private DivaJni djni; satırı çekiyor. Çünki
key oradan geliyor.
Bunun için
DivaJni.java isimli dosyamıza gidiyoruz.
System.loadLibrary(soName); sistemden bir adet kütüphane ekliyor sisteme. O halde hedefimiz ` diva-android/app/src/main/jni/divajni.c` dosyası olacak. (“soName = divajni”)
O halde aradığımız
key =
olsdfgad;lh
Input Validation Issues – Part 3
Eğer çok fazla karakter girerseniz bellek alanı yeterli gelmeyecek ve uygulama crash olacaktır.