Fuzzing'in Başlangıcı

xzh

Üye
8 Nis 2020
216
70
Fuzzing, yazılım testinde kullanılan bir tekniktir. Bu teknikte, rastgele veya yarı rastgele veri üreterek sisteme beslenir ve beklenmedik davranışlar veya hatalar aranır. Fuzzing, yazılımın güvenliğini ve sağlamlığını artırmak için önemli bir araçtır.
Fuzzing Türleri:
  • Rastgele Fuzzing: Bu türde, rastgele veri üreten bir fuzzer kullanılır. Bu basit ve hızlı bir yöntem olsa da, daha az kapsamlı testler sağlar.
  • Hedefli Fuzzing: Bu türde, sistemin girdi formatını ve beklenen davranışlarını göz önünde bulundurarak özel test verileri üretilir. Bu yöntem rastgele fuzzing'e göre daha karmaşıktır, ancak daha kapsamlı testler sağlar.
  • Gramer Tabanlı Fuzzing: Bu türde, sistemin girdi formatını tanımlayan bir gramer kullanılır. Fuzzer, bu gramere dayalı olarak geçerli formatta fakat beklenmedik içeriklere sahip girdiler üretir.
  • Model Tabanlı Fuzzing: Bu türde, sistemin davranış modelini oluşturmak için statik analiz ve hata izleme teknikleri kullanılır. Fuzzer, bu modelin zayıf noktalarını hedef alan test verileri üretir.

Rastgele Fuzzing:​

Yazılım testinde, hataları ve güvenlik açıklarını bulmak için çeşitli teknikler kullanılır. Rastgele fuzzing, bu tekniklerden biridir. Bu teknikte, rastgele veri üreten bir araç kullanılır ve bu veriler sistemin girişine beslenir. Beklenmedik davranışlar veya hatalar gözlemlenerek sistemin güvenliği ve sağlamlığı değerlendirilir.
Rastgele Fuzzing Nasıl Çalışır?
  1. Fuzzer: Rastgele veri üreten bir araçtır. Bu araç, çeşitli veri tipleri ve formatları üretebilir.
  2. Hedef Sistem: Test edilecek sistemdir. Bu sistem bir web uygulaması, masaüstü uygulaması, gömülü sistem veya ağ protokolü olabilir.
  3. Test Verileri: Fuzzer tarafından üretilen rastgele veriler hedef sisteme beslenir.
  4. Gözlem: Hedef sistemin beklenmedik davranışlar veya hatalar gösterip göstermediği gözlemlenir.
  5. Hata Analizi: Bir hata gözlemlendiğinde, hatanın kaynağını ve etkisini belirlemek için analiz yapılır.
  6. Hata Düzeltme: Hata kaynağı ve etkisi belirlendikten sonra hata düzeltilir.
Rastgele Fuzzing'in Avantajları:
  • Hızlı: Rastgele fuzzing, diğer test tekniklerine göre daha hızlı bir şekilde testler yapmayı sağlar.
  • Kolay: Rastgele fuzzing'i uygulamak ve kullanmak nispeten kolaydır.
  • Kapsamlı: Rastgele fuzzing, geniş bir yelpazede test senaryolarını kapsayabilir.
  • Yaratıcı: Rastgele fuzzing, beklenmedik ve yaratıcı test verileri üreterek sistemin zayıf noktalarını ortaya çıkarabilir.
Rastgele Fuzzing'in Dezavantajları:
  • Yanlış Pozitif Sonuçlar: Rastgele fuzzing, hatalı alarmlara yol açabilir.
  • Deterministik Değil: Rastgele fuzzing, her seferinde farklı test senaryoları ürettiğinden, deterministik testler yapmayı zorlaştırır.
  • Tüm Hataları Bulma Garantisi Yok: Rastgele fuzzing, tüm hataları bulmak garanti değildir.

Hedefli Fuzzing:​

Yazılım testinde, hataları ve güvenlik açıklarını bulmak için çeşitli teknikler kullanılır. Hedefli fuzzing, bu tekniklerden biridir. Bu teknikte, sistemin girdi formatını ve beklenen davranışlarını göz önünde bulundurarak özel test verileri üretilir. Bu sayede, rastgele fuzzing'e göre daha kapsamlı ve hassas testler yapılması sağlanır.
Hedefli Fuzzing Nasıl Çalışır?
  1. Hedef Sistemin Analizi: Hedef sistemin girdi formatı ve beklenen davranışları analiz edilir.
  2. Test Verileri Üretimi: Sistemin girdi formatına ve beklenen davranışlarına uygun özel test verileri üretilir.
  3. Test Verileri Besleme: Üretilen test verileri sistemin girişine beslenir.
  4. Gözlem: Hedef sistemin beklenmedik davranışlar veya hatalar gösterip göstermediği gözlemlenir.
  5. Hata Analizi: Bir hata gözlemlendiğinde, hatanın kaynağını ve etkisini belirlemek için analiz yapılır.
  6. Hata Düzeltme: Hata kaynağı ve etkisi belirlendikten sonra hata düzeltilir/
Hedefli Fuzzing'in Avantajları:
  • Daha Kapsamlı Testler: Rastgele fuzzing'e göre daha kapsamlı ve hassas testler yapmayı sağlar.
  • Daha Az Yanlış Pozitif: Rastgele fuzzing'e göre daha az hatalı alarm verir.
  • Daha Etkili Hata Bulma: Sistemin zayıf noktalarını daha iyi hedef alarak hataları daha etkin bir şekilde bulmayı sağlar.
Hedefli Fuzzing'in Dezavantajları:
  • Daha Karmaşık: Rastgele fuzzing'e göre daha karmaşık bir tekniktir.
  • Daha Fazla Zaman: Test verilerinin üretilmesi daha fazla zaman alabilir.
  • Tüm Hataları Bulma Garantisi Yok: Herhangi bir fuzzing tekniğinde olduğu gibi, hedefli fuzzing de tüm hataları bulmak garantisi vermez.

Grammar-Based Fuzzing Nedir?​

