Öncelikle ağımızda bulunan cihazımızın ip adresi’nin tespiti için asena aracı yardımı ile listeliyoruz.Burada ‘192.168.43.1’ bizim default gateway adresimiz.
Ardından hedef sistemin üzerinde çalıştırdığı servis ve hizmetler hakkında bilgi almak için nmap aracı ile kısa bir tarama gerçekleştiriyoruz.
Nmap tarama sonucuna göre ‘10000’ numaralı port üzerinde bir python tabanlı simplehttpserver http servisinin hizmet sağladığı dikkatimizi çekiyor.Bunun için
verilen port numarası ve host ip adresi ile tarayıcımızdan br ziyaret gerçekleştirdiğimiz de aşağıdaki ekran görüntüsünde ki sonuç ile karşılaşıyoruz.
Ardından içerisinde barındırdığı zafiyetleri taramak için nikto aracını kullanarak bir tarama işlemi gerçekleştiriyoruz ve bize aşağıdaki gibi bir sonuç ile listeleme gerçekleştiriyor.
Sonuçlara göre /bin dizini barındırdığı ortaya çıkıyor bu dizini tarayıcımız vasıtası ile ziyaret ettiğimiz de aşağıdaki exe uzantılı dosya ile karşılaşıyoruz.
Bu exe dosyasını sistemimize indirip file komutu kullanarak dosya türüne baktığımızda 32 bit Intel syntax windows çalıştırılabilir dosyası olduğunu görüyoruz.
Ardından string komutu ile dosya içerisindeki yazdırılabilir dizeleri listeliyoruz ve aşağıdaki sonuçlara baktığımızda programın bir soket bağlantı programı olduğu anlaşılıyor.
Sonrasında programı bir windows 32 bit sanal lab’a gönderip ollydbg aracı kullanılarak buffer overflow saldırısı gerçekleştirip stack içerisine zararlı shell yerleştirip bir bağlantı gerçekleştirebilirmiyiz diye çalışıyoruz.
Bilindiği gibi buffer overflow saldırısı programın bellek düzenini öğrenip, arabelleğin(buffer) depolayamayacağı girdileri kasıtlı olarak yürütülebilir bir shell kod yazarak bellekte çalıştırır ve bunun sonucunda programın ya da uygulamanın çalıştığı sistemde denetim sahibi olunabilir.
Öncelikle sistemimiz hangi okuma biçiminde bunu öğrenmek için aşağıdaki c++ kodunu çalıştırabiliriz.
Bu kodun sonucuna göre sistemimiz little endian biçiminde okuma yapıyor bunu öğrenmek bizim için hayati önem taşımaktadır.
Aşağıdaki ekran görüntüsünde de gözüktüğü üzere programı ollydbg aracımız ile başlatıyoruz.
Ardından belleği taşırmak için aşağıdaki python socket kodu ile A argümanı’nı deneme amaçlı 550 adet gönderiyoruz, bunu gerçekleştirmemizin nedeni eğer bir buffer overflow zafiyet varsa eip register’ı üzerine gönderdiğimiz argümanı yazdırabiliriz.
Bu kodu çalıştırdığımız da hedef windows makinamızda ollydbg ile çalıştırdığımız programın üzerinde eip register’ı üzerinde nasıl bir etkisi olucak görelim.
Bunun sonucunda eip register’ının üzerine ‘A’ argümanını yazmayı başardık ve aşağıdaki gibi bir durum ile karşılaşıyoruz.
Ardından bir overflow durumu artık kesinlişti şimdi yapmamız gereken bu işlemin gerçekleştiği sınırı belirlemeye kaldı.Bunu gerçekleştirmek için aşağıdaki metasploit modulunu kullanarak 1000 byte ‘lık bir pattern oluşturuyoruz ve bunu kodumuza ekliyoruz.
Ardından sistemimizde program dosyasını tekrar yazdığımız kod ile çalıştırdıktan sonra aşağıdaki ekran görüntüsünde de olduğu gibi bir eip değeri elde ediyoruz.
Eip(İnstruction pointer) registerı üzerinde durmamızın önemi bilindiği gibi bu register çalıştırılacak bir sonraki işlemin adresini tutmaktadır yani bu register’ı manipule edersek program istediğimizi yapabilir bir konuma gelir.
Şimdi ise eip üzerine yazılmış bu değeri pattern_offsett modulu ile buffer’ın boyutunu öğreniyoruz.Bu sonuca göre buffer’ın boyutu 524 byte kadar.
Ardından bulduğumuz bu değerin ile eip üzerine 4 adet ‘B’ argümanı göndererek eip üzerine 42424242 yazılmasını bekliyoruz eğer bu işlem beklediğimiz gibi gerçekleşirse bulduğumuz değer doğrudur.
Bu işlemin sonucunda tam da beklediğimiz gibi eip üzerine ‘42424242’ yazdırmayı başardık.
Ardından badchar dediğimiz ve bir sıralama şeklinde giden karakter dizesini bulduğumuz buffer değerine ek olarak ‘\x90’(nop hiç bir işlem yapma) komutu ile beraber gönderip akışı bozan karakterleri tespit ediyoruz.
Bu sonuca göre gönderdiğimiz badchar’lardan akışı bozan bir karakter yok biz de genelde akışı bozan olarak kabul edilen ‘\x00’ karakterini ekliyerek msfvenom aracı ile bir shell code oluşturuyoruz.
Tabi önccesinde bize stack’in yönlendirilme adresi gerekli bu sayede oluşturduğumuz shell kodu eip 524 byte’dan sonra yani taşma olayından sonra stack’i adres ile döndürüp çalıştırıcaz.
Bu adresi bulmak için assembly intel syntax komutlarından olan jmp komutunun nerede esp(Stack’in üst adresini tutar) tuttuğunu öğrenip en başındaki sistemde okuma yapan little endian formatında kodumuza ekliycez.Şimdi programı ollydbg ‘da çalıştırdıktan sonra çalıştırdığı dll’ler aracılığı ile aşağıdaki adresi buluyoruz.
Bu işlemi gerçekleştirdikten sonra ise shell kodumuzu oluşturalım.
Burada msfvenom aracılığı ile windows/shell_reverse_tcp payload’ı kullanııp ayrıca badchar’ımız olan ‘\x00’ ve çalışıcağı sistem bilgisi de belirtilerek shell kodumuzu oluşturduk şimdi yaptığımız işlemleri kod üzerine aktaralım.
Oluşturduğumuz kodu çalıştırmada önce bir netcat reverse shell bağlantısı açıyoruz bu sayede shell kodumuzda belirttiğimiz cihazımızın ip adresi ve port numarası üzerinden erişim sağlamayı planlıyoruz.
Görüldüğü üzere işlemimiz windows labımız da başarılı bir şekilde gerçekleşti şimdi sırada brainpan hedef makinası var hatırlayacağınız üzere nmap taramasında 9999 numaralı port açıktı buda makina’da çalışan brainpan.exe dosyasının soket bağlantısı gerçekleştirdiği port numarası şimdi kodumuzda sadece bağlantı adresini brainpan hedef cihazının ki ile değiştirip çalıştırıyoruz.
Yukarıdaki ekran görüntüsündende anlaşılacağı üzere sızma işlemini gerçekleştirdik fakat daha henüz kabuğa erişim sağlamadık bunun için öncelikle kabuk erişimi sağlayıp daha sonrasında ise msfvenom aracılığı ile oluşturulan shell dosyasını kullanarak bir reverse bağlantısı gerçekleştirip meterpreter sahneleyicisi üzerinden yetki yükseltme işlemini tamamlıycağız.
Yukarıdaki gibi netcat bağlantısı üzerinden sistemde kabuk kısmına geçiyoruz ve bu sayede linux komutlarımızı çalıştırıp shell dosyamızı upload ediceiğiz.
Ardından aşağıdaki ekran görüntüsünde olduğu gibi msfvenom kullanılarak runme.elf adında bir shell dosyası oluşturduk elf uzantısı olmasının nedeni linux sistemlerde çalıştırılabilir dosya formatı olmasından kaynaklı.
Sonrasında ise komut satırımızda shell dosyamızın bulunduğu dizin içerisinde python ile bir httpserver açıyoruz ardından wget komutu ile bu bağlantıdan istediğimiz shell dosyasını hedef cihaza aktarıyoruz ve çalıştırma izni veriyoruz.
Sonrasında çalıştırdığımızda aşağıdaki ekran görüntüsündeki gibi dinlemekte olan multi handler modulumuzde meterpreter üzerinden bağlantı gerçekleştirdik ve kabuğa geçmek için shell komutunu kullandık.
Burada yetki yükseltme işlemi için öncelikle sudo’yu -l opsiyonu ile çalıştırıp kullanıcı ayrıcaliklerı hakkında bilgi almaya çalıştık ve sonuç olarak görüntüdeki gibi home/anansi/bin/anansi_util dosya yolunda (nopasswd) yani bir parola sorulmadan işlem yapabileceğimizi gördük.
Bunu istismar edebilmek için sudo ile bu dosya yolunu ekleyerek çalıştırdık ve aşağıdaki görüntüdeki gibi bu dosyada network komutlarını çalıştırabileceğimizi fark ettim ve python ile bir ‘tty’ üreterek manual opsiyonu ile ifconfig komutunu çalıştırdım, aksi takdirde yani bir tty üretmediğimiz de bu işlem manual çalıştırıp çıkış gerçekleştirecektir. Sonrasında ise ‘!/bin/sh’ ekleyip kabuğa root olarak erişim sağladık.