CTF

TryHackMe Web Fundamentals Write-Up

Merhaba. Bu yazımda TryHackMe Web Fundamentals odasının write-up’ını içerikleride Türkçeleştirerek paylaşacağım. Oda içerisinde HTTP istekleri, durum kodları ve cookieler ile ilgili bilgiler verilmekte. Oda sonunda ise mini bir CTF ile TryHackMe Web Fundamentals odasının çözümünü tamamlamış oluyoruz. Odaya Web Fundamentals buradan ulaşabilirsiniz. Ayrıca HackTheBox Academy içerisinde yer alan Web Requests labınıda tavsiye ediyorum, çok öğretici ve kaliteli bir eğitim içeriği var.

TryHackMe Web Fundamentals Write-Up

Tas 1 – Introduction and objectives

Bu kısımda oda ile ilgili kısa bilgi verilmekte.

Task 2 – How do we load websites?

  • Finding the server

Başlangıçta bir DNS isteği yapılır. DNS, bir URL alan adı (https://tryhackme.com/ gibi) ve onu bir IP adresine dönüştüren dev bir telefon defteri gibidir. Bu, insanların favori web siteleri için IP adreslerini hatırlamak zorunda olmadıkları anlamına gelir.

IP adresi, bir web sunucusu veya bilgisayarınız gibi internete bağlı her cihazı benzersiz şekilde tanımlar. Bunlar, her biri 0-255 (xxxx) olan ve sekizli (octet) olarak adlandırılan 4 grup sayıdan oluşur. Aşağıda gösterilen bir örnek 100.70.172.11’dir.

  • Loading some content

Tarayıcı, sunucunun IP adresini öğrendikten sonra, sunucudan web sayfasını isteyebilir. Bu, bir HTTP GET isteği ile yapılır. GET, farklı istek türleri olan bir HTTP fiili örneğidir. Sunucu, GET isteğine web sayfası içeriğiyle yanıt verecektir. Web sayfası JavaScript, resimler veya CSS dosyaları gibi fazladan kaynaklar yüklüyorsa, bunlar ayrı GET isteklerinde alınacaktır.

Bir web sitesini yükleyen HTTP isteklerini gösteren Wireshark içeriği (neverssl.com)

Şu anda çoğu web sitesi için bu istekler HTTPS olarak karşımıza çıkacaktır. HTTPS, HTTP’nin güvenli (şifreli) bir sürümüdür, aşağı yukarı aynı şekilde çalışır. Bu, aşağıdakiler olmadan iletişim kurmak için TLS 1.3 (normalde) şifrelemesini kullanır:

  • Diğer tarafların verileri okuyabilmesi
  • Diğer tarafların verileri değiştirebilmesi

Birinin, arkadaşınıza para göndermek için bankanıza yapılan bir isteği değiştirip değiştiremeyeceğini hayal edin. Bu felaket olur!

Web sunucusu, HTTP (S) isteklerini alan ve yanıtlayan yazılımdır. Popüler örnekler Apache, Nginx ve Microsoft’un IIS’sidir. Varsayılan olarak, HTTP 80 numaralı bağlantı noktasında ve HTTPS 443 numaralı bağlantı noktasında çalışır. Çoğu CTF, web sitelerine dayanır, bu nedenle bağlantı noktası 80 açıksa, saldırabileceğiniz ve yararlanabileceğiniz bir web sunucusu dinleme olasılığı olduğunu bilmek yararlıdır.

Web sayfasının gerçek içeriği normalde HTML , CSS ve JavaScript’in bir kombinasyonudur . HTML, sayfanın yapısını ve içeriğini tanımlar. CSS, sayfanın görünümünü değiştirmenize ve süslü görünmesine olanak tanır. JavaScript, tarayıcıda çalışan ve sayfaları etkileşimli yapmanıza veya fazladan içerik yüklemenize olanak tanıyan bir programlama dilidir.

  • What request verb is used to retrieve page content? (GET)
  • What port do web servers normally listen on? (80)
  • What’s responsible for making websites look fancy? (CSS)

Task 3 – More HTTP – Verbs and requests formats

  • Requests

Metot olarak da bilinen 9 farklı HTTP “fiili” vardır. Her birinin farklı bir işlevi vardır. GET isteklerinden daha önce bahsetmiştik, bunlar içerik almak için kullanılıyor.

POST istekleri, yorum eklemek veya oturum açmak gibi verileri bir web sunucusuna göndermek için kullanılır.

Birkaç fiil daha var, ancak bunlar çoğu web sunucusu için yaygın olarak kullanılmıyor.

Bir HTTP isteği parçalara ayrılabilir. İlk satır bir fiil ve sunucu için bir yoldur, örneğin

GET /index.html

Sonraki bölüm, web sunucusuna isteğiniz hakkında daha fazla bilgi veren başlıklardır. Daha da önemlisi, çerezler istek başlıklarında gönderilir.

Son olarak, isteğin gövdesi. POST istekleri için bu, sunucuya gönderilen içeriktir. GET istekleri için bir gövdeye izin verilir, ancak çoğunlukla sunucu tarafından göz ardı edilir.

İşte basit bir JS dosyası alan bir GET isteği örneği:

GET /main.js HTTP/1.1
Host: 192.168.170.129:8081
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Accept: */*
Referer: http://192.168.170.129:8081/
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8

Başlıklardan, isteğin ne gerçekleştirdiğini anlayabilirsiniz (Chrome version 80, from Windows 10). Bu, adli tıp ve paket yakalamalarını analiz etmek için kullanışlıdır.

  • Responses

Sunucu bir yanıtla cevap vermelidir. Yanıt, isteğe benzer bir yapı izler, ancak ilk satır bir fiil ve bir yol yerine durumu açıklar.
Durum normalde bir kod olacaktır, muhtemelen 404: Not Found.

Durum kodlarının temel bir dökümü şöyledir:

  • 100-199: Bilgi
  • 200-299: Başarılı (200 OK, bir GET için “normal” yanıttır)
  • 300-399: Yönlendirmeler (istediğiniz bilgiler başka bir yerdedir)
  • 400-499: İstemci hataları (Var olmayan bir şeyi istemek gibi yanlış bir şey yaptınız)
  • 500-599: Sunucu hataları (Sunucu denedi, ancak kendi tarafında bir şeyler ters gitti)

Bunlar hakkında daha fazla bilgiyi burada bulabilirsiniz:  https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Yanıt başlıkları çok önemli olabilir. Genellikle onları gönderen web sunucusu hakkında size bir şeyler söyleyebilirler veya daha sonra faydalı olabilecek tanımlama bilgileri verebilirler.

Yanıt (Response) ayrıca bir gövdeye sahip olacaktır. GET istekleri için bu normalde web içeriği veya JSON gibi bilgilerdir. POST istekleri için, bir durum mesajı veya benzeri olabilir.

Yukarıda gösterilen GET isteğine bir yanıt:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 28
Content-Type: application/javascript; charset=utf-8
Last-Modified: Wed, 12 Feb 2020 12:51:44 GMT
Date: Thu, 27 Feb 2020 21:47:30 GMT

console.log("Hello, World!")
  • What verb would be used for a login? (POST)
  • What verb would be used to see your bank balance once you’re logged in? (GET)
  • Does the body of a GET request matter? Yea/Nay (Nay)
  • What’s the status code for “I’m a teapot”? (418)
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
  • What status code will you get if you need to authenticate to access some content, and you’re unauthenticated? (401)

Task 4 – Cookies, tasty!

  • What are cookies?

Çerezler, tarayıcınızda depolanan küçük veri parçalarıdır. Her tarayıcı bunları ayrı olarak saklar, bu nedenle Chrome’daki çerezler Firefox’ta kullanılamaz. Çok sayıda kullanımları vardır, ancak en yaygın olanları oturum yönetimi veya reklamcılıktır (izleme çerezleri). Çerezler normalde bir sunucuya yapılan her HTTP isteğinde gönderilir.

  • Why cookies?

HTTP durumsuz olduğu için (Her istek bağımsızdır ve hiçbir durum dahili olarak izlenmez), bunu takip etmek için tanımlama bilgileri kullanılır. Sitelerin, alışveriş sepetinizde hangi öğelere sahip olduğunuz, kim olduğunuz, web sitesinde ne yaptığınız ve daha fazlası gibi verileri takip etmesine olanak tanır.

Çerezler birkaç bölüme ayrılabilir. Çerezlerin bir adı, değeri, son kullanma tarihi ve yolu vardır. İsim çerezi tanımlar, değer verinin saklandığı yerdir, son kullanma tarihi tarayıcının çerezden otomatik olarak ne zaman silineceği ve yol, çerezin hangi istekle gönderileceğini belirler. Çerezler normalde yalnızca onları ayarlayan siteye yapılan isteklerle birlikte gönderilir (Reklamcılık / izleme ile garip şeyler olur).

Sunucu normalde çerezleri ayarlayan şeydir ve bunlar yanıt başlıklarında gelir (“Set-Cookie”). Alternatif olarak, bunlar tarayıcınızın içindeki JavaScript’ten ayarlanabilir.

  • Using cookies

Bir web uygulamasında oturum açtığınızda, normalde size bir Oturum Jetonu verilir. Bu, web sunucusunun başka birinin isteklerinizi tanımlamasını sağlar. Başkasının oturum jetonunu çalmak, genellikle onu taklit etmenize izin verebilir.

  • Manuplating cookies

Tarayıcınızın geliştirici araçlarını kullanarak çerezleri görüntüleyebilir ve değiştirebilirsiniz. Firefox’ta geliştirme araçlarını F12 ile açabilirsiniz. Storage sekmesinde, web sitesinin ayarladığı çerezleri görebilirsiniz. Ayrıca, bir dakika içinde kullanışlı olacak kendi çerezlerinizi oluşturmanıza izin veren bir “+” düğmesi vardır. Bu panelde görebileceğiniz tüm çerezleri değiştirebilir, daha fazlasını ekleyebilirsiniz.

  • Alternatives – useful to know

Yavaş yavaş, bazı kullanımlar için bunun yerine LocalStorage ve SessionStorage kullanılır. Bunun benzer bir işlevi vardır, ancak varsayılan olarak HTTP istekleriyle gönderilmez. Bunlar HTML5 özellikleridir.

  • More on cookies

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

Task 5 – Mini CTF

  • Making HTTP requests

Tarayıcı olmadan da birçok şekilde HTTP istekleri yapabilirsiniz! CTF’ler için, tekrarlayan görevleri otomatikleştirmenize izin verdiği için bazen cURL veya bir programlama dili kullanmanız gerekecektir. cURL hakkında daha fazla bilgi için cURL Nedir? cURL Nasıl Kullanılır? isimli yazıma göz atın.

  • Intro to cURL

Varsayılan olarak cURL, sağladığınız URL’den GET isteklerini gerçekleştirir, örneğin:

curl https://tryhackme.com

Bu, bir GET isteğiyle tryhackme için ana sayfa içeriğini alır. CURL için komut satırı bayraklarını kullanarak, GET içeriğinden çok daha fazlasını yapabiliriz. -X bayrağı, istek türünü, örneğin -X POST’u belirtmemize izin verir. Verileri POST için –data ile belirtebilirsiniz, bu varsayılan olarak düz metin verisine dönüşür. CURL’nin tanımlama bilgilerini depolamadığını ve isteğinizle birlikte göndermek istediğiniz tanımlama bilgilerini ve değerleri manuel olarak belirtmeniz gerektiğini belirtmek gerekir. CURL’den tanımlama bilgileri göndermek istiyorsanız, bunun nasıl yapılacağına bakabilirsiniz.

Unutmayın, çerezler farklı tarayıcılar arasında paylaşılmaz (burada cURL’yi tarayıcı olarak sayıyorum).

  • Tasks

Http: // MACHINE_IP: 8081 üzerinde çalışan bir web sunucusu var. Bağlanın ve bayrakları alın! Makineyi deploy ettikten sonra bize verilen ip adresi ile CTF’i çözüp soruları cevaplayacağız.

  • GET isteği. /ctf/get yolu ile web sunucusuna bir GET isteği yapın 
  • POST isteği. /ctf/post’a “flag_please” gövdesi ile bir POST isteği yapın
  • Bir çerez alın. /ctf/getcookie için bir GET isteğinde  bulunun  ve sunucunun size verdiği çerezi kontrol edin
  • Bir çerez ayarlayın. Devtools’unuzda (veya curl ile!) “Flagpls” adında ve “flagpls” değerinde bir çerez ayarlayın ve /ctf/sendcookie’ye bir GET isteği  yapın
  • What’s the GET flag?
  • What’s the POST flag?
  • What’s the “Get a cookie” flag?
  • What’s the “Set a cookie” flag?
man curl
.
.
.
-b, --cookie <data|filename>
              (HTTP)  Pass the data to the HTTP server in the Cookie header. It is supposedly the data previously received from the server in a "Set-Cookie:" line.  The data  should be in the format "NAME1=VALUE1; NAME2=VALUE2".
.
.
.

Başka yazılarda görüşmek üzere.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

13 − 10 =

Başa dön tuşu