Merhaba değerli dostlarım, CTF (Capture The Flag) çoğumuzun merak konusu ve gün geçtikçe popülaritesi de artmakta. Hem insanların bu alana merakı, hem başlamakta çekinenler hem de özelden aldığım sayısız mesaj neticesinde böyle bir konu/konular açmayı uygun gördüm. Ctf ile Owasp konularını bir seriye dönüştürerek, günümüzde en yaygın zafiyetleri ve bunların nasıl sömürüldüğünü Ctf çözerek öğrenmiş olacağız. Liste sıra ile değil, uygulanış biçimi olarak kolaydan zora doğru gidecektir.
Keyifli okumalar dilerim.
|
|
v
Broken Access Control
Basitçe "Broken Access Control", bir uygulamanın veya bir sistemin amaçladığı izinlerin dışında eylemlere erişilebildiği, değiştirilebildiği veya silinebildiği senaryolara verilen zafiyet ismidir.
Normal kullanıcıların bir URL'deki parametreleri değiştirerek, başka bir kullanıcının verilerini veya ayrıcalık yükseltmesini görüntüleyerek veya değiştirerek yalnızca yönetici özelliklerine erişebilmesi gibi birçok güvenlik açığı, bir "Broken Access Control" zafiyeti olarak sınıflandırılabilir.
Yaygın erişim denetimi güvenlik açıklarının içeriğine bakarsak:
URL'i, dahili uygulama durumunu, HTML sayfasını değiştirerek veya yalnızca özel bir API saldırı aracı kullanarak erişim kontrollerini atlamak
Birincil anahtarın başka birinin kullanıcı kaydıyla değiştirilmesine izin vererek, başka birinin hesabını görüntülemeye veya düzenlemeye izin vermek.
Ayrıcalığı yükseltmek, oturum açmadan kullanıcı olarak veya aktif kullanıcı olarak oturum açıldığında yönetici olarak hareket etmek.
Bir JSON Web Token (JWT) erişim kontrol belirteciyle, ayrıcalıkları yükseltmek için manipüle edilen bir cookie ile, JWT geçersiz kılmayı kötüye kullanma gibi yeniden oynatma veya meta veri manipülasyonu yöntemlerini kullanmak.
CORS yanlış yapılandırması ile yetkisiz API erişimine izin vermek.
Kimliği doğrulanmamış bir kullanıcı olarak kimliği doğrulanmış sayfalara veya standart bir kullanıcı olarak ayrıcalıklı sayfalara göz atabilmek. POST, PUT ve DELETE için erişim kontrolleri eksik olan API'ye erişmek.
Ayrıca yetki yükseltme kategorisini de ikiye ayırabiliriz;
Yatay ayrıcalık yükseltme;
bir kullanıcı bir eylemi gerçekleştirebildiğinde veya aynı izin düzeyine sahip başka bir kullanıcının verilerine eriştiğinde ortaya çıkar.
Dikey ayrıcalık yükseltme;
bir kullanıcı bir eylemi gerçekleştirebildiğinde veya rolünün ötesinde bir erişim düzeyi gerektiren verilere eriştiğinde ortaya çıkar.
"Broken Access Control", 2021 OWASP En İyi 10 web uygulaması güvenlik açıkları listesinde 5. konumdan (2017) 1. sıraya yükseldi. Erişim denetimi sorunları, web uygulamasında belirli veri parçalarının nasıl kullanıldığının anlaşılmasını gerektirdiğinden, dinamik güvenlik açığı taraması ve statik kaynak kodu inceleme araçları tarafından tipik olarak algılanamaz. Manuel test, eksik veya bozuk erişim kontrollerini tespit etmenin en iyi yoludur.
Etki & Risk
"Broken Access Control", uygulamaları genellikle gizlilik ve bütünlük kaybına neden olan bir veri ihlali riskine sokabilir. Bir saldırgan, uygulamanın kullanıcıları tarafından erişilen bilgileri çalabilir, uygulama içinde çeşitli kullanıcı rollerinin gerçekleştirebileceği eylemleri gerçekleştirerek verileri manipüle edebilir ve belirli durumlarda web sunucusunu tehlikeye atabilir. Veri manipülasyonu, uygulamanın para birimi veya maddi mallarla ilgili olması durumunda hesabın ele geçirilmesine, hırsızlığa ve uygulamanın izlediği sistemlerin/hizmetlerin kontrolüne izin verebilir. Uygulamanın doğası gereği, web sunucusuna ve altyapıya yönelik başka saldırılar da mümkün olabilir.
İstatistikleri grafikte inceleyecek olursak;
Şimdi, OWASP'tan örnek bir senaryoya bakalım;
Senaryo #1:
Uygulama, hesap bilgilerine erişen bir SQL çağrısında doğrulanmamış verileri kullanır.
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
Saldırgan, istediği hesap numarasını göndermek için tarayıcıdaki 'acct' parametresini değiştirir. Doğru şekilde doğrulanmazsa, saldırgan herhangi bir kullanıcının hesabına erişebilir.
Senaryo #2:
Saldırgan, yalnızca taramaları hedef URL'lere zorlar. Yönetici sayfasına erişim için yönetici hakları gereklidir.
Kimliği doğrulanmamış bir kullanıcı her iki sayfaya da erişebiliyorsa, bu bir kusurdur. Yönetici olmayan bir kişi yönetici sayfasına erişebiliyorsa, bu bir kusurdur.
CTF
Makalede "Broken Access Control" örneği verirken "IDOR" zafiyeti ile uğraşacağız.
Nedir bu IDOR?
IDOR, "Insecure Direct Object References" kısaltmasıdır. Kelime anlamı "Güvenli olmayan doğrudan obje referansı" olarak çevrilebilir.
Bir IDOR zafiyeti, bir saldırganın kaynaklara yetkisiz erişim elde etmesine veya bir web uygulamasında eylemler gerçekleştirmesine olanak tanır.
Bu, nesneleri (belgeler, dosyalar, veriler vb.) alırken sunucuya sağlanan istek parametrelerinin değiştirilmesiyle gerçekleştirilir.
Sunucu tarafı doğrulama eksikliği olduğunda ve talep edilen nesnenin onu isteyen kullanıcıya ait olup olmadığı doğrulanmadan bir istek tamamlandığında bu zafiyetin varlığından söz edebiliriz.
Örneğin, diyelim ki banka hesabımıza giriş yapıyoruz ve kendimizi doğru bir şekilde doğruladıktan sonra gibi bir URL'ye yönlendiriliyoruz. O sayfada tüm önemli banka detaylarımızı görebiliriz ve bir kullanıcı ne gerekiyorsa yapar ve hiçbir şeyin yanlış olmadığını düşünerek yoluna devam eder.
Ancak burada potansiyel olarak çok büyük bir sorun var, bir bilgisayar korsanı "account_number" parametresini "34" gibi başka bir şeyle değiştirebilir ve site yanlış yapılandırılmışsa, başka birinin banka bilgilerine erişebilir.
Ctf'te bu nasıl çıkabilir diye bakacağız.
Çok basit bir örnek ile;
gibi bir kullanıcı giriş sayfamız olsun. Kendi kullanıcı bilgilerimiz ile giriş yaptık.
Daha sonra, yönlendirildiğimiz sitenin adresine baktık ve burada bulunan değeri bizden bir önceki kullanıcıyı bulmak için değiştirdik.
Tabi bu "Basic" kategorisinde karşınıza çıkabilecek bir durumdur.
İsterseniz işleri biraz daha detaylandıralım.
"WebGoat" uygulamasını hiç duydunuz mu?
Şimdiki örneği bu uygulama üzerinde bulunan dersten yapacağız.
4 adet Challenge var. Beraber bunları halletmeye çalışalım.
İlk bölümde bize kullanıcı adını ve parolayı vermiş. Bu değerleri ilgili yere yazıyoruz ve etabı geçiyoruz.
İkinci etapta bizlere kullanıcıya ait birkaç bilgi vermiş.
Ancak bu bilgilerden gösterilmeyen değerlerin olduğunu söylüyor.
Bakalım arka planda neler oluyor?
"View Profile" butonuna basacağım ancak "Burpsuit" aracı ile giden isteğin arasına girmek istiyorum. Birşeyler yakalayabilecekmiyiz bakalım?
"Intercep:ON" iken butona basıyorum ve giden isteği yakalıyorum. Şimdi bunu "Repeater" bölümüne gönderiyorum.
Değiştirmeden sadece "Send" tuşuna basıyorum ve dönen cevaba bakıyorum.
Burada eksik değerleri görebiliyoruz >> "role" ve "userID"
Değerleri ilgili yere yazarak diğer etaba geçiyorum.
Bu etapta bizlerden kendi profilimize gitmek için alternatif bir URL istiyor.
Bir önceki etapta yakaladığımız istek üzerinden gerekli bilgileri alabiliriz.
Get isteğindeki "/WebGoat/IDOR/profile" yolunu aldık.
Ardından;
"Tom" kullanıcısında bulduğumuz "userID" değerini de aldık.
Bunları birleştirdik ve ilgili alana yazdık.
Diğer ve son etabımıza geçiyoruz.
Burada iki adet buton verilmiş.
Bunlar senaryo gereği bir başkasının profilini görüntülemek için kullanılacakmış. Bizden başkasının profilini görüntülerken isteğin arasına girip işlemi manipüle etmemizi istiyor.
Önce üstteki "View Profile" butonuna tıklayarak yine "Burpsuit" ile isteği yakalıyoruz.
Giden istekte "userID" değerini manipüle etmemiz gerekiyor.
Bu şekilde kullanamayız.
Bunun için basit bir Python3 kodu yazalım ve istediğimizi almaya çalışalım.
Python:
import requests
def idor():
index = 2342384 # Tom kullanıcısında bulduğumuz userID
headers = {
'Cookie': 'JSESSIONID=lZFdIhe477UFYlrytRjVijxukNFulw2LbnBz5C3X' # Burpsuit ekranından cookie'nizi alın
}
while True:
r = requests.get('http://127.0.0.1:8080/WebGoat/IDOR/profile/{}'.format(index),headers=headers)
if r.status_code != 500 and index != 2342384:
print('index:{}'.format(index))
return
index +=1
idor()
Bu kodu bir ".py" uzantılı Python dosyasına yapıştırın ve çalıştırın.
Yazdık, çalıştırdık ve sonucu aldık. Bu değer, profiline baktığımız yiğidonun "userID" değeri.
Hemen bu değeri yakaladığımız istekte yerine koyarak bu etabın ilk kısmını hallediyoruz.
Geldik ikinci kısma.
Bu kısımda ise bizden giden isteğin yolunu ve gövdeğisi değiştirerek tekrar bu kullanııya ulaşmamız istenmiş.
Burada bulduğumuz değerleri bir bütün haline getirerek, yakalanan isteğimizi değiştireceğiz.
Tekrar butona basarak yeni bir istek oluşturuyorum ve bunu yakalıyorum.
Altını çizdiğim alanları manipüle edeceğiz.
Öncelikle "GET" metodunu "PUT" yapalım.
Ardından "/%7BuserId%7D" değerini, Python scripti ile bulduğumuz değeri ile değiştiriyoruz.
"x-www-form-urlencoded" kısmını ise "json" ideğeri ile değiştirelim.
Son olarak en alta, bulduğumuz "userId" sahibi kullanıcının diğer bilgilerini yazıyoruz ve "Forward" tuşu ile yolluyoruz.
İsteği değiştirip gönderdiğimizde ise bu etabı da geçtiğimizi görebiliriz.
^
|
|
Zafiyetin ne derece tehlikeli olduğunu anlayabildik.
Hiçbir günahınız yok iken böyle bir zafiyetin bulunduğu siteye üye iseniz, her an bilgilerinizi bir başkası kontrol edebilir.
|
|
v
|
v
Bu makalemizde "Bozuk erişim kontrolleri" konusuna bir CTF ile cevap verdik. Bir sonraki makalede de bu böyle devam edecektir.
Her bir üyeye bu CTF işini çözdüreceğim inşAllah.
Takipte kalmayı unutmayın