HTTP Başlık Analizi

Web sunucularının vermiş olduğu HTTP başlıkları incelenerek; hedef web sunucusu, uygulama altyapısı, yük dengeleme cihazları, iç IP yapılandırması gibi bir çok bilgiye ulaşılabilir. Bu bilgiler güvenlik denetimlerinde, yapılacak olan diğer saldırıları destekleme amaçlı kullanılabilmektedir.

Web sunucusunun HTTP GET, HEAD, POST, OPTIONS isteklerine verdiği yanıtlar başta olmak üzere, TRACE, CONNECT, PUT, DELETE ve ek modüllerle aktif hale gelen birden fazla isteğe verdiği yanıtlardan çeşitli bilgiler elde edebiliriz [1]. Lab ortamında fuzzing yöntemleriyle bu isteklerin belirli bölümleri değiştirilerek, web sunucusu zaafiyet analizi de gerçekleştirilebilir.

Edinilebilecek bilgi hedef sistemin, yüklü bileşenlerin, yapılandırmaların durumuna göre değişebileceğinden, tam liste olmasa da şu bilgiler elde edilebilir:

Örnek olması açısından rastgele seçilmiş bir hedef bulup çeşitli denemeler yapalım (domain uydurmadır).

$ nc -v penetrasyon.com 80
Connection to penetrasyon.com 80 port [tcp/www] succeeded!
GET / HTTP/1.1
Host: penetrasyon.com
$
Hedef web sunucusu yaptığımız isteği dikkate almayarak bağlantımızı kesti. İstemcilerin göndermiş olduğu User-Agent istek başlığını göndererek deneyelim.
$ nc -v penetrasyon.com 80
Connection to penetrasyon.com 80 port [tcp/www] succeeded!
GET / HTTP/1.1
Host: penetrasyon.com
User-Agent: Test

HTTP/1.1 200 OK
Date: Tue, 06 Dec 2011 09:32:51 GMT
Server: Apache
Last-Modified: Sat, 03 Dec 2011 07:26:18 GMT
ETag: "15ecb51-15f6e-4b32b005e7a80"
Accept-Ranges: bytes
Content-Length: 89966
Content-Type: text/html; charset=UTF-8
Set-Cookie: PCOOKIE1=677685440.20480.0000; path=/
... (devamı kesilmiştir)

Şu an isteğimize yanıt alabildik. Burada sunucu bilgisi, hedef sistem zamanı, istek yapılan dosyanın son değişiklik tarihi, içerik uzunluğu ve kullanıcıya atanan tanımlama bilgisi(Cookie) değerlerini görebiliyoruz.

Acaba isteklerimizi arttırarak, yanıt başlığı istatistiklerinden ek bilgiler elde edebilir miyiz? Bu isteği birden fazla hale getirip, verilen yanıtları karşılaştıralım.
Burada bize yardımcı olacak ufak bir script hazırlayabiliriz. Bu script, belirttiğimiz sayıda HTTP GET isteği göndererek, gelen HTTP yanıt başlıklarını daha kolay analiz edebilmemiz adına tekil hale getirip, sıralayarak sayıyor. (… |sort |uniq -c etkisi)

Hedefimize 20 istek yaptıralım ve sonuçları inceleyelim.
$ ./header_topla.py http://penetrasyon.com 20
	   20	Accept-Ranges: bytes
	   20	Connection: Keep-Alive
	   20	Content-Length: 89966
	   20	Content-Type: text/html; charset=UTF-8
	    1	Date: Tue, 06 Dec 2011 09:51:14 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:15 GMT
	    2	Date: Tue, 06 Dec 2011 09:51:16 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:17 GMT
	    3	Date: Tue, 06 Dec 2011 09:51:18 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:19 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:20 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:21 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:22 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:23 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:24 GMT
	    2	Date: Tue, 06 Dec 2011 09:51:25 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:26 GMT
	    2	Date: Tue, 06 Dec 2011 09:51:27 GMT
	    1	Date: Tue, 06 Dec 2011 09:51:28 GMT
	    5	ETag: "1164b36-15f6e-4b32b005e7a80"
	    2	ETag: "384b16-15f6e-4b32b005e7a80"
	    3	ETag: "4ccb48-15f6e-4b32b005e7a80"
	   10	ETag: "b24b25-15f6e-4b32b005e7a80"
	   20	Keep-Alive: timeout=300
	   20	Last-Modified: Sat, 03 Dec 2011 07:26:18 GMT
	   20	Server: Apache
	   10	Set-Cookie: PCOOKIE1=2741283008.20480.0000; path=/
	    5	Set-Cookie: PCOOKIE1=2892277952.20480.0000; path=/
	    3	Set-Cookie: PCOOKIE1=2925832384.20480.0000; path=/
	    2	Set-Cookie: PCOOKIE1=694462656.20480.0000; path=/

Yapılan 20 istekte de aynı şekilde yeralan HTTP yanıt başlıklarına bakalım. Accept-Ranges, Connection, Content-Length, Content-Type, Keep-Alive, Last-Modified ve Server için tüm yanıtların değeri aynı. Bunlardan 20’şer tane olması gayet normal.

Date değeri sunucunun zaman bilgisini gösteriyor. Yapılan 20 istekte bazılarının aynı olması yine normal karşılanabilir, demek ki bazı istekler aynı saniye içerisinde gerçekleşmiş. Burada dikkat edilmesi gereken, tarih/saat bilgisi diğerlerinden farklı olan bir yanıt olup olmadığıdır. Bu durumlarda hedefte bir yük dengeleme cihazı olduğu ve arkadaki en az bir sunucunun zamanının diğerlerinden farklı olduğu tespit edilebilir. Bizim için şu an bu örnekte problem gözükmüyor.

