HyperText Transfer Protocol (HTTP)
HyperText Transfer Protocol (HTTP)
Günümüzde kullandığımız uygulamaların büyük çoğunluğu — hem web hem de mobil uygulamalar — sürekli olarak internetle etkileşim hâlindedir. İnternet üzerindeki iletişimin büyük kısmı, HTTP protokolü üzerinden yapılan web istekleriyle gerçekleşir.
HTTP, World Wide Web üzerindeki kaynaklara erişmek için kullanılan uygulama katmanı (application-level) bir protokoldür. “Hypertext” terimi; başka kaynaklara bağlantılar (linkler) içeren ve okuyucuların kolayca yorumlayabildiği metinleri ifade eder.
HTTP iletişimi, bir client (istemci) ve bir server (sunucu) arasında gerçekleşir. Client, bir kaynağı talep eder; server bu isteği işler ve istenen kaynağı geri döndürür.
HTTP iletişimi için varsayılan port 80 ’dir. Ancak bu, web sunucusunun yapılandırmasına bağlı olarak başka bir port ile değiştirilebilir. İnternette farklı web sitelerini ziyaret ederken kullandığımız istekler de aslında bu HTTP istekleridir. İstediğimiz web sitesine ulaşmak için bir Fully Qualified Domain Name (FQDN) ’i, bir Uniform Resource Locator (URL) olarak gireriz. Örneğin: www.hackthebox.com
URL
HTTP üzerinden erişilen kaynaklara, bir URL aracılığıyla ulaşılır. URL yalnızca ziyaret etmek istediğimiz bir web sitesini belirtmekten çok daha fazla bilgi içerir.
Şimdi bir URL’nin yapısına bakalım:

Her bir bileşenin anlamı

Tüm bileşenler bir kaynağa erişmek için zorunlu değildir. Zorunlu olan temel alanlar yalnızca scheme ve host ’tur . Bunlar olmadan isteğin erişeceği bir kaynak tanımlanamaz.
HTTP Flow

Yukarıdaki diyagram, bir HTTP request ’in yapısını çok yüksek seviyede göstermektedir. Bir kullanıcı tarayıcıya ilk kez bir URL (örneğin inlanefreight.com ) girdiğinde, tarayıcı domain’i çözümlemek ve IP adresini almak için bir DNS (Domain Name System) sunucusuna istek gönderir.
DNS sunucusu, inlanefreight.com alan adına karşılık gelen IP address ’i bulur ve geri döndürür. Tüm domain isimlerinin bu şekilde çözümlenmesi gerekir; çünkü bir sunucu IP address olmadan iletişim kuramaz .
Not: Tarayıcılar genellikle önce yerel /etc/hosts dosyasındaki kayıtları kontrol eder. Eğer istenen domain burada bulunmazsa, diğer DNS sunucularıyla iletişime geçer. /etc/hosts dosyasına IP adresi ve domain adını ekleyerek DNS çözümlemesini manuel olarak yapabiliriz.
Tarayıcı, istenen domain’e bağlı IP adresini aldıktan sonra, varsayılan HTTP portu olan 80 üzerinden, kök dizin ( / ) için bir GET request gönderir. Web server bu isteği alır ve işler. Varsayılan olarak, sunucular / için yapılan isteklere bir index dosyası döndürecek şekilde yapılandırılmıştır.
Bu durumda, index.html dosyasının içeriği okunur ve web server tarafından bir HTTP response olarak geri gönderilir. Response ayrıca bir status code içerir (örneğin 200 OK ), bu da isteğin başarıyla işlendiğini gösterir. Web browser, index.html içeriğini render eder ve kullanıcıya gösterir.
Not: Bu modül ağırlıklı olarak HTTP web request’lerine odaklanmaktadır. HTML ve web uygulamaları hakkında daha fazla bilgi için Introduction to Web Applications modülüne bakabilirsiniz.
cURL
Bu modülde, bir web penetration tester için en önemli iki araçtan biri olan Web Browser (Chrome veya Firefox gibi) ve cURL command-line tool kullanılarak web request’ler gönderilecektir.
cURL (client URL) , başta HTTP olmak üzere birçok protokolü destekleyen bir command-line tool ve kütüphanedir . Bu özelliği sayesinde script yazımı ve otomasyon için oldukça uygundur. Ayrıca command line üzerinden farklı türde web request’leri göndermeye imkân tanır ki bu, pek çok web penetration test senaryosu için kritik öneme sahiptir.
cURL kullanarak herhangi bir URL’ye temel bir HTTP request şu şekilde gönderilebilir:
songül@htb[/htb]$ curl inlanefreight.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...cURL’un, bir web browser’ın aksine HTML / JavaScript / CSS kodlarını render etmediğini , bunun yerine içeriği ham (raw) formatta ekrana bastığını görürüz. Ancak bir penetration tester olarak bizi esas ilgilendiren şey, request ve response bağlamıdır. Bu da çoğu zaman bir web browser kullanmaya kıyasla çok daha hızlı ve pratik olur.
cURL’u bir sayfayı veya dosyayı indirip çıktıyı bir dosyaya yazmak için de kullanabiliriz. Bunun için -O parametresi kullanılır. Eğer çıktı dosyasının adını kendimiz belirlemek istersek -o parametresiyle dosya adını belirtiriz. Aksi hâlde -O kullanıldığında, cURL uzaktaki dosya adını otomatik olarak kullanır. Örneğin:
curl -O inlanefreight.com/index.html
ls
index.htmlGörüldüğü üzere, çıktı bu sefer ekrana basılmadı; bunun yerine index.html dosyasına kaydedildi. Ancak cURL’un, request işlenirken bazı durum bilgilerini (status) hâlâ ekrana bastığını fark ederiz. Bu çıktıları -s (silent) parametresiyle kapatabiliriz:
curl -s -O inlanefreight.com/index.htmlBu sefer cURL hiçbir şey yazdırmadı; çünkü çıktı doğrudan index.html dosyasına kaydedildi.
Son olarak, cURL ile kullanılabilecek diğer seçenekleri görmek için -h parametresini kullanabiliriz:
curl -h
Çıktı örneği:
Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkativeBu yardım menüsü tam liste değildir ; kategorilere ayrılmış, kısaltılmış bir çıktıdır. Tüm kategorilerin özetini görmek için --help category , tüm seçenekleri görmek için --help all parametresi kullanılabilir.
Daha detaylı dokümantasyon gerektiğinde ise:
man curlkomutu ile tam cURL manual sayfası görüntülenebilir.
Sorular
Aşağıdaki soruyu/soruları cevaplayarak bu bölümü tamamla ve cube kazan!
Target: 94.237.61.202:42926 Life Left: 89 dakika
Soru
Flag’i almak için , yukarıdaki alıştırmayı başlat ve ardından cURL kullanarak , belirtilen sunucuda bulunan /download.php endpoint’inin döndürdüğü dosyayı indir.
önce curl ile dosyayı çekip cat komutu ile okuyunca flagı buldum








