Hepinize selamlar arkadaşlar, değerli Turk Hack Team üyeleri,
Bu yazımda sizlere Basic Access Auth sitelerine Brute Force saldırısı gerçekleştiren bir program yapmayı göstereceğim. Bundan önceki konularımda da kullandığım üzere bu uygulamayı da python kullanarak hazırlayacağım. Konu hakkında her zamanki gibi epey araştırma yaptım, bir o kadar da deneme yanılma aşamalarından geçtim ve sonunda sizlere aktarma vaktinin geldiğine inanıyorum.
Bir BruteForce uygulaması yapmak zaten hep düşündüğüm bir şeydi ancak bundan önce Trojan yapma meselesi ile ilgilendiğim için yarım bırakmaya karar vermiştim, konuyu açma vakti bugüneymiş. Yalnız belirtmek isterim ki bu yazacağımız program önceki konulardaki yazdığımız Trojan?dan daha karmaşık olacak. Keza class kısmına gireceğiz ve biraz daha fonksiyonlarla haşır neşir olacağız.
Ayrıca bu bölümde olası copy-paste olaylarının önüne geçmek için daha çok TurkHackTeam?in ismine resimlerde yer vereceğim :).
Başlıklar:
- Brute Force Nedir?
- Giriş, Banner Ve Argümanlar
- Parametre İşlemleri
- Ağ Üzerinden Saldırıyı Gerçekleştirme İşlemi
- Yardım Bölümü Eklemek
- Programımızın Testi
İlk bölümden başlayalım hazırsanız.
Brute Force Nedir?
Brute Force, yani Türkçesi kaba kuvvet olan bu saldırı türünde bir sisteme girmek için olası tüm kullanıcı adı ve şifre kombinasyonları kullanılarak hedefe sızmak amaçlanmaktadır. Bu işlem için wordlist adı verilen muhtemel şifrelerin var olduğu metin dosyaları kullanılır.
Ancak artık günümüzde birçok sistem bu tür saldırıların önüne geçmek için çeşitli savunma yolları geliştirmiştir. Bu da Brute Force saldırısının etkisini bir nebze de olsa düşürmüştür. Ancak hala bu tür saldırılar işe yaramaktadır, fakat kişiye özel hazırlanan wordlistler ile başarıya ulaşmak daha mümkündür.
Giriş, Banner Ve Argümanlar
Asıl yazıya ve konumuza dönelim, bu konu boyunca sizlere bu tür uygulamaların çalışma mantığını vereceğim ve sonunda sizlere uygulamama genel bakış atmanız için genel kodları bırakacağım.
Öncelikle üzerinde çalışacağımız projeye dolibrute ismini veriyorum. Bu dosyanın içine kodlayacağız.
Dosyanın içini doldurmaya başlamadan önce hatırlatmakta fayda var, ben bu konuda çok gelişmiş değil de biraz daha basit olan bir Brute Force programı yapacağım. Ve örnek olarak da kendi modemimi, 192.168.1.1?i hackleyeceğim.
Notumu da geçtiğime göre artık başlayabiliriz.
İlk olarak klasik başlangıç kodlarımızı ekiyoruz.
Ardından ise import etmemiz gereken bazı kütüphaneleri ekleyelim.
Bu kütüphaneleri tek tek açıklamak gerekirse; requests kütüphanesi ağ üzerinden işlem yapmamızı sağlıyor, sys kütüphanesi sistem ile entegre olmamızı sağlıyor, threading ise işlemleri yaparken bazı ayarlamalar yapmamıza olanak sağlıyor. Getopt ise kısaca argümanları ayarlama konusunda bize yardımcı oluyor. Bir de son olarak colorama var, benim en sevdiğim kütüphane olabilir, bu kütüphane de programımızın daha hoş durmasını ve kullanımına göre kolaylık sağlamasına yarıyor.
Şimdi ekleyeceğimiz ilk fonksiyon banner?ımız. Her klasik hacking yazılımda olduğu gibi banner eklemezsek olmaz. Banner ne demek diye soracak olursanız da, banner programın ismini veya yapımcısını belirten logo gibi bir şey.
Banner fonksiyonumuzu ekliyoruz. Ardından ise print fonkiyonumuz ile havalı bir banner yapıyoruz.
Ardından colorama kullanarak daha hoş bir şekilde durmasını sağlıyoruz.
Şu an son olarak da deneme amaçlı banner?i çağıran fonksiyonu ekledik ve bunu çalıştırılabilir bir dosya haline getirmek için chmod kullanıyoruz.
Ardından bir seferliğine çalıştırıyoruz.
Göründüğü üzere bence şık bir banner oldu, bir ufak hata var ama onu düzeltmek ile uğraşmayacağım.
Şimdi ise programa vereceğimiz argümanları işlesin diye girmemiz gereken kodları giriyoruz. Bu __main__ gibi özellikler python?un kendi içinde zaten hazır olarak gelen özelliklerdir.
Burada yaptığımız şey aslında dolibrute.py komutundan sonra girilecek ?x gibi argümanları programa dahil etmek.
Tabi burada gördüğünüz üzere argüman isminde bir değişkeni başlat isimli bir fonksiyona yönlendirdim ancak ortada böyle bir fonksiyon yok. Bu fonksiyonu oluşturmadan önce olası akıl karışıklıklarının önüne geçmek için keyboardinterupt?lı bir try-except bloğu oluşturuyorum.
KeyboardInterrupt hatası, program çalışırken ctrl+c veya ctrl+z gibi kombinasyonların kullanımı sonucunda oluşur ve programı durdurur.
Şimdi ise bu başlat fonksiyonumuzu ekliyoruz.
Programımız başlatıldığında ilk olarak banner?ımın görünmesini istiyorum ben. O yüzden ilk olarak banner?ı çağırıyorum.
Şimdi ise sıra getopt ile programın kullanımında girilecek argümanları belirlemede.
Burada ne yaptığımı açıklamak gerekir diye düşünüyorum, getopt kütüphanesini kullanarak program ismi sonrası girilecek argümanları belirledim. K:u:d:s şeklinde yazılması gerek ki her birinin farklı bir parametre olduğunu belirtelim.
Tek tek açıklamak gerekirse:
K: Denemelerde kullanılacak username, yani kullanıcı ismidir.
U: Deneme yapılacak sitenin url adresidir.
D: Denemede kullanılacak şifrelerin yer aldığı wordlist dosyasıdır.
S: Kaç tane deneme yapılacağını belirleyen sayıdır.
Şimdiki yapmamız gereken şey parametreleri girerken bir sorun olursa bunu kullanıcıya bildirmek ve yardımcı olmak için bir try-except bloğu oluşturmaktır.
Ardından ise bu aldığımız parametreleri tek tek değişkenlere tanımlamak var. Bunun için for döngüsünü kullanacağız.
Bu tek bir örnekle zaten genel mantığı anlamışsınızdır. Tüm parametreler için bir tane elif bloğu oluşturacağız ve değerleri gireceğiz.
Bir sonraki başlığa geçelim, bir sonraki kısımda bu parametrelerin yapacağı işlemleri ayarlayacağız.
Parametre İşlemleri
Bu kısımda yukarıdaki bölümde ayarlayıp tanımladığımız parametrelerin görevlerini kodlayacağız. D parametresinin bir metin belgesini açıp okuması lazım örnek olarak.
Bunun için öncelikle dosyamızı açmak ve okumak için olan kodları giriyoruz.
Burada wordl değişkenine kullanıcının bize vermiş olduğu wordlist parametresini okuttuk. R harfi read, yani oku anlamına geliyor. Ancak bu şekilde satır satır okumaz. Onun için de gereken kodları giriyoruz.
Bu kodla da sifreler isimli bir değişkene satır satır bu şifreleri okuttuk. Fakat burada programımız çökmesin diye try-except bloğu kullanacağız. Çünkü tek bir harf yanlışı bile programın çalışmasını engelleyebilir. Veyahut da eğer ki o an o dizinde belirtilen dosya yoksa bu sefer kullanıcıya uyarı vermiş olmak için blokları giriyoruz.
Bu parametre ile işimiz şimdilik bitti. Sırada deneme sayısı için olan kısmı halletmekte.
Bunun için ben öncelikle yeni bir deneme_yap() fonksiyonu oluşturuyorum.
Burada fonksiyona özelliklerimizi de tanımladık. Bu bölümde yapacağımız işlemler eğer python temellerine hakim değilseniz biraz karmaşık gelebilir.
Öncelikle bir değişken tanımlıyoruz ve bunu global olarak ayarlıyoruz.
Evet, doli. Şimdi bunu bir liste yapıyoruz ve append ile değer ekliyoruz. Listemi boş olacağından dolayı sadece 0 eklenecek.
Ardından ise wordlistimizde kaç tane şifre olduğunu bulmak için while döngüsü kullanıyoruz.
Buradan sonra ise denenen şifrenin doğru olup olmadığını bulmak için if-else kullanıyoruz. Burada ise öncelikle bir global değişkene değer ataması yapmamız gerek. Daha doğrusu ben kendim öyle yapıyorum, siz farklı yöntemler de kullanabilirsiniz.
Burada değişkenimiz değeri aldıktan sonra yapmamız gereken bunu if yapısında kullanmak.
Şimdi ise tekrardan bir if bloğu daha açıyoruz ve threading kütüphanemizi kullanmak için uygun yere geliyoruz. Girilen deneme sayısı parametre değerinden az olduğu sürece deneme yapması için olan kodları yazıyoruz.
Burada tam olarak yaptığımız şey eğer deneme sayısı daha bitmediyse denemeye devam etmesini sağlamak. Şifre denendikten sonra ise pop() fonksiyonu ile listeden kaldırılıyor. Sonrasında ise deneme sayısı için koyduğumuz threads sayısına gelene kadar birer birer artıyor.
Tabi tekrardan deneme sırasınca durdurmak isterse kullanıcılar diye bir try-except daha koyuyorum.
Bu fonksiyonu ise öncesinde çağırmadık, bunun için de başlat fonksiyonunun sonuna bu fonksiyonu çağırıyorum.
Buradan sonra işe class yapıları dahil olacak, birazcık daha karmaşık hale gelecek yani. Ancak class?ı oluşturmadan önce olası bir durumda unutmamak için veya sorun çıkmaması için öncelikle şu an oluşturmadığımız class?ı fonksiyon içine ekliyorum.
Class?ı denemeler değişkenine atadım. Şimdi ise threading ile çalıştırma kısmına geçmek.
Buradan sonraki olan işlemleri de bir sonraki alt başlık altında anlatacağım.
Ağ Üzerinden Saldırıyı Gerçekleştirme İşlemi
Bu kısımda öncelikle request_giris olarak belirttiğimiz class?ı oluşturacağız. Ardından ise requests kütüphanesi ile denemeleri yapacağız.
Sınıf?ımızı oluşturuyoruz. İçine Thread?i ekliyoruz.
Ardından her class?larla olan çalışmalarda yaptığımız gibi bir init fonksiyonu ekliyoruz. Sonrasında ise fonksiyona gerekli verileri ekliyoruz.
Init fonksiyonlarına self de eklememiz lazım ki sağlıklı bir işlem olsun.
Şimdi ise thread olarak aldığımız veriyi self?e aktarıyoruz ki işlemlerde kolaylık sağlasın.
Ardından ise self ile birleştirdiğimiz parametleri ayarlacağız. Öncelikle şifre wordlisti ile başlayalım.
Burada ilk olarak yanlışlıkla isim olarak belirttiğim veriyi şifre olarak düzelttim daha anlaşılır olması amacıyla. Ardından ise split() ile şifreleri tek tek, satır satır olarak böldük. Bu işlem için satır atlatan ?\n? karakter dizisini kullandık. Sonra da bunu self ile tanımladığımız passwd değişkenine verdik.
Bir de diğer aldığımız verileri self ile tanımlayalım. Öncelikle username?i tanımlıyoruz.
Ardından ise url?yi tanımlıyoruz.
Bu kısma son olarak isterseniz anlık denenen şifreyi yazabiliriz. Bu front-end ile alakalı, o yüzden ben kullanıcıya güzel bir görünüm sunmak amacıyla bu kısmı ekliyorum.
Bu kısım bitti sayılır. Şimdi asıl web üzerinden saldırıyı işleme geçirmek için request?i kullanacağız. Öncelikle saldir isminde bir fonksiyon oluşturuyorum.
Ardından ise bundan önceki başlıkta global tanımladığımız tht değişkenini alıyoruz. Eğer 1 değeri varsa denenen şifre yanlış, 0 değeri varsa denenen şifre doğru olacak şekilde algoritmamızı koda döküyoruz.
Bunun için de bir if bloğu kullanacağız.
Şartı sağladığımıza göre deneme kodumuzu girebiliriz.
Evet, burada ne yaptık diye soracak olursanız; requests.get ile url?deki auth kısmını sırasıyla doldurduk. Bu arada username ile password olarak değiştirdim değişkenleri. Sonrasında bu bilgileri url?nin auth kısmında denemesini sağladık. Bu tüm işlemi de re olarak tanımladık.
Şimdi şifre denemesinin başarılı olup olmadığını nasıl bileceğiz? Bunun için HTML Status Kodlarını kullanacağız. Örnek olarak 404 veya 403 gibi kodların bir anlamları vardır. Sayfa bulunamadı veya sayfaya erişim yasak gibi.
200 kodu da siteye girişin onayı verildiği, geçin siz abicim dediği koddur. O yüzden yapacağımız şey eğer 200 kodunu alırsak tht değişkenini daha fazla deneme yapmamak adına 0 olarak ayarlamak ve programı durdurmak.
If bloğu açıyoruz ve içinde tht değişkenini 0 yapıyoruz.
Ardından ise doğru bulunan şifreyi belirtmek için bir print() açıyoruz. Sonrasında ise programdan çıkış yapıyoruz.
Şimdi bir de else ile de denenen şifre yanlış ise yanlış olduğunu yazdıralım.
Son olarak da olası bir durumda, mesela sitede başka bir sorun varsa vb. gibi durumlarda kullanıcıyı bilgilendirmek için bir try-except bloğu yazıyoruz, bu kısmın içine de ikinci if-else?i tamamen alıyoruz.
Burada öncelikle eklemeyi unuttuğum doli[] listesini ekledim. Şifre yanlış ise listeden -1 çıkaracak.
Ardından ise except içinde exception yani istisna ne olursa olsun onu hata değişkenine verdim ve olası bir sorunda ekrana o hatayı yazdırdım.
Burada işimiz şimdi bitti. Ancak kimse programı direkten kullanmaya çalışsa kullanamaz çünkü nasıl kullanıldığını bilmiyorlar.
Yardım Bölümü Eklemek
Bu kısımda ise bir yardım kısmı ekleyeceğiz.
Öncelikle yardim() fonksiyonunu oluşturalım.
Ardından nasıl kullanılacağını içine print fonksiyonları ile yazalım.
Colorama ile gayet güzel olarak görüneceğini düşündüğüm yardım kısmı hazır. Ancak asıl soru şu: Bu yardım için olan fonksiyon ne zaman çağırılacak?
Sorunun cevabı basit, eğer bir insan programın nasıl kullanılacağını bilmiyorsa veya eksik argüman girerse yardıma ihtiyacı var demektir. Bunun için yani böyle bir durum ortaya çıkarsa fonksiyonu çağıracağımız if bloğunu banner?ın altına oluşturuyoruz.
Burada araya girip muhtemel sorunuzu yanıtlandıracağım: ?Bizim 4 tane argümanımız yok mu; k, u, d ve s diye? Neden argüman sayımız 5?ten az ise bu kod çalıştırıyoruz??
Cevabı şöyle verebilirim ki, zaten dolibrute.py?nin kendisi bir argüman olarak geçiyor. Yani py ?k ?u ?d ?s diye yazdığımız bir komutu sistem 5 parametre olarak alıyor. Bu yüzden biz de bunu hesaba katarak kodları yerleştiriyoruz.
Şimdi geri kalanı halledelim.
Eveet, asıl programımızın işi burada bitti. Şimdi test aşamasına geçiyoruz.
Programımızın Testi
Evet değerli üyeler, buraya kadar bu programı kendim az çok bilgimle yaptım ancak kütüphanelerin kullanımından doğan bazı hatalar oldu ve ben şu ana kadar program tamamlanmadığından dolayı önemli hataları debugging ile düzeltemedim. Ancak şimdi kullanıma geçtiğimden dolayı hatalarımı görmeye başladım ve düzelttim. Sizlere kodlamadaki hatalarımı yazacağım, sonunda ise sizler tüm çalışan kodları düzenlersiniz.
Öncelikle düzelttiğim hataları sıralayayım:
- Import threading yerine from threading import Thread kullandım
- Denemeler ismini verdiğim değişkeni thread olarak değiştirdim
- Denemeler.join() gibi fonksiyonları Thread.join() olarak düzelttim
- Sys.argv yerine sys.arguman kullanmışım, onu düzelttim ve tüm argümanları argv yaptım
Şimdi ise çalışıyor. İşlemi gerçekleştirmek için öncelikle bir wordlist oluşturalım. Ben wl.txt olarak oluşturdum. Doğru şifreyi de 8. satıra ekledim.
Şimdi ise denememizi yapalım.
Öncelikle sadece programın ismini yazalım ve yardım menüsü gelsin.
Gördüğünüz üzere kullanım şeklini bizlere gösterdi.
Şimdi ise kodumuzu tam olarak çalıştıralım.
Göründüğü üzere 8. Denemede şifremizi bulup giriş yaptı. Ardından ise program kapandı. Yazılımımız bu kadar. Bu program ile şimdilik yapabileceklerimiz bu kadar.
Programın çalıştırdığım en sonki kodlarına genel bir bakış atmak isteyenler için kodlar: (Elimden geldiğince bugları düzelttim bu kısımda)
Pekâlâ, bir konumuzun daha sonuna geldik. Bu yazımda elimden geldiğince sizlere Basic Access Auth ile korunan sitelere brute force saldırısı uygulayacak bir program yapmayı gösterdim. Takıldığınız yerler veya merak ettiğiniz yerler olursa lütfen çekinmeden bana sorun. Kendimi daha gelişmiş bir brute force uygulaması yapacak duruma hissettiğimde onu da bu program üzerine ekleyerek geliştirip konu halinde yayınlamayı düşünüyorum. O zamana kadar benlik bu kadar.
Kendinize iyi bakın, iyi günler dilerim.
Sıfırdan Basit Brute Force Programı Yapalım
Python0 Mesaj
●86 Görüntüleme
- ReadBull.net
- Programlama ve Yazılım
- Server-Side Programlama
- Python
- Sıfırdan Basit Brute Force Programı Yapalım
-
19-12-2020, 12:54:47