Furkan Öztürk tarafından yazılmıştır.
Merhaba değerli okurlar, bu yazımızda Directory Traversal zafiyetini ve istismarını uygulamalı olarak ele alacağız. Buyrun tanım yaparak başlayalım,
Directory Traversal, saldırganın bir web uygulaması içerisinde hassas veri barındıran dosya ve dizinlere, dizinler arası geçiş yaparak erişmesine neden olan güvenlik zafiyetidir. Bu zafiyetin sömürülmesi sonucunda web uygulamasında normal bir kullanıcının okumaması gereken dosya ve dizinler okunabilir. Bazı durumlarda ise buna ek olarak dosyalara yazma işlemi uygulanabilir. Şimdi zafiyetin çalışma mantığını anlamaya çalışarak yazımıza devam edelim.
Bir önceki başlıkta directory traversal zafiyetinin dizinler arası atlamaya sebep olduğundan bahsettik. Peki bu dizinler arası atlama olayı nedir, nasıl gerçekleşir buna bakalım.
Esasında bazı web uygulamaları Linux‘u taban alır. Bu nedenle web uygulaması dosya ve dizin sistemleriyle komutlarının linux ile birebir aynı olması doğaldır. Directory Traversal zafiyetini sömürürken de bu komutları ve dosya dizin isimlerini kullanıyoruz. Tabii ki bu zafiyet yalnızca linux tabanlı sunucularda değil windows tabanlı sunucularda da bulunabilmekte. Aradaki fark linux ve windows dosya, dizin isimlerinin birbirinden farklı olması. Ahım şahım bir fark yok anlayacağınız. Fakat biz yazı boyunca linux tabanlı sunucular üzerinden gideceğimiz için anlatımı da ona göre şekillendireceğim.
Temel Linux komutu olarak bildiğimiz “cd ..” komutunu bulunduğumuz dizinden bir önceki dizine geçiş için kullanıyoruz. Linux tabanlı web sunucularda da durum böyle. Dolayısıyla bu komutu kullanarak web uygulamasının dizinleri içerisinde gerisin geri gidebiliriz. Zafiyeti sömürürken de amacımız bulunduğumuz dizinden geri geri atlayarak kök dizine erişmektir. Bu sayede kök dizin içerisindeki hassas veri barındıran dosya ve dizinlere erişim sağlayabileceğiz. Fakat bunu yaparken bilmediğimiz bir husus var ki o da bulunduğumuz dizinden ne kadar geri gitmemiz gerektiği. Bunu bilemediğimiz için sürekli deneme-yanılma yapıp kök dizine ulaşmış mıyız diye kontrol etmek yerine web uygulamasında aynı anda çok sayıda ../ komutu çalıştırarak tek seferde daha üst dizinlere çıkabiliriz. Sonsuz .. komutu çalıştırsak dahi sonuçta kök dizinden önce bir dizin olmadığı için ulaştığımız dizin yine kök dizin olacaktır. Tabii ki yeteri kadar dizin atlama komutu çalıştırdıysak Bunun ardından kök dizin içerisinde rastgele dosya ve dizinlere erişim sağlayabilmiş olacağız.
Cd .. komutu örneği
Uzun lafın kısası birazdan da uygulamalı olarak gerçekleştireceğimiz işin mantığı, linuxta da kullandığımız komutlarla dizin atlamak ve hassas dosyalara erişmek. Şimdi teorik bilgiyi pratiğe dökelim.
İstismar adımlarını uygularken Portswigger‘daki lab üzerinden gideceğim. Ayrıca beraberinde BurpSuite yazılımını da kullanacağız. Siz dilerseniz portwigger, beebox veya herhangi bir test ortamı üzerinden işlemleri gerçekleştirebilirsiniz. Yazımın son başlığında istismar için bazı lab ortamlarını eklemiş olacağım.
Şimdi gelen giden istekleri yakalamak ve düzenleyebilmek adına Burpsuite yazılımızı çalıştıralım. Proxy ayarlarımızı yaparak portswiggerdaki lab adresine bağlanacağız.
https://portswigger.net/web-security/file-path-traversal/lab-simple
Lab ortamımızı açtıktan sonra karşımıza bazı resimler çıkıyor burada bulunan resimlerden herhangi birini yeni sekmede açıyoruz. Burada amaç, web uygulamasındaki dosyanın kaynağını request gövdesinde görmek. Ardından burpsuite yazılımı üzerinde Proxy > Intercept sekmelerinden ilerleyerek burada intercept‘i aktif hale getiriyoruz. Böylece yaptığımız istekler web uygulamasına gönderilmeden önce isteği yakalayıp düzenleyebileceğiz.
intercept is on
Sayfayı yenileyerek GET isteğinin yeniden gönderilmesini sağlıyoruz. Ve aşağıdaki gibi Intercept sayfasında yapılan GET isteğini görebiliyoruz.
GET isteği
Şimdi gelen giden istekleri tek sayfada görüntüleyebilmek için Proxy > HTTP History sayfasını açarak bulunduğumuz adresi “Send To Repeater” diyerek repeater‘a gönderiyoruz. Bu sayede istek ve web uygulamasının cevaplarını aynı sayfada göreceğiz.
send to repeater
Repeater sekmesini açtığımızda aşağıdaki gibi bir GET isteğinin bizi beklediğini görüyoruz.
GET isteği – 2
“Send” butonuna tıklayarak isteği web uygulamasına gönderelim. Aşağıdaki gibi bir dönüt alacağız
send to request
Buraya kadar her şey tamam. Asıl olay bundan sonra başlayacak. Az önceki Request gövdesinde aşağıdaki gibi bir ifade var.
GET /image?filename=37.jpg HTTP /1.1
Directory Traversal zafiyetini arayacağımız ifade de bu aslında. Burada web uygulamasının belirttiği bir yol var;”37.jpg”. biz bu yolu değiştirerek web uygulamasının dosya ve dizinleri arasında gezinebilir miyiz bunu öğrenmek istiyoruz. Bu nedenle kendi istediğimiz yolu belirtmek için istek gövdesinden “37.jpg” yazan yeri siliyoruz. Ardından daha önceki başlıklarda da öğrendiğimiz gibi hassas dosyalara erişmek için dizin atlama gerçekleştireceğiz. Bu sebeple yeterli olduğunu düşündüğüm kadar ../ belirtip yolun sonunda /etc/passwd dosyasını belirterek sistemdeki hassas bir veriye erişmeye çalışalım.
GET /image?filename=../../../../../etc/passwd HTTP /1.1
düzenlenmiş request
Yukarıdaki isteği “Send” butonuna tıklayarak web uygulamasına gönderdiğimizde Boom! Response sekmesinde /etc/passwd dosyasının içeriğini görüyoruz.
dosya içeriği
İstismarı uyguladığımız lab basic düzeydeydi. Web geliştiriciler zafiyet tespiti yapılmasının önüne geçmek maksadıyla bazı karakterlere filtre koyabilir. Örneğin “../” öbeğine bir filtre koyarak saldırganın dizin atlamasının önüne geçmeye çalışabilirler. Fakat yine de bu bir önlem sayılmaz. Çünkü saldırgan, istismarını bu filtreye göre şekillendirerek de gerçekleştirebilir. Örneğin, / karakterini URL encode etmek gibi. (Örn: / = %2F) Burada ne yapılacağı tamamen geliştiricinin koyduğu filtreye ve saldırganın bu filtreye karşılık gönderdiği istekte nasıl bir dönüştürme işlemi yapacağına göre değişecektir.
Genel itibariyle zafiyetin tespiti ve istismarı bu şekilde.
Bu başlığımızda yukarıda bahsettiğimiz manuel zafiyet tespitine alternatif olarak directory traversal zafiyetinin otomatize ve hızlı bir biçimde nasıl tespit edileceğini işleyeceğiz. Elbette bu araç zafiyet tespiti için olmazsa olmaz değil. Biz zaten yukarıda zafiyet tespitinin nasıl yapıldığından bahsettik. Yine de dileyenler bu araçla da tespit yapabilirler. Kullanacağımız aracın adı “dotdotpwn“.
Bu araç, bahse konu web uygulamasında directory traversal zafiyetini ararken manuel olarak yaptığımız encoding‘i otomatize ve hızlı bir şekilde yapmamızı sağlar. Fazla uzatmadan uygulamalı bir şekilde aracın kullanımını görelim. komut satırına “dotdotpwn” yazdığımızda aşağıdaki gibi bir ekranla karşılaşacağız.
dotdotpwn
Burada aracı bazı opsiyonları kullanarak çalıştırmamız gerek. Biz yalnızca -m ve -h opsiyonlarını kullanarak devam edeceğiz. Diğer opsiyonların kullanımı araç içerisinde belirtilmiş siz saldırı senaryosuna göre diğer opsiyonları da kullanabilirsiniz. Burada -m opsiyonu ile HTTP ve -h opsiyonu ile de zafiyet taraması yapacağımız adresi belirteceğiz. Girdimiz aşağıdaki gibi olacak
dotdotpwn -m HTTP -h tarama_yapilacak_adres
dotdotpwn girdi
yukarıdaki girdiyi komut satırımıza yazarak devam ediyoruz. Araç çalışmaya başladığında taramanın başlaması için bizden aşağıdaki gibi “enter” tuşuna basmamızı istiyor. Enter diyerek devam ediyoruz
dotdotpwn – 2
Taramayı başlattık ve zafiyeti farklı encoding yöntemleri kullanarak bulmaya başladı. Tarama için kullandığım makine basic olduğu için oldukça fazla buldu gerçek senaryolarda bu kadar fazla bulmayacaktır. Yeterli olduğunu düşündüğüm bir anda taramayı durduruyorum.
Tarama Sonucu
Artık zafiyetin bulunduğu yöntemlerden birini kullanarak istismar işlemini gerçekleştirebiliriz.
Önceki başlıkta bahsettiğimiz gibi saldırganın zafiyet taraması esnasında kullandığı karakterlere filtre koymak bir çözüm olmayabilir. Bunun için özel olarak hazırlanmış güvenlik setlerini kullanmak web uygulamasının yararına olacaktır. Bu sebeple, ModSecurity gibi güvenlik duvarları içerisinde bulunan setler yardımıyla zafiyet engellenebilir.
Yazımı burada noktalıyorum. Bir sonraki yazımızda görüşmek dileğiyle…
[TR] Directory Traversal Zafiyeti Ve Zafiyetin İstismarı
Merhaba değerli okurlar, bu yazımızda Directory Traversal zafiyetini ve istismarını uygulamalı olarak ele alacağız. Buyrun tanım yaparak başlayalım,
DIRECTORY TRAVERSAL ZAFİYETİ NEDİR ?
Directory Traversal, saldırganın bir web uygulaması içerisinde hassas veri barındıran dosya ve dizinlere, dizinler arası geçiş yaparak erişmesine neden olan güvenlik zafiyetidir. Bu zafiyetin sömürülmesi sonucunda web uygulamasında normal bir kullanıcının okumaması gereken dosya ve dizinler okunabilir. Bazı durumlarda ise buna ek olarak dosyalara yazma işlemi uygulanabilir. Şimdi zafiyetin çalışma mantığını anlamaya çalışarak yazımıza devam edelim.
DIRECTORY TRAVERSAL ZAFİYETİNİN ÇALIŞMA MANTIĞI
Bir önceki başlıkta directory traversal zafiyetinin dizinler arası atlamaya sebep olduğundan bahsettik. Peki bu dizinler arası atlama olayı nedir, nasıl gerçekleşir buna bakalım.
Esasında bazı web uygulamaları Linux‘u taban alır. Bu nedenle web uygulaması dosya ve dizin sistemleriyle komutlarının linux ile birebir aynı olması doğaldır. Directory Traversal zafiyetini sömürürken de bu komutları ve dosya dizin isimlerini kullanıyoruz. Tabii ki bu zafiyet yalnızca linux tabanlı sunucularda değil windows tabanlı sunucularda da bulunabilmekte. Aradaki fark linux ve windows dosya, dizin isimlerinin birbirinden farklı olması. Ahım şahım bir fark yok anlayacağınız. Fakat biz yazı boyunca linux tabanlı sunucular üzerinden gideceğimiz için anlatımı da ona göre şekillendireceğim.
Temel Linux komutu olarak bildiğimiz “cd ..” komutunu bulunduğumuz dizinden bir önceki dizine geçiş için kullanıyoruz. Linux tabanlı web sunucularda da durum böyle. Dolayısıyla bu komutu kullanarak web uygulamasının dizinleri içerisinde gerisin geri gidebiliriz. Zafiyeti sömürürken de amacımız bulunduğumuz dizinden geri geri atlayarak kök dizine erişmektir. Bu sayede kök dizin içerisindeki hassas veri barındıran dosya ve dizinlere erişim sağlayabileceğiz. Fakat bunu yaparken bilmediğimiz bir husus var ki o da bulunduğumuz dizinden ne kadar geri gitmemiz gerektiği. Bunu bilemediğimiz için sürekli deneme-yanılma yapıp kök dizine ulaşmış mıyız diye kontrol etmek yerine web uygulamasında aynı anda çok sayıda ../ komutu çalıştırarak tek seferde daha üst dizinlere çıkabiliriz. Sonsuz .. komutu çalıştırsak dahi sonuçta kök dizinden önce bir dizin olmadığı için ulaştığımız dizin yine kök dizin olacaktır. Tabii ki yeteri kadar dizin atlama komutu çalıştırdıysak Bunun ardından kök dizin içerisinde rastgele dosya ve dizinlere erişim sağlayabilmiş olacağız.
Cd .. komutu örneği
Uzun lafın kısası birazdan da uygulamalı olarak gerçekleştireceğimiz işin mantığı, linuxta da kullandığımız komutlarla dizin atlamak ve hassas dosyalara erişmek. Şimdi teorik bilgiyi pratiğe dökelim.
DIRECTORY TRAVERSAL ZAFİYETİNİN İSTİSMARI
İstismar adımlarını uygularken Portswigger‘daki lab üzerinden gideceğim. Ayrıca beraberinde BurpSuite yazılımını da kullanacağız. Siz dilerseniz portwigger, beebox veya herhangi bir test ortamı üzerinden işlemleri gerçekleştirebilirsiniz. Yazımın son başlığında istismar için bazı lab ortamlarını eklemiş olacağım.
Şimdi gelen giden istekleri yakalamak ve düzenleyebilmek adına Burpsuite yazılımızı çalıştıralım. Proxy ayarlarımızı yaparak portswiggerdaki lab adresine bağlanacağız.
https://portswigger.net/web-security/file-path-traversal/lab-simple
Lab ortamımızı açtıktan sonra karşımıza bazı resimler çıkıyor burada bulunan resimlerden herhangi birini yeni sekmede açıyoruz. Burada amaç, web uygulamasındaki dosyanın kaynağını request gövdesinde görmek. Ardından burpsuite yazılımı üzerinde Proxy > Intercept sekmelerinden ilerleyerek burada intercept‘i aktif hale getiriyoruz. Böylece yaptığımız istekler web uygulamasına gönderilmeden önce isteği yakalayıp düzenleyebileceğiz.
intercept is on
Sayfayı yenileyerek GET isteğinin yeniden gönderilmesini sağlıyoruz. Ve aşağıdaki gibi Intercept sayfasında yapılan GET isteğini görebiliyoruz.
GET isteği
Şimdi gelen giden istekleri tek sayfada görüntüleyebilmek için Proxy > HTTP History sayfasını açarak bulunduğumuz adresi “Send To Repeater” diyerek repeater‘a gönderiyoruz. Bu sayede istek ve web uygulamasının cevaplarını aynı sayfada göreceğiz.
send to repeater
Repeater sekmesini açtığımızda aşağıdaki gibi bir GET isteğinin bizi beklediğini görüyoruz.
GET isteği – 2
“Send” butonuna tıklayarak isteği web uygulamasına gönderelim. Aşağıdaki gibi bir dönüt alacağız
send to request
Buraya kadar her şey tamam. Asıl olay bundan sonra başlayacak. Az önceki Request gövdesinde aşağıdaki gibi bir ifade var.
GET /image?filename=37.jpg HTTP /1.1
Directory Traversal zafiyetini arayacağımız ifade de bu aslında. Burada web uygulamasının belirttiği bir yol var;”37.jpg”. biz bu yolu değiştirerek web uygulamasının dosya ve dizinleri arasında gezinebilir miyiz bunu öğrenmek istiyoruz. Bu nedenle kendi istediğimiz yolu belirtmek için istek gövdesinden “37.jpg” yazan yeri siliyoruz. Ardından daha önceki başlıklarda da öğrendiğimiz gibi hassas dosyalara erişmek için dizin atlama gerçekleştireceğiz. Bu sebeple yeterli olduğunu düşündüğüm kadar ../ belirtip yolun sonunda /etc/passwd dosyasını belirterek sistemdeki hassas bir veriye erişmeye çalışalım.
GET /image?filename=../../../../../etc/passwd HTTP /1.1
düzenlenmiş request
Yukarıdaki isteği “Send” butonuna tıklayarak web uygulamasına gönderdiğimizde Boom! Response sekmesinde /etc/passwd dosyasının içeriğini görüyoruz.
dosya içeriği
İstismarı uyguladığımız lab basic düzeydeydi. Web geliştiriciler zafiyet tespiti yapılmasının önüne geçmek maksadıyla bazı karakterlere filtre koyabilir. Örneğin “../” öbeğine bir filtre koyarak saldırganın dizin atlamasının önüne geçmeye çalışabilirler. Fakat yine de bu bir önlem sayılmaz. Çünkü saldırgan, istismarını bu filtreye göre şekillendirerek de gerçekleştirebilir. Örneğin, / karakterini URL encode etmek gibi. (Örn: / = %2F) Burada ne yapılacağı tamamen geliştiricinin koyduğu filtreye ve saldırganın bu filtreye karşılık gönderdiği istekte nasıl bir dönüştürme işlemi yapacağına göre değişecektir.
Genel itibariyle zafiyetin tespiti ve istismarı bu şekilde.
ZAFİYET TESPİTİNDE OTOMATİZE ARAÇLAR KULLANMAK
Bu başlığımızda yukarıda bahsettiğimiz manuel zafiyet tespitine alternatif olarak directory traversal zafiyetinin otomatize ve hızlı bir biçimde nasıl tespit edileceğini işleyeceğiz. Elbette bu araç zafiyet tespiti için olmazsa olmaz değil. Biz zaten yukarıda zafiyet tespitinin nasıl yapıldığından bahsettik. Yine de dileyenler bu araçla da tespit yapabilirler. Kullanacağımız aracın adı “dotdotpwn“.
Bu araç, bahse konu web uygulamasında directory traversal zafiyetini ararken manuel olarak yaptığımız encoding‘i otomatize ve hızlı bir şekilde yapmamızı sağlar. Fazla uzatmadan uygulamalı bir şekilde aracın kullanımını görelim. komut satırına “dotdotpwn” yazdığımızda aşağıdaki gibi bir ekranla karşılaşacağız.
dotdotpwn
Burada aracı bazı opsiyonları kullanarak çalıştırmamız gerek. Biz yalnızca -m ve -h opsiyonlarını kullanarak devam edeceğiz. Diğer opsiyonların kullanımı araç içerisinde belirtilmiş siz saldırı senaryosuna göre diğer opsiyonları da kullanabilirsiniz. Burada -m opsiyonu ile HTTP ve -h opsiyonu ile de zafiyet taraması yapacağımız adresi belirteceğiz. Girdimiz aşağıdaki gibi olacak
dotdotpwn -m HTTP -h tarama_yapilacak_adres
dotdotpwn girdi
yukarıdaki girdiyi komut satırımıza yazarak devam ediyoruz. Araç çalışmaya başladığında taramanın başlaması için bizden aşağıdaki gibi “enter” tuşuna basmamızı istiyor. Enter diyerek devam ediyoruz
dotdotpwn – 2
Taramayı başlattık ve zafiyeti farklı encoding yöntemleri kullanarak bulmaya başladı. Tarama için kullandığım makine basic olduğu için oldukça fazla buldu gerçek senaryolarda bu kadar fazla bulmayacaktır. Yeterli olduğunu düşündüğüm bir anda taramayı durduruyorum.
Tarama Sonucu
Artık zafiyetin bulunduğu yöntemlerden birini kullanarak istismar işlemini gerçekleştirebiliriz.
DIRECTORY TRAVERSAL ZAFİYETİNİ ENGELLEME
Önceki başlıkta bahsettiğimiz gibi saldırganın zafiyet taraması esnasında kullandığı karakterlere filtre koymak bir çözüm olmayabilir. Bunun için özel olarak hazırlanmış güvenlik setlerini kullanmak web uygulamasının yararına olacaktır. Bu sebeple, ModSecurity gibi güvenlik duvarları içerisinde bulunan setler yardımıyla zafiyet engellenebilir.
PRATİK ÇALIŞMALARI İÇİN ÖRNEK SENARYOLAR
- https://portswigger.net/web-security/file-path-traversal/lab-simple
- https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass
- https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively
- https://portswigger.net/web-security/file-path-traversal/lab-superfluous-url-decode
- https://portswigger.net/web-security/file-path-traversal/lab-validate-start-of-path
- https://portswigger.net/web-securit.../lab-validate-file-extension-null-byte-bypass
Yazımı burada noktalıyorum. Bir sonraki yazımızda görüşmek dileğiyle…
Moderatör tarafında düzenlendi: