Saturday, October 26, 2019

Kablosuz Ağ Güvenliği: Saklayamazsın! Korunman Lazım


Kritik yerlerdeki kablosuz ağlar konusunda akla gelen ilk güvenlik yaklaşımlarından birisi kablosuz ağları “görünmez” yapmaktır. Bazı ağ yöneticilerine sorarsanız; kablosuz ağın adının gizlenmesi onu saldırganların gözünde “görünmez” yapmakta ve böylece kimse “göremediği bir şeye saldıramayacağı için” kablosuz ağ güvendedir. 

Herhangi bir şeyin “görünmediği” için güvende olduğu varsayımı port kullanımı konusunda da karşımıza çıkmaktadır. Bir web uygulaması veya web servisini standart olmayan bir porttan çalıştırıldığını ve sadece bu nedenle “güvende” olduğunun varsayıldığı pek çok durumla karşılaştım.
Evet, web uygulaması denilince aklımıza önce 80 ve 443 numaralı portlar gelir. Web uygulamalarını hedef alacak bir saldırganın da öncelikle bu portlarla ilgilenmesi belli ölçüde anlamlıdır. 

Ne yazık ki saldırganların sadece bu portlara bakıp “burada bir şey yokmuş, başka IP adresine bakayım” dediği bir dünyada yaşamıyoruz. Bu nedenle gizlemenin veya saklamanın bir güvenlik unsuru olarak düşünülmesi gerçekçi değildir. 
Kablosuz ağların temel güvenlik sorunu her şeyin havadan ve her yöne gidiyor olmasıdır. Normal şartlarda kuruluş ağımıza bağlı bir Ethernet kablosunu Istanbul’da Taksim meydanına veya Ankara’da Kızılay meydanına kadar uzatıp ucunu boşta bırakmayız. Konu kablosuz ağ olunca ne yazık ki durum biraz bu şekilde gelişiyor. Bu nedenle kablosuz ağın güvenliğini sağlamak sadece “gizleyerek” mümkün olmuyor.  

Aşağıdaki ekran görüntüsünde civardaki kablosuz ağlar görülebilir. Bunların bazılarının ismi görünürken, bazılarının ismi “gizli”. İşletim sistemlerine bağlı olarak “normal” kullanıcılar bu ağları görmeyebilir ancak kuruluşunuzu hedef alacak bir saldırgan bunları görebilir. En azından o kanalda bir kablosuz ağ erişim noktasının var olduğunu görebilir. 



<length:  0> olarak görünen kablosuz ağ erişim noktaları isimlerini yayınlamayacak şekilde kurulmuştur. 


Yukarıda görülebileceği gibi bir saldırganın bu kablosuz ağ erişim noktasının adını kolayca görebilecektir. 

Kablosuz ağ erişim noktalarını kablosuz ağ ismini yayınlamayacak şekilde ayarladığımızda aslında ismin sadece kablosuz ağ erişim noktasının (wireless Access point veya Access point) tarafından gönderilen paketlerde görünmesi engellenir. Kablosuz ağ erişim noktasına bağlı bir istemci (laptop, el terminali, telefon veya tablet) olması halinde bu cihazından çıkan paketlerde erişim noktasının adı görünecektir. 
Saldırganın yapması gereken tek şey ortamı dinleyerek bir istemcinin bu kablosuz ağ erişim noktasına bağlanmasını beklemektir. 
Bu neredeyse hiç dikkat çekmeyecek bir yöntemdir ve saldırganın belli ölçüde sabırlı olmasını gerektirebilir. 
Saldırganın daha aceleci olduğu durumlarda ise kullanılan teknik “deauth” adı verilen bağlantı kesme paketlerini gönderdiğini görüyoruz. Bu durumda saldırganın amacı mevcut istemcilerin bağlantılarını kopartarak yeniden bağlanmalarını sağlamaktır. Bu bağlantı tekrar kurulurken, yine istemcinin göndereceği paketlerden kablosuz ağ erişim noktasının adını öğrenebilir. 

Kablosuz ağ erişim noktalarını tanımlayan 3 temel değer vardır; MAC adresi, erişim noktası adı (kablosuz ağ adı) ve yayın yaptığı kanal. Bu 3 değere sahip bir saldırgan kablosuz ağ erişim noktasının bir “ikizini” oluşturup “evil twin attack” (kötü kalpli ikiz) olarak adlandırılan bir saldırı gerçekleştirip istemcilerin kendine bağlanmasını sağlayabilir. 