Grammar-Based Fuzzing (GBA), yazılım testinde kullanılan bir karmaşık fuzzing tekniğidir. Geleneksel fuzzing teknikleri rastgele veri üreterek yazılıma girdi verir ve beklenmedik davranışları tetikleyip güvenlik açıklarını ortaya çıkarmaya çalışır. GBA ise bunun aksine, bir sistemin girdi beklentilerine uygun veri üretmek için bir dilbilgisi kullanır.
Diğer bir deyişle, GBA bir dilbilgisi tanımlayarak sistemin hangi format ve yapıda veri kabul ettiğini anlamaya çalışır. Örneğin, bir web sitesine form gönderiyorsanız, GBA HTML dilbilgisini kullanarak geçerli formların yapısını ve hangi alanların ne tür verileri beklediğini öğrenebilir. Daha sonra, bu dilbilgisine dayanarak <strong>geçerli formatta fakat beklenmedik veriler</strong> içeren test girdileri üretebilir.
GBA'nın Avantajları:
  • Daha hedefli testler: Geleneksel fuzzing'e göre daha fazla anlamlı veri ürettiği için daha verimlidir.
  • Daha karmaşık sistemleri test edebilme: Karmaşık veri formatlarını anlayabilen dilbilgiler kullanılarak daha hassas testler yapılabilir.
  • Daha az yanlış pozitif: Geleneksel fuzzing'in aksine anlamsız veriler üretmediği için yanlış pozitif alarm riskini azaltır.
GBA'nın Dezavantajları:
  • Dilbilgi oluşturma zamanı: Her sistem için özel bir dilbilgi tanımlamak zaman alıcı olabilir.
  • Hatalı dilbilgiler: Hatalı bir dilbilgi kullanılarak anlamsız test verileri üretilebilir.
  • Karmaşık dilbilgiler: Bazı sistemlerin dilbilgileri çok karmaşık olabilir ve tanımlanması zor olabilir.
  1. Gramer Tanımlama:
    • Sistem tarafından kabul edilen girdilerin yapısını ve kurallarını tanımlayan bir gramer oluşturulur.
    • Örnekteki gramer kuralları:
      • <identifier>: const, static (tanımlayıcılar: const, static)
      • <varname>: herhangi bir değer (değişken isimleri: herhangi bir değer olabilir)
      • <int32>: 0x0 ila 0xFFFFİFİP arası bir tamsayı (32 bitlik tamsayı)
      • <int32 variable>: <identifier> <varname> <int32>; (32 bitlik değişken tanımı)
  2. Fuzzer'ın Girdi Üretmesi:
    • Fuzzer, tanımlanan gramere uyarak çeşitli girdiler üretir.
    • Örnekteki üretilen girdi:
      • const my_value = 1984; (const değişkeni my_value, değeri 1984)
  3. Girdilerin Sisteme Gönderilmesi:
    • Üretilen girdiler, test edilen sisteme gönderilir.
  4. Sistem Davranışının İzlenmesi:
    • Sistem, beklenmedik girdilere nasıl tepki verdiğini gözlemlemek için izlenir.
    • Hatalar, çökmeler veya anormal davranışlar, güvenlik açıklarının belirtileri olabilir.
Genel olarak: GBA, özellikle karmaşık veri formatlarını kullanan sistemlerin test edilmesi için güçlü bir tekniktir. Ancak dilbilgi oluşturma süresi ve karmaşıklığı gibi dezavantajlarını da göz önünde bulundurmak gerekir.
Eğer sisteminiz belirli bir dilbilgi veya veri formatı kullanıyorsa ve bu formatı tanımlayarak anlamlı test verileri üretebiliyorsanız, GBA size etkili bir test yöntemi sunabilir.

Model Tabanlı Fuzzing:​

Yazılım testinde, hataları ve güvenlik açıklarını bulmak için çeşitli teknikler kullanılır. Model tabanlı fuzzing, bu tekniklerden biridir. Bu teknikte, sistemin davranış modelini oluşturmak için statik analiz ve hata izleme teknikleri kullanılır. Test verileri bu modelin zayıf noktalarını hedef alarak üretilir. Bu sayede, rastgele ve hedefli fuzzing'e göre daha kapsamlı ve hassas testler yapılması sağlanır.
Model Tabanlı Fuzzing Nasıl Çalışır?
  1. Model Oluşturma: Sistemin davranış modelini oluşturmak için statik analiz ve hata izleme teknikleri kullanılır.
  2. Zayıf Nokta Tespiti: Modelin zayıf noktaları ve hatalara açık alanları belirlenir.
  3. Test Verileri Üretimi: Zayıf noktaları hedef alan özel test verileri üretilir.
  4. Test Verileri Besleme: Üretilen test verileri sistemin girişine beslenir.
  5. Gözlem: Hedef sistemin beklenmedik davranışlar veya hatalar gösterip göstermediği gözlemlenir.
  6. Hata Analizi: Bir hata gözlemlendiğinde, hatanın kaynağını ve etkisini belirlemek için analiz yapılır.
  7. Hata Düzeltme: Hata kaynağı ve etkisi belirlendikten sonra hata düzeltilir.
Model Tabanlı Fuzzing'in Avantajları:
  • Daha Kapsamlı Testler: Rastgele ve hedefli fuzzing'e göre daha kapsamlı ve hassas testler yapmayı sağlar.
  • Daha Az Yanlış Pozitif: Rastgele fuzzing'e göre daha az hatalı alarm verir.
  • Daha Etkili Hata Bulma: Sistemin zayıf noktalarını daha iyi hedef alarak hataları daha etkin bir şekilde bulmayı sağlar.
  • Daha Karmaşık Test Senaryoları: Karmaşık ve beklenmedik test senaryoları oluşturmak için kullanılabilir.
Model Tabanlı Fuzzing'in Dezavantajları:
  • Daha Karmaşık: Rastgele ve hedefli fuzzing'e göre daha karmaşık bir tekniktir.
  • Daha Fazla Zaman: Model oluşturmak ve test verileri üretmek daha fazla zaman alabilir.
  • Tüm Hataları Bulma Garantisi Yok: Herhangi bir fuzzing tekniğinde olduğu gibi, model tabanlı fuzzing de tüm hataları bulmak garantisi vermez.