İncelemediğimiz sadece ETag ve Set-Cookie yanıt başlıkları kaldı. Dikkat ederseniz bunlardan sadece 4’er tane tekil yanıt bulunuyor.

ETag, yani HTTP entity tag değeri, istemci tarafında cache yönetimi ve tekrarlayan isteklerde mükerrer transfer yapılmasını engelleme imkanı sunuyor. Özetle istemci bu değer sayesinde sadece değişen dosyaları yeniden transfer ediyor.
Normal şartlarda yapılan 20 istekte de ETag yanıt başlığının aynı olması gerekiyor. ETag değerinin başka bir amaçla kullanılsa ve bir nedenden dolayı sürekli değişseydi, bu durumda 20 tane farklı ETag yanıt başlığı olması gerekirdi.
Farklı olması ve sadece 4 tane olması durumu bize, hedef sistemin bir yük dengeleme cihazı arkasında olması ve bu yük dengeleme cihazı arkasında 4 web sunucusu bulunması ihtimalini veriyor.

Tanımlama bilgisi kullanıcıya özel atanıyorsa, Set-Cookie HTTP yanıt başlığının, 20’sinin de birbirinden farklı olması gerekir. Eğer genel bir Cookie değeriyse, 20’sinin de aynı olması gerekir (Expire Date bölümü hariç).
Ayrıca atanan Cookie, oturum bilgisi(Session ID) olarak kullanılıyorsa, bu değerin rastgele üretilip üretilmediğini, dolayısıyla hedef sistemde tahmin edilebilir veya sıralı Cookie üretme zaafiyeti olup olmadığını kontrol edebilirdik.

Set-Cookie yanıt başlığının da ETag gibi sadece 4 farklı formda üretildiğini görüyoruz. Az önceki ETag yorumumuzun da desteğini alarak, hedef sistemin bir yük dengeleme cihazı arkasında olduğunu ve bu yük dengeleme cihazı arkasında 4 web sunucusu bulunduğunu doğruluyoruz.

Bu arada zaten dikkat ettiyseniz, PCOOKIE1 aslında F5 BIG-IP tarafından verilen standart olarak kodlanmış bir Cookie. Ve yük dengeleme cihazı arkasındaki sunucu IP adresleri sırasıyla: 192.168.100.163, 192.168.100.172, 192.168.100.174 ve 192.168.100.41.

F5 Cookie değerinin nasıl decode edilebileceği bilgisini bir önceki yazıda bulabilirsiniz.

 

Bu analizi yaptıktan sonra, istek sayımızı biraz fazlalaştırıp benzer sonuçları elde edip edemediğimize bakmamız gerekir.

$ ./header_topla.py http://penetrasyon.com 50
	   50	Accept-Ranges: bytes
	   50	Connection: Keep-Alive
	   50	Content-Length: 89966
	   50	Content-Type: text/html; charset=UTF-8
	    1	Date: Tue, 06 Dec 2011 09:53:12 GMT
	    1	Date: Tue, 06 Dec 2011 09:53:13 GMT
	    ... (bu bölüm kesilmiştir)
	    3	Date: Tue, 06 Dec 2011 09:53:55 GMT
	    2	Date: Tue, 06 Dec 2011 09:53:57 GMT
	    1	Date: Tue, 06 Dec 2011 09:53:58 GMT
	   16	ETag: "1164b36-15f6e-4b32b005e7a80"
	    8	ETag: "384b16-15f6e-4b32b005e7a80"
	   16	ETag: "4ccb48-15f6e-4b32b005e7a80"
	   10	ETag: "b24b25-15f6e-4b32b005e7a80"
	   50	Keep-Alive: timeout=300
	   50	Last-Modified: Sat, 03 Dec 2011 07:26:18 GMT
	   50	Server: Apache
	   10	Set-Cookie: PCOOKIE1=2741283008.20480.0000; path=/
	   16	Set-Cookie: PCOOKIE1=2892277952.20480.0000; path=/
	   16	Set-Cookie: PCOOKIE1=2925832384.20480.0000; path=/
	    8	Set-Cookie: PCOOKIE1=694462656.20480.0000; path=/

İstek sayımızı 50 ve üzerine çıkarttığımızda da elde edilen sonucun, yukarıdaki yorumumuzla örtüştüğünü görebilirsiniz.

Önemli bir ipucu; benzer senaryolarda yük dengeleme cihazı tarafından atanan Cookie değerlerini web denetim yazılımımıza vererek, denetim yazılımımızın sadece belirteceğimiz web sunucusunu denetlemesini sağlayabiliriz. Bu sayede yük dengeleme cihazı arkasındaki istediğimiz sunucuyu hedef tahtasına koyabiliriz. İster tek tek hepsini, ister farklı olduğunu düşündüğümüz sunucuyu Nikto vb CGI scanner veya Netsparker vb web security scanner ile de denetleyebiliriz.

 

Bu makalede, standart bir GET isteğine verilen HTTP yanıt başlıklarından ne gibi bilgiler elde edilebileceği ve elde edilen bilgilerin nasıl kullanılabileceğini örneklemeye çalıştım. Farklı istek tiplerinin kullanıldığı benzer istatistiksel çalışmalarla, standart denetimlerde elde edilen bulguların ötesine geçebilme olanağı yakalanabilir.

Yazıdaki header_topla.py dosyasını buradan indirebilirsiniz.

4 Responses to “HTTP Başlık Analizi”

  1. Elinize sağlık hocam.

  2. sevda says:

    Bilgi verici bir yazı gerçekten işime yaradı teşekkürler.

  3. Murat says:

    teşekkür ederim süper bir yazı…

  4. Hakan says:

    ellerinize sağlık usta.

Leave a Reply

Your email address will not be published. Required fields are marked *