Bu tür bir saldırıya karşı kendimizi korumak için yapabileceğimiz bazı şeyler şunlardır;
  • Kafe veya otel gibi herkese açık bir kablosuz ağa bağlanırken ilk denemede parolayı bilerek yanlış girin. Buna rağmen bağlanmanıza izin veriyorsa muhtemelen kötü niyetli bir ağ erişim noktasıyla karşı karşıyasınız.
  • "Bu ağı hatırla" veya "otomatik bağlan" gibi seçenekleri devre dışı bırakın. Bu sayede bilgisayarınız veya tabletiniz tanıdığını zannettiği bir erişim noktası bulduğunda otomatik olarak bağlanmaya çalışmayacaktır. 
  • Aynı kablosuz ağa bağlı olarak uzun süre çalışacaksanız belli aralıklarla bağlantıyı kesip yeniden bağlanmayı deneyin (önce yanlış parolayla) böylece hala doğru ağ erişim noktasına bağlı olduğunuzu teyit etmiş olursunuz.
  • Düzenli aralıklarla kuruluş içerisinde bulunan ağ erişim noktalarını tarayın (katları ve ortak alanları gezin) ve tanımadığınız, fazla veya sonradan ortaya çıkmış ağ erişim noktalarını tespit edin.
  • Kablosuz ağ trafiğinizi izleyip çok sayıda deauth paketi gönderen istemcileri tespit edecek bir mekanizma kurun. Bunun için herhangi bir şey satınalmanıza gerek yok, basit bir kaç betikle yapılabiliyor. 
  • Halka açık kablosuz ağlarda mutlaka güvendiğiniz bir VPN kullanın.

Wednesday, October 16, 2019

Sudo Zafiyeti ve Yalancı Çobanlar

“Sürüye kurtlar saldırdı!” diye bağırarak çıkagelmiş çoban bir gün köye. Koyunları için endişelenen köylüler toplanıp sürünün olduğu yere doğru koşmuşlar ve vardıklarında sürünün yerinde durduğunu ve ortada kurt falan olmadığını görmüşler. Çobana kızıp köye geri dönmüşler. Aradan birkaç hafta geçmiş çoban yine köyün girişinde belirmiş: “sürüye kurtlar saldırdı!”. Köylüler yine can havliyle koşmuşlar sürünün olduğu yere, sürü yine yerinde duruyormuş. Çobanın canı sıkılmış yine. Haftalar sonra, sürüye kurtlar gerçekten saldırdığında çoban bu sefer köylüleri bir türlü ikna edememiş kurtların sürüye gerçekten saldırdığına. 


Bu hikâyeyi hepimiz biliriz, son günlerde ortaya çıkan “Sudo zafiyeti” çığırtkanları bana nedense bunu hatırlattı. Her gün yeni bir güvenlik zafiyeti çıkıyor, bunların bir kısmı oldukça önemliyken bir bölümü göründüğü kadar tehlikeli olmayabiliyor. Çıkan zafiyetlerin ve siber saldırıların satış argümanı olarak kullanılması yalancı çoban hikayesinde olduğu gibi gerçekten önemli bir gelişme olduğunda bunun gözden kaçırılmasına neden olabilir. 

2 gündür “haber” ve “siber güvenlik uzmanları” tarafından dillendirilen SUDO zafiyeti konusunda ne sibersavascephesi.com’da bir yazı ne de gerçekten kritik zafiyetlerde yaptığımız gibi bir acil duyuru yayımladık.  Yoksa yavaşladık mı? Veya sizin güvenliğinizi eskisi kadar dert etmiyor muyuz? Kesinlikle hayır, sadece paniklemeye gerek olmadığına karar verip durduk yere ajitasyon yapıp sizi meşgul etmek istemedik. 

Nedenini anlamak için gelin zafiyeti birlikte inceleyelim ve herhangi bir zafiyet duyurusuyla karşılaştığımızda nelere bakmamız gerektiğini ortaya koyalım. 

CVE-2019-14287 numarası verilen zafiyet “Root dışında herhangi bir kullanıcı olarak komut çalıştırmasına izin verilen bir kullanıcının Root kullanıcısı olarak komut çalıştırmasına imkân vermektedir” olarak özetlenebilir. 

Böyle bakınca zafiyet ürkütücü gelebilir ama gelin ayrıntılarına bakalım. 

