Son zamanlarda, istemci IP adreslerine dayalı dizinlere yetkisiz erişimi önlemek için bir tür mekanizma kullanan giderek daha fazla uygulamaya sızma testi yapıyorum. Çoğu durumda, yanlış uygulandığında bunun zayıf bir koruma yöntemi olduğu kanıtlanmıştır.
Web uygulaması sunucularına IP adreslerinin sahteciliğinin, başka herhangi bir kimlik doğrulama biçimi olmadan tam yönetim erişimine izin verdiği durumlar olmuştur.
Örneğin StackOverflow’a ne olduğuna bir göz atın: http://blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
WordPress yönetim panellerini korumada yaygın olarak kullanıldığını gördüğüm bu tür uygulamalardan biri, Apache sunucularındaki HTAccess dosyalarındaki IP adreslerini beyaz listeye almaktır. Örneğin aşağıdakileri ele alalım .htaccess
içinde bulunan dosya /wp-admin/
dizin:
#Hosting Environment IPs
SetEnvIF X-FORWARDED-FOR "68.180.194.242" AllowIP
SetEnvIF X-FORWARDED-FOR "10.0.2.11" AllowIP
#Personal Computer
SetEnvIF X-FORWARDED-FOR "98.139.134.96" AllowIP
Şimdi, web sunucunuzun yapılandırmasına bağlı olarak yukarıdaki yapılandırma tamamen işe yaramaz olabilir. Neden? Yoldan dolayı X-Forwarded-For
başlıklar işlenir.
İsteğiniz ile içeriği barındıran gerçek web sunucusu arasında bulunabilecek proxy’ler nedeniyle, X-Forwarded-For
Bağlantı kurulacak son ana bilgisayara iletilen başlık genellikle sıralı bir IP adresleri listesi içerir. Bu blog yazısında açıklandığı gibi, X-Forwarded-For
başlık şuna benzer:
X-Forwarded-For: A, B, C
A’nın müşterinin IP adresini temsil edeceği yerde, B bir ara proxy’yi temsil edecek ve C başka bir ara proxy’yi temsil edecektir.
Not: Sunucu ile istek arasındaki proxy sayısında herhangi bir sınırlama yoktur; X-Forwarded-For
virgülle ayrılmış biçimde sınırsız bir IP listesine sahip olabilir.
Yukarıda bağlantılı blog yazısında belirtildiği gibi: en soldaki IP adresi taklit edilmesi en kolay olanıdır. Uygulama sunucusunun en güvenilir IP adresini belirlemesi için vekil zincirini tersten geç. Her çerçeve veya uygulama bunu yapmaz ve deneyimlerden yola çıkarak IP adreslerini taklit edebilme şansı X-Forwarded-For
başlık yüksek.
Aslında, IP adreslerinin aynı olduğu ancak virgülle ayrılmış olduğu geniş bir IP listesi ekleyerek X-Forwarded-For
başlık, yönetim panellerindeki IP kısıtlamalarını atlarken benim için daha iyi sonuçlar verdi.
Bu blog yazısında daha önce bahsettiğim HTAccess dosyasına dönersek, bu GET isteği aracılığıyla IP kısıtlamalarının atlanmasına izin veren basit bir geçiş gösterilmiştir:
GET /wp-admin/ HTTP/1.1
Host: vulnsite.com
X-Forwarded-For: 68.180.194.242, 68.180.194.242, 68.180.194.242, 68.180.194.242
Cookie: ilikecookies=yes
Bu başlığın eklenmesiyle wp-admin dizinine tam erişim sağlandı.
Ancak bu beni başka bir sorunla karşı karşıya getirdi. Bu bir beyaz kutu testi olmasaydı muhtemelen erişim sağlamaya çalışmazdım. /wp-admin/
içeren dizin X-Forwarded-For
başlık böyle belirli bir IP adresine ayarlanmış.
403 yasaklı kaynağa erişimi IP adreslerini numaralandırarak numaralandıran böyle bir araç bulunmadığından X-Forwarded-For
Bunu yazarken başlık oluşturdum.
Bu aracı burada bulabilirsiniz: http://github.com/infosec-au/enumXFF
Tek yapmanız gereken, aşağıdaki girişi vererek aracı terminalden çalıştırmaktır:
- Denenecek sayfa (
http/https://website.com/page
) - Reddedildiğinde aldığınız yanıtın içerik uzunluğu
- Aracın denemesini istediğiniz IP aralığı
X-Forwarded-For
Araç daha sonra verilen sayfayı bir dizi IP adresiyle isteyecek ve ardından söz konusu sayfaya erişimin hala yasak olup olmadığını belirleyecektir.
python3 enumXFF.py -t http://sketchysite.com/admin -badcl 234 -r 192.168.0.0-192.168.255.255
Yukarıdaki komut istekte bulunmaya çalışacaktır http://sketchysite.com/admin
aralıktaki tüm IP adresleriyle 192.168.0.0-192.168.255.255
. Python betiği, eşzamansız HTTP isteklerinden yararlanır. requests-futures
modül olduğundan oldukça hızlı olmalıdır. Bu aracın yalnızca Python3’te çalıştığını unutmayın.
Buna ek olarak Github’daki enumXFF projesi aynı zamanda adlı bir betiği de içeriyor. generateIPs.py
. Bu, doğrudan Burp’s Intruder’a girilebilecek, virgülle ayrılmış IP adreslerinin bir listesini oluşturacaktır. Araç sizin için en iyi yol değilse Burp’s Intruder, başvurabileceğiniz güvenilir bir seçenektir.
192.168.0.0-192.168.255.255 aralığına ait IP’leri oluşturmak için aşağıdaki komutu kullanmanız gerekir:
python3 generateIPs.py -r 192.168.0.0-192.168.255.255 -o burp_xff_ips.txt
Belki gelecekte zaman izin verirse senaryomu basit bir Burp uzantısına aktarabilirim.
Bu blog gönderisini yararlı bulursanız, projeye Github’da yıldız vermekten veya tweet atmaktan/beni takip etmekten çekinmeyin @infosec_au 🙂