Fuzzing, birçok farklı alanda kullanılabilir:
  • Web Uygulamaları: Web uygulamalarının güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Mobil Uygulamalar: Mobil uygulamaların güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Masaüstü Uygulamaları: Masaüstü uygulamalarının güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Gömülü Sistemler: Gömülü sistemlerin güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Ağ Protokolleri: Ağ protokollerinin güvenlik açıklarını ve hatalarını bulmak için kullanılabilir
Fuzzing için birçok farklı araç mevcuttur. Bu araçlar, farklı fuzzing türlerini ve farklı platformları destekler.
  • FuzzingBook: Fuzzing hakkında kapsamlı bir bilgi kaynağı.
  • American Fuzzy Lop: Popüler bir fuzzing aracı.
  • AFLplusplus: American Fuzzy Lop'un geliştirilmiş bir versiyonu.
  • LibFuzzer: Google tarafından geliştirilmiş bir fuzzing kütüphanesi.
  • Peach Fuzzer: Web uygulamaları için fuzzing aracı.
  • Sulley: Mobil uygulamalar için fuzzing aracı.
Şimdi lab' hazırlayalım ve bir fuzzing işlemi yapalım.
1. GitHub - googleprojectzero/winafl: A fork of AFL for fuzzing Windows binaries
2. Releases
3. Visual Studio + C++ Development Kit
4. Cmake
5. x64 Native Tools

Şimdi ise bir fuzzing yapalım ve biraz daha fikir edinelim.

WinAfl'da böyle bir c ile yazılmış uygulama var buna sonra ne olduğuna değeneçeğim. Şimdi bu uygulamayı derleyelim.



C:
#include <stdio.h>
#include <windows.h>
#include <gdiplus.h>

using namespace Gdiplus;

wchar_t* charToWChar(const char* text)
{
    size_t size = strlen(text) + 1;
    wchar_t* wa = new wchar_t[size];
    mbstowcs(wa,text,size);
    return wa;
}

int main(int argc, char** argv)
{
    if(argc < 2) {
        printf("Usage: %s <image file>\n", argv[0]);
        return 0;
    }

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    Image *image = NULL;
    //*thumbnail=NULL;

    image = new Image(charToWChar(argv[1]));
    if(image && (Ok == image->GetLastStatus())) {
        //printf("Image loaded\n");
        /*thumbnail = image->GetThumbnailImage(100, 100, NULL, NULL);
        if(thumbnail && (Ok == thumbnail->GetLastStatus())) {
            //printf("Thumbnail created\n");
        }*/
    }

    //printf("Done\n");

    if(image) delete image;
    //if(thumbnail) delete thumbnail;

    GdiplusShutdown(gdiplusToken);

    return 0;
}

Şimdi kodun bize ne demek istediğine bakalım.

Kütüphaneler :
  • #include <stdio.h>: Temel giriş/çıkış fonksiyonları (konsola yazdırma gibi) için standart kütüphaneyi ekler.
  • #include <windows.h>: Windows'a özgü fonksiyonları ve yapıları ekler.
  • #include <gdiplus.h>: Grafik ve görüntüleme işlemleri için GDI+ kütüphanesini ekler.
  • using namespace Gdiplus;: GDI+ fonksiyonları ve nesneleri önüne Gdiplus:: yazmamak için GDI+ isim alanını kullanır.
Karakter Dönüşüm Fonksiyonu:
  • wchar_t* charToWChar(const char* text): Bu fonksiyon bir metni dar karakter türünden (char) geniş karakter türüne (wchar_t) dönüştürür. Bu, Windows ortamlarında Unicode metni işlemek için sıklıkla kullanılır.
Ana Fonksiyon: bizden 2 arguman alıyor bildiğimiz gibi. Buna daha sonra değineçeğim cünkü, winafl verdiğimiz parametrelerde yardımcı ve belirleyici olucak.
Argüman Kontrolü:

  • if(argc < 2): Kullanıcının komut satırında bir resim dosyası argümanı girip girmediğini kontrol eder. Girmediyse, kullanım mesajı yazdırır ve programdan çıkar.
GDI+ Başlatma:
  • GdiplusStartupInput gdiplusStartupInput;: GDI+ başlatma ayarları için bir nesne oluşturur.
  • ULONG_PTR gdiplusToken;: GDI+ tarafından daha sonra kapatma için döndürülen bir jetonu saklar.
  • GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);: GDI+ kütüphanesini başlatır.
Resim Yükleme:
  • Image *image = NULL;: Bir Image nesnesini tutmak için bir işaretçi tanımlar.
  • image = new Image(charToWChar(argv[1]));: Belirtilen resim dosyasından charToWChar fonksiyonunu kullanarak dosya yolunu geniş bir metne dönüştürerek bir Image nesnesi oluşturur.
  • if(image && (Ok == image->GetLastStatus())): Resmin başarıyla yüklenip yüklenmediğini kontrol eder
Temizlik:
  • if(image) delete image;: Belleği boşaltmak için image nesnesini siler.
  • //if(thumbnail) delete thumbnail;: (Yorum satırı) Thumbnail oluşturulmuş olsaydı silinirdi.
  • GdiplusShutdown(gdiplusToken);: GDI+ kütüphanesini kapatır.
Biraz araştırma yaparak uygulamamızın hangi parametrelerde değerler aldığını bulduk. Daha sonra bir jpeg dosyası indirelim ve bir dahaki step'e geçelim.




