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:
- Bilinen dosya uzantılarına yapılan rastgele isteklerle teknoloji tespiti,
- Web sunucusu iç IP bilgileri,
- Yük dengeleme cihazları ve arkasındaki web sunucu sayısı,
- Yük dengeleme cihazları arkasında farklı içeriğe sahip sunucular,
- Web sunucu tipleri ve sürüm bilgisi,
- …
Ö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$
$ 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)
$ ./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.
Elinize sağlık hocam.
Bilgi verici bir yazı gerçekten işime yaradı teşekkürler.
teşekkür ederim süper bir yazı…
ellerinize sağlık usta.