Öncelikle bunun standart kurulumları etkilemediğini bilmek gerekiyor. Kısaca bir Linux işletim sistemini “next, next, finish” şeklinde kurduğunuzda bu açıktan etkilenmiyor. Bunu bir kenara bırakalım ve zafiyetin ortaya çıkıp istismar edilebilmesi için yapılması gerekenlere bakalım. 
Öncelikle kullanıcıya sudo komutu kullanma yetkisi verilmesi lazım. Bunun yanında kullanıcıya başka herhangi bir kullanıcı olarak komut çalıştırma yetkisi verilmesi lazım. Son olarak da bu ayar yapılırken “root” kullanıcısı hariç herhangi bir kullanıcı olarak belirtilmiş olması lazım. Evet, bu 3 ayar yapıldıysa bu kullanıcı root kullanıcısı olarak komut çalıştırabilir. 
Herhangi bir zafiyet gördüğümde kendi kendime sorduğum birkaç soru oluyor, bunlar;
  • Bu zafiyetin etkilediği sistemler ne kadar yaygın?
  • Bu zafiyetin istismar edilmesi için gerekli olan özel şartlar var mı?
  • Zafiyeti istismar edecek saldırganın teknik becerisi hangi düzeyde olmalı?
  • Zafiyet gizlilik, bütünlük ve erişilebilirlik ilkelerinden hangilerini ne derece etkiliyor?
Bu örneği ele alarak soruları yanıtlayalım. 
  • Bu zafiyetin etkilediği sistemler ne kadar yaygın? Açıkçası pek değil. Standart Linux kurulumlarını etkilemiyor. Onun dışında bir kullanıcıya root dışında herhangi bir kullanıcı olarak komut çalıştırması için izin vermeyi gerektirecek bir durum düşünemedim, sizin bildiğiniz bir senaryo varsa paylaşmanızı rica ediyorum. Bu nedenle zafiyeti “nadir görülüyor” olarak değerlendirdim. 
  • Bu zafiyetin istismar edilmesi için gerekli olan özel şartlar var mı? Evet, ciddi ama çok ciddi konfigürasyon hataları yapılarak sistemin kullanıcı güvenliğinden tamamen mahrum biçimde kurulmuş olması gerekir. 
  • Zafiyeti istismar edecek saldırganın teknik becerisi hangi düzeyde olmalı? Gerekmiyor. Herhangi bir kullanıcı olarak komut çalıştırma yetkisine sahip kullanıcısının istediği kullanıcı adını “-1” olarak belirtmesi yetiyor. 
  • Zafiyet gizlilik, bütünlük ve erişilebilirlik ilkelerinden hangilerini ne derece etkiliyor? Bu durumda evet, zafiyet sistemin tamamen ele geçirilmesine neden olabilir. Ama unutmayın, zaten sistem üzerinde ciddi seviyede erişimi ve yetkisi olan bir kullanıcının sistemi ele geçirmesi mümkün. 
Bunları düşününce bu zafiyetin önümüzdeki dönemde CTF yarışmalarında sıkça karşımıza çıkabileceğini düşünüyorum ama gerçek hayatta pek kullanılabilir görünmüyor. Yine de içinizin rahat etmesi için Linux’ta aşağıdaki komut ile sisteminizin bu açıktan etkilenip etkilenmediğini kontrol edebilirsiniz;
grep -r 'root' /etc/sudoers /etc/sudoers.d/

Muhtemelen sonuç aşağıdakine benzer bir tabloya benzeyecek: 


Sonuçlar arasında “ALL, !root” ibaresini görmüyorsanız herhangi bir sorun yaşamazsınız. Normal güncelleme ve zafiyet yönetimi döngünüzün periyodunda SUDO yazılımını güncelleyebilirsiniz. Sonuçlarda bu çıktıyı görüyorsanız ve herhangi bir nedenle bu ayarı kullanmanız gerekiyorsa acilen güncellemeniz gerekiyor. 

İşte bu nedenle “SUDO’da Kritik Zafiyet!” ve türevi ajitasyon yapanların kervanına katılmadım. Haftalık bültenimin 10.000’den fazla üyesi ve aylık ortalama 50.000 civarında blog okuyucum nazarındaki kredimi daha önemli zafiyetlere saklamayı tercih ettim.

Wednesday, October 9, 2019

Sızma Testlerinde Python Kullanımı: BeautifulSoup Kütüphanesi



Web sayfaları sızma testleri sırasında son derece faydalı bilgiler sağlayabilir. Olası parolalar, kullanıcı adları, kurumsal projeler hakkında bilgiler ve kuruluşun sahip olması muhtemel altalanadları ve dizinler bunlardan yalnızca bazıları. 

Bu nedenle, tıpkı bir siber saldırganın yapacağı gibi, kuruluş internet sayfası dikkatlice incelenir. İnternet sayfasından kastettiğim sadece sayfanın görülen kısmı değil, kaynak kodu da dahil her şeyidir. 

Bu aşamada genellikle aradıklarımız şunlar olur; 
  • Kuruluş sayfasından bağlantı verilen adresler: Altalanadı, dizin veya farklı alanadında yürütülen projeler gibi daha kolay hedef olabilecek sayfaların tespit edilmesini sağlayabilir.
  • Sayfada geçen sektörel jargon: Altalanadı tespitinde olduğu kadar kullanıcı adı ve parola denemelerinde kullanılabilecek kelimeleri belirlemeye yardımcı olur. 
  • Sayfanın teknik yapısı: Kullanılan kütüphaneler veya Wordpress benzeri içerik yönetim sistemlerinde yapılan sitelerde yüklü olan eklentileri (plug-in) tespit edip bunlarda bulunabilecek zafiyetlerin de bizim için birer saldırı vektörü olarak değerlendirilmesi. 
  • Diğer: Geliştirme süreci hakkında veya sadece sayfaya tarayıcıda bakarak gözden kaçabilecek şeyleri görmemizi sağlayabilir. 
Kaynak kodu üzerinde durmamın nedeni aslında basit; tarayıcıda gördüğümüz haliyle internet sayfası aslında sayfanın HTML kodunun tarayıcımız tarafından yorumlan halidir. Aynı internet sayfasına farklı tarayıcılardan bağlanıldığında farklı şeyler görülmesinin temel nedeni de bu yorumlardır. 

Aşağıda fotoğraf paylaşım sitesi Flickr’ı görebilirsiniz. Bu sitenin Firefox tarayıcısı ile görüntülenmiş halidir. 

Burada ise kaynak koduna gizlenmiş “burayı okuyorsanız, eleman arıyoruz” yazısını görebilirsiniz. 

Sonuçta burası bir yazılım şirketi ve ihtiyaç duydukları çalışan profilinin bir miktar kaynak kodla ilgilenmesini beklemeleri gayet doğal. 

Sayfayı incelemek için yanınıza bir kağıt kalem alıp gördüklerinizi not etmek bir seçenek olabilir. Ancak bu oldukça yavaş ve verimsiz bir yöntem olacaktır. Onun yerine Python ile bu keşif çalışmalarını otomatize etmek işi hızlandıracaktır. 

Bunun için URLLIB ve BeautifulSoup kütüphanelerini kullanabiliriz. 

Urllib
Python ile HTTP bağlantısı kurup internet sayfasını talep etmemizi sağlayacak, kolay kullanılan bir kütüphanedir. 
Basit bir bağlantı isteği aşağıdaki gibi gönderilebilir;
Burada kullandığımız 3 satır var;
  • import urllib: Urllib kütüphanesini kodumuza dahil ediyoruz. 
  • sayfa =urllib.urlopen("http://www.alperbasaran.com"): sayfa olarak www.alperbasaran.com adresini talep ediyoruz. 
  • print sayfa.code: Talebimize gönderilen yanıtı kontrol ediyoruz (200 OK sayfaya sorunsuz bir şekilde bağlanıldığını gösteriyor)
Bu noktada kodumuzun son satırı print sayfa.read() ile değiştirip alınan cevabın görüntülenmesi sağlanabilir. Görüldüğü gibi sunucudan alınan bilgi aslında sayfanın HTML kodudur. Evet, gördüğünüz bütün o şirintoş animasyonlar aslında çirkin HTML kodlarından ibaret. 


İkinci aşamada BeautifulSoup (güzel çorba) kütüphanesini kullanarak hedef sayfada bulunan bağlantıları alacağız. Lütfen dikkat: Burada verilen kod örnekte ele alınan sayfada işe yarayabilir, farklı bir sayfada çalışmasını sağlamak için bazı ufak tefek değişiklikler yapılması gerekebilir. Ne yapmaya çalıştığımın mantığını anlatabileceğimi umuyorum, böylece özelleştirmeniz gerektiğinde nelerin değiştirilmesi gerektiği konusunda da bir fikriniz olur. 

Son halinde 3 kütüphaneden faydalanmış olacağız; urllib, BeautifulSoup ve re. 
Yukarıda gördüğümüz gibi Urllib internet sayfasına ulaşmamızı, BeautifulSoup sayfanın içeriğini ayıklamamızı ve re regular expression kullanarak ayıklama işlemini daha kolay yapmamızı sağlayacak. 
Güzel çorba (gc) BeautifulSoup işlevlerini kullanmama imkan verecek. Aslında bunun için kullandığım tek satır var “gc = BeautifulSoup(html)”

Sonrası yine oldukça basit, gc içerisinde bulduğumuz ve link olabilecek (href HTML etiketiyle belirlenmiş) kısımları ayıklıyoruz ve ekranda gösteriyoruz. 


Kodun tamamı aşağıdaki gibidir. Kodu karmaşıklaştırmamak için çalışınca verilen hatayı ortadan kaldırmak için gerekli argümanı eklemedim. 

Sonuç; alperbasaran.com sayfasındaki bağlantıları alabiliyoruz.

Herhangi bir uygulamayı test etmeniz gerektiğinde kaynak kodu görüntülemek için biraz zaman ayırmanın zararı olmayacaktır. Bu süreci otomatize edebilirseniz de zaman kazanırsınız. 


Monday, October 7, 2019

Sızma Testlerinde Python Kullanımı: Requests Kütüphanesi




“Hangi yazılım dilini öğrenmeliyim?” sorusuyla sıkça karşılaşıyorum ve genelde verdiğim cevap “tabii ki Python” oluyor. Kullanım kolaylığının yanında Özellikle web uygulaması sızma testlerinde uygulama ile aramızdaki iletişimi tam olarak anlamak önemlidir. Parolanın açık halde gönderilmesi, gizli parametreler veya sunucudan gelecek cevabın içerisinde bulabilecek ipuçları güvenlik açısından sorun oluşturabilecek noktaların tespit etmesini kolaylaştırır. 

Bu amaçla Burp Suite gibi bir Proxy kullanılabilir. Ancak, özellikle karmaşık veya çok parametreli uygulamalarda sunucuya hızlıca bir istek gönderip dönen cevabı görmek isteyebiliriz. Bunun için kolay kullanılabilecek bir Python kütüphanesi olan Requests işimize yarayabilir. 

Python Requests Nedir?
Python ile HTTP istekleri göndermeye yarayan Requests kütüphanesi başlık (header), form veya benzeri parametrelerin “insanın okuyabileceği şekilde” ayarlanmasını ve sunucudan gelen cevapların görüntülenebilmesine imkân verir. 
pip install requests ile kurulabilen kütüphane daha sone “import requests”  ile her türlü Python uygulması içerisinde kullanılabilir. 

Python Requests Nasıl Kullanılır?
Meslek icabı bu yazı elbette bir “Python öğreniyoruz” yazısı değildir, böyle bir beklentiniz varsa internette bulunan sayısız kaynağa bakmanız daha doğru olacaktır. Aşağıdakiler uygulama testleri sırasında faydalandığım kullanım şekillerinden bazılarıdır. 

Cevapların önemi
Uygulama sunucusunun çeşitli isteklere nasıl yanıtlar döndüğünü görmek uygulamanın çalışma mantığı ve sunucu konfigürasyonu hakkında bilgi edinmemizi sağlayabilir. Bu nedenle farklı türde talepler gönderip yanıtları incelemek gerekir. Sunucu ve istemci arasındaki iletişimi düzenleyen HTTP gönderdiği her cevabı bir durum kodu (HTTP Status Code) ekler. Bu kodların amacı karşıdaki sisteme isteğinin akıbeti hakkında bilgi vermektedir. 

HTTP bağlantıları kısaca aşağıdaki gibi yapılır (DNS talepler ve 3’lü el sıkışma gibi detaylar burada gösterilmemiştir). 

HTTP isteklerine ve sunucu cevaplarına ayrıntılı olarak bakacak olursak aşağıdaki bilgileri içerdiklerini görebiliriz;

HTTP isteği: 
HTTP isteğinde talep edilen alanadı (www.alperbasaran.com), talebi yapan tarayıcının bilgileri, sunucudan hangi türde cevapları kabul edebileceği, vb. bazı bilgiler görülebilir. 

HTTP cevabı: 

Sunucundan gelen cevapta çerez bilgileri, vb. görülebilir. İlk satırın sonunda yer alan “200 OK” ise sunucunun gönderilen isteğe nasıl yanıt verdiğini belirtir. 

HTTP Durum Kodları Nedir?
5 kategoride dönebilecek HTTP durum kodları aşağıdaki ana başlıklara göre sınıflandırılabilir;
  • 100’lü kodlar: Bilgilendirme amaçlı gönderilen yanıtlardır. Örn: “100 Continue”
  • 200’lü kodlar: Sunucunun isteği başarıyla yanıtladığını gösterir. Örn: “200 OK”
  • 300’lü kodlar: İsteğin başka bir adrese yönlendirildiğini gösterir. Örn: “301 Moved Permanently”
  • 400’lü kodlar: İstekte bir hata olduğunu gösterir. Örn: “404 Not Found”
  • 500’lü kodlar: Sunucu kaynaklı bir hata olduğunu gösterir. Örn: “503 Service Unavailable”
Gelen HTTP durum kodları tarayıcının yeni bir istekte bulunmasını veya hatanın kullanıcıya gösterilmesini sağlayabilir. 
Hata kodları uygulama testleri sırasında bizlere birkaç konuda bilgi verebilir:
  • Uygulamanın kullandığı sayfalar, dizinler veya altdizinler: Örn. Geçerli bir sayfa için yapılan talep “200 OK” yanıtını dönerken olmayan bir sayfa “404 Not Found” yanıtı verecektir.
  • Uygulamanın çalışma mantığı: Örn. Giriş işlemi sonrası sunucu “302 Found” kodu ile kullanıcıyı yönlendirebilir. 
  • Uygulamanın nasıl yapılandırıldığı: Örn. Talep edilen adrese eklenen özel karaktere “500 Internal Server Error” yanıtının alınması sunucunun kurulumu sırasında bazı güvenlik ayarlarının devreye alınmadığını gösterebilir. 
Uygulamayı test ederken çok sayıda talep göndermek ve sunucunun gönderdiği HTTP durum kodlarını görmek süreci hızlandırabilir. 

Python Requests ile İstek Göndermek
Kullanımı oldukça kolay olan Python Requests ile istekler aşağıdaki gibi gönderilebilir;

requests.get('http://www.alperbasaran.com/')
Görüldüğü gibi var olan bir sayfaya yapılan bir isteğin sonucu “<Response [200]>” olarak görülürken var olmayan sayfaya yapılan istek “<Response [404]>” olarak yanıtlanmıştır. 

HTTP cevaplarını Kullanmak
Sunucunun gönderdiği yanıtları daha etkin biçimde kullanabilmek için bir değişken tanımlamak işimizi kolaylaştırabilir. cevap = requests.get('http://www.alperbasaran.com/') ile sunucunun gönderdiği cevabı ekranda göstermek yerine değişken olarak saklayabilirsiniz. Aşağıdaki örnekte olduğu gibi sadece dönen HTTP kodlarını toparlayıp hangi sayfaların var olduğunu gösteren kısa bir betik geliştirilebilir.

Sunucudan gelen yanıt bir kere “cevap” olarak kaydedildikten sonra kolaylıkla işlenebilir.
Bu arada cevapta gelen HTTP durum kodunun en son gelen durum kodu olduğunu unutmamakta fayda var. Aşağıdaki örneğe bakacak olursak http://alperbasaran.com için gönderilen isteğe “200 OK” yanıtı alındığı görülebilir. Ancak cevap.history bize arada bir “301 Moved Permanently” cevabı olduğunu gösteriyor.  

Bu durumda http://www.alperbasaran.com adresine bir yönlendirme yapılmış ve yönlendirmenin sonucunda yapılan ikinci istek “200 OK” cevabı almıştır. 

Yönlendirmeleri takip etmek isteyip istemediğinizi belirtebilirsiniz. Bu durumda gönderilen isteğe “allow_redirects” parametresini ekleyerek Python Requests’in nasıl davranacağını belirleyebilirsiniz. Aşağıda görüldüğü gibi sunucudan gelen yönlendirme kodu takip edilmezse istek bir 301 koduyla sonlanmaktadır.  