Şimdi buraya kadar duralım ve input ve output klasörlerinin eklendiğini görebiliriz. Şimdi bizim loop oluşaçak fonsiyonumuza gerek var ve DynamoRIO" da Bizim uygulamamızda main fonsiyonu işaret ediyor. Burada duralım cünkü, bazı bilgileri bilmemiz gerekiyor.
Bash:
--coverage_module gdiplus.dll
ifadesi, DynamoRIO'ya GDI Plus kütüphanesi içindeki kod bloklarının çalışma zamanındaki kullanımını izlemesini ve kapsama bilgisini toplamasını söyler.
--coverage_module
Bash:
Eğer birden fazla modüllerimiz varsa o zaman tekrardan yazıp belirte bilirsiniz.
Bash:
-target_module gdiplus.exe
ifadesi, bir program içindeki hedeflenen kodun bulunduğu modülü belirtir.
Eğer bir programın içindeki ana fonksiyonun (main function) adresini belirtmemiz gerekiyorsa, genellikle bu fonksiyonun adresini bulmanın iki yolu vardır. İlk olarak, eğer ana fonksiyon dışa aktarılmamışsa, yani programın dış dünyayla paylaşılmayan bir iç fonksiyonu olarak tanımlandıysa, ana fonksiyonun adresini bulmak için ofseti bulmamız gerekir. Bu ofset, programın başlangıç adresinden ana fonksiyonun konumuna kadar olan mesafeyi ifade eder. Bu ofseti bulmak için programın ikili kodunu bir araç olan Ghidra gibi bir programda açarız ve ana fonksiyonun başlangıç adresini belirleriz.
Diğer bir seçenek ise, eğer ana fonksiyon dışa aktarılmışsa, yani başka kod parçaları tarafından kullanılabilir hale getirilmişse, o zaman ana fonksiyonun adresini dışarı aktarılmış bir sembol olarak belirtmemiz gerekir. Bu durumda, derleyiciye extern C ve dll_export gibi ifadeler ekleyerek ana fonksiyonun dışa aktarılmış bir sembol haline getirilmesini sağlarız. Sonrasında, ana fonksiyonun adresini bu dış sembolden alırız. Sonrasında yeniden derleriz. Şimdi gelin Ghidrayı bir deneyelim ve main fonsiyonunun offsetini bulalim.

Biraz bilgi :)



Sonuna kadar yess!


Analiz yapana kadar bir şarkı açalım :)

Şimdi base add"in ne olduğunu bulmamız gerekiyor. Normalde en basit yollardan birisi en üste kadar cıkalım ve bakalım ne görüyoruz.



Bu değeri not edelim ve aramaya devam edelim. Yukarıdakı kodumuzda GdiplusStartup çağrıldığını görüyoruz ve ipucumuz geldi devam edelim.



Referanslara bakım devam edelim.



Bulduk. Bu değeri base addressden cıktığımızda 1070 diye bir değer elde ediyoruz.



Bunu devam eden kodumuza ekleyelim ve devam edelim. Şimdi ise, fonsiyonumuz kaç adet input alıyor bunu belirtmemiz gerekiyor.
C:
int main(int argc, char** argv)

Bu, genellikle fonksiyonun girdi parametrelerini ve yığın (stack) yapısını doğru bir şekilde düzeltmek için gerekli olan argüman sayısını bilmeyi gerektirir.
Bu durumda, bahsettiğiniz işlevin iki argüman aldığını belirtmek gerekiyor. Bu, işlevin geri dönüşünden önce yapılan değişiklikleri doğru bir şekilde uygulamak için önemlidir.


Şimdi kodumuzu bitirdiğimize göre genel bir açıklama yapalım.
  • afl-fuzz.exe: AFL fuzzing aracının çalıştırılacağını belirtir.
  • -i C:\Users\admin\Desktop\fuzz\input: Giriş klasörünün yolu. Fuzzer, buradaki giriş dosyalarını kullanarak testler yapacak.
  • -o C:\Users\admin\Desktop\fuzz\outputs: Çıkış klasörünün yolu. Fuzzer, burada bulunan sonuçları saklayacak.
  • -D C:\Users\admin\Desktop\fuzz\DynamoRIO-Windows-10.0.0\bin64: DynamoRIO'nun yolu.
  • -t 20000: Fuzzing işleminin maksimum süresini belirtir. Bu durumda, 20.000 milisaniye (20 saniye) olarak belirlenmiş.
  • --: AFL'ye, komut satırındaki AFL parametrelerinin sona erdiğini ve bundan sonraki parametrelerin hedef programı ve argümanlarını içerdiğini belirtir.
  • -coverage_module gdiplus.dll: Kapsama bilgisini toplamak için izlenecek modülü belirtir. Bu durumda, GDI Plus kütüphanesi (gdiplus.dll) izlenecek.
  • -target_module gdiplus.exe: Hedef programın adını belirtir. Bu durumda, test edilecek program gdiplus.exe olarak belirlenmiş.
  • -target_offset 0x1070: Hedef programdaki ana fonksiyonun (main) başlangıç adresinin ofsetini belirtir. 0x1070 ofseti, ana fonksiyonun başlangıç adresini temsil eder.
  • -nargs 2: Ana fonksiyonun kaç argüman aldığını belirtir. Bu durumda, ana fonksiyonun iki argüman aldığı belirtilmiş.
  • -- C:\Users\admin\Desktop\fuzz\winafl\gdiplus.exe @@: Fuzz edilecek programın yolu ve argümanlarını belirtir. Bu komut, gdiplus.exe programını çalıştıracak ve AFL tarafından sağlanan girişlerle bu programı test edecektir. @@ sembolü, AFL tarafından otomatik olarak sağlanan giriş dosyalarını ifade eder. AFL -i seçeneğiyle belirtilen giriş klasöründe input adında bir dosya bulunuyorsa, AFL @@ sembolüyle bu dosyayı alır ve hedef programı bu dosya ile çalıştırır.
Bash:
afl-fuzz.exe -i C:\Users\admin\Desktop\fuzz\input -o C:\Users\admin\Desktop\fuzz\outputs -D C:\Users\admin\Desktop\fuzz\DynamoRIO-Windows-10.0.0\bin64 -t 20000 -- -coverage_module gdiplus.dll -target_module gdiplus.exe -target_offset 0x1070 -nargs 2 -- C:\Users\admin\Desktop\fuzz\winafl\gdiplus.exe @@

 

QuatrexDefacer

