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.