HTTP Header Bilgisi
Cevap.headers ile HTTP yanıtının header (başlık) bilgisi görüntülenebilir.

Özellikle HTTP başlığında bir güvenlik cihazı tespit edilen uygulamalarda hangi sayfa veya alanadlarının bu sistem tarafından korunmadığını tespit etmekte faydalı olacaktır. Çok sayıda istek gönderecek bir döngü yazıldığında isteğin gönderildiği adresi takip etmeyi unutmamak gerekir. 

Bunun için cevap.url kullanılabilir.

HTTP İstek Türleri
Python Requests kullanılarak GET ve POST gibi farklı türlerde istekler gönderilebilir. Kullanım yukarıda anlatılanla benzer. 

Farklı türde istek göndermek için;
  • GET isteği: requests.get('http://alperbasaran.com/')
  • POST isteği: requests.post('http://alperbasaran.com/')
  • OPTIONS isteği: requests.options('http://alperbasaran.com/')
  • DELETE isteği: requests.delete('http://alperbasaran.com/')
  • PUT isteği: requests.put('http://alperbasaran.com/')

HTTP Cevap Süreleri

Gönderilen isteğe yanıtın ne kadar sürede geldiği bize uygulamanın nasıl çalıştığı ve “enumeration” denilen bilgi teyidi konularında bilgi verebilir. Yaygın olarak bulunabilecek bir durum giriş ekranın var olan bir kullanıcı adı ile var olmayan bir kullanıcı adına verdiği cevapların sürelerdir. Var olmayan bir kullanıcı giriş denemesinde sistem önce kullanıcı adının var olup olmadığını teyit edecek, varsa parolanın doğruluğunu kontrol edecektir. Bunun sonucunda var olmayan bir kullanıcı için yanıtların daha kısa sürede dönmesi muhtemeldir.

Bunun için “cevap.elapsed.total_seconds()” kullanılabilir. 

URL Parametresi Göndermek
Uygulamanın kabul ettiği parametrelerle oynamak uygulamanın hata vermesine veya davranışlarında değişikliklere neden olabilir. Bu nedenle fuzzing olarak bilinen teknik zaman kazandırabilir. Fuzzing sırasında uygulamaya önceden belirlenmiş içerikler göndererek hangilerine nasıl tepki verdiğine bakılır. Uygulama çok uzun, çok kısa, özel karakter içeren vs. beklemediği bir girdi aldığında davranışlarında (cevap süresi, cevap header bilgisi, cevap içeriği, vb.) herhangi bir farklılık varsa ilgili parametre üzerinde çalışılmaya değer gibi görünüyor. 

Örnek sayfayı ele aldığımızda arama için bir parametre girildiğinde adres çubuğunda da bu görülebilmektedir. “test” kelimesi için bir arama yaptığımızda adres çubuğunda “http://www.alperbasaran.com/search?q=test” görülebilmektedir. 

Bu durumda “q” arama parametresi olarak karşımıza çıkmaktadır. Requests kütüphanesi ile bunun gibi parametreleri içeren istekler de gönderilebilmektedir. Bunun için istek “requests.get('http://www.alperbasaran.com/search',params=b'q=siber',)” şeklinde gönderilebilir. 

Çerez Bilgilerini İşlemek
Özellikle uygulamaların giriş yapılarak erişilen bölümlerine istek gönderebilmek için çerez bilgisine ihtiyaç vardır. Bunun yanında uygulamanın farklı çerezlere nasıl tepki verdiğini anlamak bazı kullanıcı giriş mekanizmalarının atlatılmasını veya gizli işlevlerin tespit edilmesine imkân verebilir.

Aşağıdaki görüldüğü gibi DVWA (Damn Vulnerable Web Application) uygulamasının komut çalıştırma zafiyetini barındıran sayfasına istek göndermeyi denediğimizde, uygulamaya giriş yapmadığımız için, 302 durum koduyla bizi giriş sayfasına yönlendiriyor. 

İsteğe çerez değerlerini eklediğimizde ise sayfaya ulaşılabildiği görülmektedir. 
İster özel olarak geliştirilmiş EBYS, HBYS veya ERP uygulamalarını test edin, ister yaygın olarak kullanılan Wordpress veya Joomla gibi platformları özel istekler gönderip uygulamadan gelen yanıtları işleyebilmek gerekir. Requests kütüphanesi, kolay kullanımı ve iyi performansıyla işinizi kolaylaştıracaktır.