Black Hat Junior
15 Eki 2022
591
360
Baku
Fuzzing, yazılım testinde kullanılan bir tekniktir. Bu teknikte, rastgele veya yarı rastgele veri üreterek sisteme beslenir ve beklenmedik davranışlar veya hatalar aranır. Fuzzing, yazılımın güvenliğini ve sağlamlığını artırmak için önemli bir araçtır.
Fuzzing Türleri:
  • Rastgele Fuzzing: Bu türde, rastgele veri üreten bir fuzzer kullanılır. Bu basit ve hızlı bir yöntem olsa da, daha az kapsamlı testler sağlar.
  • Hedefli Fuzzing: Bu türde, sistemin girdi formatını ve beklenen davranışlarını göz önünde bulundurarak özel test verileri üretilir. Bu yöntem rastgele fuzzing'e göre daha karmaşıktır, ancak daha kapsamlı testler sağlar.
  • Gramer Tabanlı Fuzzing: Bu türde, sistemin girdi formatını tanımlayan bir gramer kullanılır. Fuzzer, bu gramere dayalı olarak geçerli formatta fakat beklenmedik içeriklere sahip girdiler üretir.
  • Model Tabanlı Fuzzing: Bu türde, sistemin davranış modelini oluşturmak için statik analiz ve hata izleme teknikleri kullanılır. Fuzzer, bu modelin zayıf noktalarını hedef alan test verileri üretir.

Rastgele Fuzzing:​

Yazılım testinde, hataları ve güvenlik açıklarını bulmak için çeşitli teknikler kullanılır. Rastgele fuzzing, bu tekniklerden biridir. Bu teknikte, rastgele veri üreten bir araç kullanılır ve bu veriler sistemin girişine beslenir. Beklenmedik davranışlar veya hatalar gözlemlenerek sistemin güvenliği ve sağlamlığı değerlendirilir.
Rastgele Fuzzing Nasıl Çalışır?
  1. Fuzzer: Rastgele veri üreten bir araçtır. Bu araç, çeşitli veri tipleri ve formatları üretebilir.
  2. Hedef Sistem: Test edilecek sistemdir. Bu sistem bir web uygulaması, masaüstü uygulaması, gömülü sistem veya ağ protokolü olabilir.
  3. Test Verileri: Fuzzer tarafından üretilen rastgele veriler hedef sisteme beslenir.
  4. Gözlem: Hedef sistemin beklenmedik davranışlar veya hatalar gösterip göstermediği gözlemlenir.
  5. Hata Analizi: Bir hata gözlemlendiğinde, hatanın kaynağını ve etkisini belirlemek için analiz yapılır.
  6. Hata Düzeltme: Hata kaynağı ve etkisi belirlendikten sonra hata düzeltilir.
Rastgele Fuzzing'in Avantajları:
  • Hızlı: Rastgele fuzzing, diğer test tekniklerine göre daha hızlı bir şekilde testler yapmayı sağlar.
  • Kolay: Rastgele fuzzing'i uygulamak ve kullanmak nispeten kolaydır.
  • Kapsamlı: Rastgele fuzzing, geniş bir yelpazede test senaryolarını kapsayabilir.
  • Yaratıcı: Rastgele fuzzing, beklenmedik ve yaratıcı test verileri üreterek sistemin zayıf noktalarını ortaya çıkarabilir.
Rastgele Fuzzing'in Dezavantajları:
  • Yanlış Pozitif Sonuçlar: Rastgele fuzzing, hatalı alarmlara yol açabilir.
  • Deterministik Değil: Rastgele fuzzing, her seferinde farklı test senaryoları ürettiğinden, deterministik testler yapmayı zorlaştırır.
  • Tüm Hataları Bulma Garantisi Yok: Rastgele fuzzing, tüm hataları bulmak garanti değildir.

Hedefli Fuzzing:​

Yazılım testinde, hataları ve güvenlik açıklarını bulmak için çeşitli teknikler kullanılır. Hedefli fuzzing, bu tekniklerden biridir. Bu teknikte, sistemin girdi formatını ve beklenen davranışlarını göz önünde bulundurarak özel test verileri üretilir. Bu sayede, rastgele fuzzing'e göre daha kapsamlı ve hassas testler yapılması sağlanır.
Hedefli Fuzzing Nasıl Çalışır?
  1. Hedef Sistemin Analizi: Hedef sistemin girdi formatı ve beklenen davranışları analiz edilir.
  2. Test Verileri Üretimi: Sistemin girdi formatına ve beklenen davranışlarına uygun özel test verileri üretilir.
  3. Test Verileri Besleme: Üretilen test verileri sistemin girişine beslenir.
  4. Gözlem: Hedef sistemin beklenmedik davranışlar veya hatalar gösterip göstermediği gözlemlenir.
  5. Hata Analizi: Bir hata gözlemlendiğinde, hatanın kaynağını ve etkisini belirlemek için analiz yapılır.
  6. Hata Düzeltme: Hata kaynağı ve etkisi belirlendikten sonra hata düzeltilir/
Hedefli Fuzzing'in Avantajları:
  • Daha Kapsamlı Testler: Rastgele fuzzing'e göre daha kapsamlı ve hassas testler yapmayı sağlar.
  • Daha Az Yanlış Pozitif: Rastgele fuzzing'e göre daha az hatalı alarm verir.
  • Daha Etkili Hata Bulma: Sistemin zayıf noktalarını daha iyi hedef alarak hataları daha etkin bir şekilde bulmayı sağlar.
Hedefli Fuzzing'in Dezavantajları:
  • Daha Karmaşık: Rastgele fuzzing'e göre daha karmaşık bir tekniktir.
  • Daha Fazla Zaman: Test verilerinin üretilmesi daha fazla zaman alabilir.
  • Tüm Hataları Bulma Garantisi Yok: Herhangi bir fuzzing tekniğinde olduğu gibi, hedefli fuzzing de tüm hataları bulmak garantisi vermez.

Grammar-Based Fuzzing Nedir?​

