DIVA (Damn Insecure and Vulnerable App) Writeup

DIVA (Damn insecure and vulnerable App) Writeup​

Zafiyetli apk dosyasını kurmak için GitHub 6 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

ff1878224550371771d1cc401e2afcc49149befa.png


İlgili komutumuzu çalıştırdık ve uygulamamızı yüklemiş olduk.

1


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​

2


İ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

3


Evet bu şekilde uygulamamızda girmiş olduğumuz input değerinin rahatlıkla loglardan okunabildiğiniz görüyoruz.

Peki bu zafiyet nerden çıktı ?

4


Görmüş olduğunuz satırdaki işlemi eğer kaldırırsak sorun ortadan kalkacaktır :)

Hardcoding Issues – Part 1​

5


Bize vermiş olduğu bilgilerden anlıyoruz ki burda bizden istenen key kodun içerisinde mevcut durumda.

6


Koda baktığımız zaman ise düşündüğümüz şeyde yanılmadığımızı anlıyoruz

7


Insecure Data Storage – Part 1​

8


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.

9


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.

10


Insecure Data Storage – Part 2​

11


İpucu ve açıklama bir önceki ile aynı sanırım. Hızlıca kaynak kodu inceleyelim.

12


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.

13


Insecure Data Storage – Part 3​

14


Gene aynı şeyler yazıyor :( Neyseki kaynak kodu görebiliyoruz

15


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.

16


Insecure Data Storage – Part 4​

17


18


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.

19


Input Validation Issues – Part 1​

20


Burda bizden yapmamızı istediği alışık olduğumuz SQL Injection

21


Kaynak koda baktığımız zamanda sqli ben burdayım diyor :D

22


Input Validation Issues – Part 2​

23


Bir url adresi girdiğimiz zaman bunu alt tarafa yüklüyormuş/gösteriyormuş.

24


Tabi biz burda amacına uygun kullanacak değiliz
:joy:
Web zafiyetlerinden aşina olduğumuz LFI zafiyetine benzetebiliriz burada oluşan zafiyeti.

25


Access Control Issues – Part 1​

26


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 :/

27


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

28


Access Control Issues – Part 2​

29


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

30



...
<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>
...


...
<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
root@vbox86p:/ # am --help

31


adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false

32


Access Control Issues – Part 3​

33


34


Bu kısımda da bizden aldığı pin değerini uygulamanın bulunduğu dizinde shared_prefs dizini altına kaydetmekte

35


Hardcoding Issues – Part 2​

36


Developer arkadaş gene bir yerlere key saklamış onu bulmamızı istiyor.

37


Burda dikkatimizi private DivaJni djni; satırı çekiyor. Çünki key oradan geliyor.

Bunun için DivaJni.java isimli dosyamıza gidiyoruz.

38


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”)

39


O halde aradığımız key = olsdfgad;lh

40


Input Validation Issues – Part 3​

41


42


Eğer çok fazla karakter girerseniz bellek alanı yeterli gelmeyecek ve uygulama crash olacaktır.

43


44
 
Üst