Grammar-Based Fuzzing (GBA), yazılım testinde kullanılan bir karmaşık fuzzing tekniğidir. Geleneksel fuzzing teknikleri rastgele veri üreterek yazılıma girdi verir ve beklenmedik davranışları tetikleyip güvenlik açıklarını ortaya çıkarmaya çalışır. GBA ise bunun aksine, bir sistemin girdi beklentilerine uygun veri üretmek için bir dilbilgisi kullanır.
Diğer bir deyişle, GBA bir dilbilgisi tanımlayarak sistemin hangi format ve yapıda veri kabul ettiğini anlamaya çalışır. Örneğin, bir web sitesine form gönderiyorsanız, GBA HTML dilbilgisini kullanarak geçerli formların yapısını ve hangi alanların ne tür verileri beklediğini öğrenebilir. Daha sonra, bu dilbilgisine dayanarak <strong>geçerli formatta fakat beklenmedik veriler</strong> içeren test girdileri üretebilir.
GBA'nın Avantajları:
  • Daha hedefli testler: Geleneksel fuzzing'e göre daha fazla anlamlı veri ürettiği için daha verimlidir.
  • Daha karmaşık sistemleri test edebilme: Karmaşık veri formatlarını anlayabilen dilbilgiler kullanılarak daha hassas testler yapılabilir.
  • Daha az yanlış pozitif: Geleneksel fuzzing'in aksine anlamsız veriler üretmediği için yanlış pozitif alarm riskini azaltır.
GBA'nın Dezavantajları:
  • Dilbilgi oluşturma zamanı: Her sistem için özel bir dilbilgi tanımlamak zaman alıcı olabilir.
  • Hatalı dilbilgiler: Hatalı bir dilbilgi kullanılarak anlamsız test verileri üretilebilir.
  • Karmaşık dilbilgiler: Bazı sistemlerin dilbilgileri çok karmaşık olabilir ve tanımlanması zor olabilir.
  1. Gramer Tanımlama:
    • Sistem tarafından kabul edilen girdilerin yapısını ve kurallarını tanımlayan bir gramer oluşturulur.
    • Örnekteki gramer kuralları:
      • <identifier>: const, static (tanımlayıcılar: const, static)
      • <varname>: herhangi bir değer (değişken isimleri: herhangi bir değer olabilir)
      • <int32>: 0x0 ila 0xFFFFİFİP arası bir tamsayı (32 bitlik tamsayı)
      • <int32 variable>: <identifier> <varname> <int32>; (32 bitlik değişken tanımı)
  2. Fuzzer'ın Girdi Üretmesi:
    • Fuzzer, tanımlanan gramere uyarak çeşitli girdiler üretir.
    • Örnekteki üretilen girdi:
      • const my_value = 1984; (const değişkeni my_value, değeri 1984)
  3. Girdilerin Sisteme Gönderilmesi:
    • Üretilen girdiler, test edilen sisteme gönderilir.
  4. Sistem Davranışının İzlenmesi:
    • Sistem, beklenmedik girdilere nasıl tepki verdiğini gözlemlemek için izlenir.
    • Hatalar, çökmeler veya anormal davranışlar, güvenlik açıklarının belirtileri olabilir.
Genel olarak: GBA, özellikle karmaşık veri formatlarını kullanan sistemlerin test edilmesi için güçlü bir tekniktir. Ancak dilbilgi oluşturma süresi ve karmaşıklığı gibi dezavantajlarını da göz önünde bulundurmak gerekir.
Eğer sisteminiz belirli bir dilbilgi veya veri formatı kullanıyorsa ve bu formatı tanımlayarak anlamlı test verileri üretebiliyorsanız, GBA size etkili bir test yöntemi sunabilir.

Model Tabanlı Fuzzing:​

Yazılım testinde, hataları ve güvenlik açıklarını bulmak için çeşitli teknikler kullanılır. Model tabanlı fuzzing, bu tekniklerden biridir. Bu teknikte, sistemin davranış modelini oluşturmak için statik analiz ve hata izleme teknikleri kullanılır. Test verileri bu modelin zayıf noktalarını hedef alarak üretilir. Bu sayede, rastgele ve hedefli fuzzing'e göre daha kapsamlı ve hassas testler yapılması sağlanır.
Model Tabanlı Fuzzing Nasıl Çalışır?
  1. Model Oluşturma: Sistemin davranış modelini oluşturmak için statik analiz ve hata izleme teknikleri kullanılır.
  2. Zayıf Nokta Tespiti: Modelin zayıf noktaları ve hatalara açık alanları belirlenir.
  3. Test Verileri Üretimi: Zayıf noktaları hedef alan özel test verileri üretilir.
  4. Test Verileri Besleme: Üretilen test verileri sistemin girişine beslenir.
  5. Gözlem: Hedef sistemin beklenmedik davranışlar veya hatalar gösterip göstermediği gözlemlenir.
  6. Hata Analizi: Bir hata gözlemlendiğinde, hatanın kaynağını ve etkisini belirlemek için analiz yapılır.
  7. Hata Düzeltme: Hata kaynağı ve etkisi belirlendikten sonra hata düzeltilir.
Model Tabanlı Fuzzing'in Avantajları:
  • Daha Kapsamlı Testler: Rastgele ve hedefli fuzzing'e göre daha kapsamlı ve hassas testler yapmayı sağlar.
  • Daha Az Yanlış Pozitif: Rastgele fuzzing'e göre daha az hatalı alarm verir.
  • Daha Etkili Hata Bulma: Sistemin zayıf noktalarını daha iyi hedef alarak hataları daha etkin bir şekilde bulmayı sağlar.
  • Daha Karmaşık Test Senaryoları: Karmaşık ve beklenmedik test senaryoları oluşturmak için kullanılabilir.
Model Tabanlı Fuzzing'in Dezavantajları:
  • Daha Karmaşık: Rastgele ve hedefli fuzzing'e göre daha karmaşık bir tekniktir.
  • Daha Fazla Zaman: Model oluşturmak ve test verileri üretmek daha fazla zaman alabilir.
  • Tüm Hataları Bulma Garantisi Yok: Herhangi bir fuzzing tekniğinde olduğu gibi, model tabanlı fuzzing de tüm hataları bulmak garantisi vermez.
Fuzzing, birçok farklı alanda kullanılabilir:
  • Web Uygulamaları: Web uygulamalarının güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Mobil Uygulamalar: Mobil uygulamaların güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Masaüstü Uygulamaları: Masaüstü uygulamalarının güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Gömülü Sistemler: Gömülü sistemlerin güvenlik açıklarını ve hatalarını bulmak için kullanılabilir.
  • Ağ Protokolleri: Ağ protokollerinin güvenlik açıklarını ve hatalarını bulmak için kullanılabilir
Fuzzing için birçok farklı araç mevcuttur. Bu araçlar, farklı fuzzing türlerini ve farklı platformları destekler.
  • FuzzingBook: Fuzzing hakkında kapsamlı bir bilgi kaynağı.
  • American Fuzzy Lop: Popüler bir fuzzing aracı.
  • AFLplusplus: American Fuzzy Lop'un geliştirilmiş bir versiyonu.
  • LibFuzzer: Google tarafından geliştirilmiş bir fuzzing kütüphanesi.
  • Peach Fuzzer: Web uygulamaları için fuzzing aracı.
  • Sulley: Mobil uygulamalar için fuzzing aracı.
Şimdi lab' hazırlayalım ve bir fuzzing işlemi yapalım.
1. GitHub - googleprojectzero/winafl: A fork of AFL for fuzzing Windows binaries
2. Releases
3. Visual Studio + C++ Development Kit
4. Cmake
5. x64 Native Tools

Şimdi ise bir fuzzing yapalım ve biraz daha fikir edinelim.

WinAfl'da böyle bir c ile yazılmış uygulama var buna sonra ne olduğuna değeneçeğim. Şimdi bu uygulamayı derleyelim.



C:
#include <stdio.h>
#include <windows.h>
#include <gdiplus.h>

using namespace Gdiplus;

wchar_t* charToWChar(const char* text)
{
    size_t size = strlen(text) + 1;
    wchar_t* wa = new wchar_t[size];
    mbstowcs(wa,text,size);
    return wa;
}

int main(int argc, char** argv)
{
    if(argc < 2) {
        printf("Usage: %s <image file>\n", argv[0]);
        return 0;
    }

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    Image *image = NULL;
    //*thumbnail=NULL;

    image = new Image(charToWChar(argv[1]));
    if(image && (Ok == image->GetLastStatus())) {
        //printf("Image loaded\n");
        /*thumbnail = image->GetThumbnailImage(100, 100, NULL, NULL);
        if(thumbnail && (Ok == thumbnail->GetLastStatus())) {
            //printf("Thumbnail created\n");
        }*/
    }

    //printf("Done\n");

    if(image) delete image;
    //if(thumbnail) delete thumbnail;

    GdiplusShutdown(gdiplusToken);

    return 0;
}

Şimdi kodun bize ne demek istediğine bakalım.

Kütüphaneler :
  • #include <stdio.h>: Temel giriş/çıkış fonksiyonları (konsola yazdırma gibi) için standart kütüphaneyi ekler.
  • #include <windows.h>: Windows'a özgü fonksiyonları ve yapıları ekler.
  • #include <gdiplus.h>: Grafik ve görüntüleme işlemleri için GDI+ kütüphanesini ekler.
  • using namespace Gdiplus;: GDI+ fonksiyonları ve nesneleri önüne Gdiplus:: yazmamak için GDI+ isim alanını kullanır.
Karakter Dönüşüm Fonksiyonu:
  • wchar_t* charToWChar(const char* text): Bu fonksiyon bir metni dar karakter türünden (char) geniş karakter türüne (wchar_t) dönüştürür. Bu, Windows ortamlarında Unicode metni işlemek için sıklıkla kullanılır.
Ana Fonksiyon: bizden 2 arguman alıyor bildiğimiz gibi. Buna daha sonra değineçeğim cünkü, winafl verdiğimiz parametrelerde yardımcı ve belirleyici olucak.
Argüman Kontrolü:

  • if(argc < 2): Kullanıcının komut satırında bir resim dosyası argümanı girip girmediğini kontrol eder. Girmediyse, kullanım mesajı yazdırır ve programdan çıkar.
GDI+ Başlatma:
  • GdiplusStartupInput gdiplusStartupInput;: GDI+ başlatma ayarları için bir nesne oluşturur.
  • ULONG_PTR gdiplusToken;: GDI+ tarafından daha sonra kapatma için döndürülen bir jetonu saklar.
  • GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);: GDI+ kütüphanesini başlatır.
Resim Yükleme:
  • Image *image = NULL;: Bir Image nesnesini tutmak için bir işaretçi tanımlar.
  • image = new Image(charToWChar(argv[1]));: Belirtilen resim dosyasından charToWChar fonksiyonunu kullanarak dosya yolunu geniş bir metne dönüştürerek bir Image nesnesi oluşturur.
  • if(image && (Ok == image->GetLastStatus())): Resmin başarıyla yüklenip yüklenmediğini kontrol eder
Temizlik:
  • if(image) delete image;: Belleği boşaltmak için image nesnesini siler.
  • //if(thumbnail) delete thumbnail;: (Yorum satırı) Thumbnail oluşturulmuş olsaydı silinirdi.
  • GdiplusShutdown(gdiplusToken);: GDI+ kütüphanesini kapatır.
Biraz araştırma yaparak uygulamamızın hangi parametrelerde değerler aldığını bulduk. Daha sonra bir jpeg dosyası indirelim ve bir dahaki step'e geçelim.




Şimdi buraya kadar duralım ve input ve output klasörlerinin eklendiğini görebiliriz. Şimdi bizim loop oluşaçak fonsiyonumuza gerek var ve DynamoRIO" da Bizim uygulamamızda main fonsiyonu işaret ediyor. Burada duralım cünkü, bazı bilgileri bilmemiz gerekiyor.
Bash:
--coverage_module gdiplus.dll
ifadesi, DynamoRIO'ya GDI Plus kütüphanesi içindeki kod bloklarının çalışma zamanındaki kullanımını izlemesini ve kapsama bilgisini toplamasını söyler.
--coverage_module
Bash:
Eğer birden fazla modüllerimiz varsa o zaman tekrardan yazıp belirte bilirsiniz.
Bash:
-target_module gdiplus.exe
ifadesi, bir program içindeki hedeflenen kodun bulunduğu modülü belirtir.
Eğer bir programın içindeki ana fonksiyonun (main function) adresini belirtmemiz gerekiyorsa, genellikle bu fonksiyonun adresini bulmanın iki yolu vardır. İlk olarak, eğer ana fonksiyon dışa aktarılmamışsa, yani programın dış dünyayla paylaşılmayan bir iç fonksiyonu olarak tanımlandıysa, ana fonksiyonun adresini bulmak için ofseti bulmamız gerekir. Bu ofset, programın başlangıç adresinden ana fonksiyonun konumuna kadar olan mesafeyi ifade eder. Bu ofseti bulmak için programın ikili kodunu bir araç olan Ghidra gibi bir programda açarız ve ana fonksiyonun başlangıç adresini belirleriz.
Diğer bir seçenek ise, eğer ana fonksiyon dışa aktarılmışsa, yani başka kod parçaları tarafından kullanılabilir hale getirilmişse, o zaman ana fonksiyonun adresini dışarı aktarılmış bir sembol olarak belirtmemiz gerekir. Bu durumda, derleyiciye extern C ve dll_export gibi ifadeler ekleyerek ana fonksiyonun dışa aktarılmış bir sembol haline getirilmesini sağlarız. Sonrasında, ana fonksiyonun adresini bu dış sembolden alırız. Sonrasında yeniden derleriz. Şimdi gelin Ghidrayı bir deneyelim ve main fonsiyonunun offsetini bulalim.

Biraz bilgi :)



Sonuna kadar yess!


Analiz yapana kadar bir şarkı açalım :)

Şimdi base add"in ne olduğunu bulmamız gerekiyor. Normalde en basit yollardan birisi en üste kadar cıkalım ve bakalım ne görüyoruz.



Bu değeri not edelim ve aramaya devam edelim. Yukarıdakı kodumuzda GdiplusStartup çağrıldığını görüyoruz ve ipucumuz geldi devam edelim.



Referanslara bakım devam edelim.



Bulduk. Bu değeri base addressden cıktığımızda 1070 diye bir değer elde ediyoruz.



Bunu devam eden kodumuza ekleyelim ve devam edelim. Şimdi ise, fonsiyonumuz kaç adet input alıyor bunu belirtmemiz gerekiyor.
C:
int main(int argc, char** argv)

Bu, genellikle fonksiyonun girdi parametrelerini ve yığın (stack) yapısını doğru bir şekilde düzeltmek için gerekli olan argüman sayısını bilmeyi gerektirir.
Bu durumda, bahsettiğiniz işlevin iki argüman aldığını belirtmek gerekiyor. Bu, işlevin geri dönüşünden önce yapılan değişiklikleri doğru bir şekilde uygulamak için önemlidir.


Şimdi kodumuzu bitirdiğimize göre genel bir açıklama yapalım.
  • afl-fuzz.exe: AFL fuzzing aracının çalıştırılacağını belirtir.
  • -i C:\Users\admin\Desktop\fuzz\input: Giriş klasörünün yolu. Fuzzer, buradaki giriş dosyalarını kullanarak testler yapacak.
  • -o C:\Users\admin\Desktop\fuzz\outputs: Çıkış klasörünün yolu. Fuzzer, burada bulunan sonuçları saklayacak.
  • -D C:\Users\admin\Desktop\fuzz\DynamoRIO-Windows-10.0.0\bin64: DynamoRIO'nun yolu.
  • -t 20000: Fuzzing işleminin maksimum süresini belirtir. Bu durumda, 20.000 milisaniye (20 saniye) olarak belirlenmiş.
  • --: AFL'ye, komut satırındaki AFL parametrelerinin sona erdiğini ve bundan sonraki parametrelerin hedef programı ve argümanlarını içerdiğini belirtir.
  • -coverage_module gdiplus.dll: Kapsama bilgisini toplamak için izlenecek modülü belirtir. Bu durumda, GDI Plus kütüphanesi (gdiplus.dll) izlenecek.
  • -target_module gdiplus.exe: Hedef programın adını belirtir. Bu durumda, test edilecek program gdiplus.exe olarak belirlenmiş.
  • -target_offset 0x1070: Hedef programdaki ana fonksiyonun (main) başlangıç adresinin ofsetini belirtir. 0x1070 ofseti, ana fonksiyonun başlangıç adresini temsil eder.
  • -nargs 2: Ana fonksiyonun kaç argüman aldığını belirtir. Bu durumda, ana fonksiyonun iki argüman aldığı belirtilmiş.
  • -- C:\Users\admin\Desktop\fuzz\winafl\gdiplus.exe @@: Fuzz edilecek programın yolu ve argümanlarını belirtir. Bu komut, gdiplus.exe programını çalıştıracak ve AFL tarafından sağlanan girişlerle bu programı test edecektir. @@ sembolü, AFL tarafından otomatik olarak sağlanan giriş dosyalarını ifade eder. AFL -i seçeneğiyle belirtilen giriş klasöründe input adında bir dosya bulunuyorsa, AFL @@ sembolüyle bu dosyayı alır ve hedef programı bu dosya ile çalıştırır.
Bash:
afl-fuzz.exe -i C:\Users\admin\Desktop\fuzz\input -o C:\Users\admin\Desktop\fuzz\outputs -D C:\Users\admin\Desktop\fuzz\DynamoRIO-Windows-10.0.0\bin64 -t 20000 -- -coverage_module gdiplus.dll -target_module gdiplus.exe -target_offset 0x1070 -nargs 2 -- C:\Users\admin\Desktop\fuzz\winafl\gdiplus.exe @@

Eline sağlık guzel anlatım
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.