PEN-200

Identifying and Exploiting Directory Traversals | PEN-200

Merhaba. Offensive Security tarafında yer alan “PEN-200: Penetration Testing with Kali Linux” sertifika eğitimi yazı serisinin on sekizinci yazısı olan “Identifying and Exploiting Directory Traversals” konusunu ele alacağım. 

Directory Traversal saldırıları, bir web sunucusundaki hassas dosyalara erişmek için kullanılabilir ve genellikle bir web uygulaması kullanıcı girişini temizlemediğinde meydana gelir. Bir web uygulamasının belirli bir sayfayı göstermesi için, bir web sunucusu dosyayı dosya sisteminden sağlar. Bu dosyalar web kök dizininde veya alt dizinlerinden birinde bulunabilir. Linux sistemlerinde /var/www/html/ dizini genellikle web kökü olarak kullanılır. Bir web uygulaması örneğin http://example.com/file.html gibi bir sayfayı görüntülediğinde, /var/www/html/file.html‘ye erişmeye çalışacaktır. Web kökü aynı zamanda bir web sunucusu için temel dizin görevi gördüğünden, http bağlantısı dosya adı dışında yolun herhangi bir bölümünü içermez. Bir web uygulaması dizin geçişine karşı savunmasızsa, kullanıcı göreceli yolları kullanarak web kökü dışındaki dosyalara erişebilir ve böylece SSH özel anahtarları veya yapılandırma dosyaları gibi hassas dosyalara erişebilir.

Directory Traversal güvenlik açıklarından nasıl yararlanılacağını anlamak önemli olsa da bunları tanımlayabilmemiz de çok önemlidir. Her zaman tüm düğmelerin üzerine gelerek, tüm bağlantıları kontrol ederek, erişilebilir tüm sayfalara giderek ve (mümkünse) sayfanın kaynak kodunu inceleyerek güvenlik açıklarını kontrol etmeliyiz. Örneğin aşağıdaki bağlantıyı bulursak, ondan hayati bilgiler çıkarabiliriz.

https://example.com/cms/login.php?language=en.html

İlk olarak, login.php bize web uygulamasının PHP kullandığını söylüyor. Bu bilgiyi, web uygulamasının nasıl çalıştığına ilişkin varsayımlar geliştirmek için kullanabiliriz.

İkincisi, URL, değeri olarak bir HTML sayfasını içeren bir dil parametresi içerir. Böyle bir durumda doğrudan dosyaya (https://example.com/cms/en.html) gitmeye çalışmalıyız. Başarılı bir şekilde açabilirsek, en.html‘nin sunucudaki bir dosya olduğunu doğrulayabiliriz, yani bu parametreyi diğer dosya adlarını denemek için kullanabiliriz. Dosyaları değer olarak kullandıklarında parametreleri her zaman yakından incelemeliyiz.

Üçüncüsü, URL cms adı verilen bir dizini içerir. Bu, web uygulamasının web kökünün bir alt dizininde çalıştığını gösteren önemli bir bilgidir.

Aşağıda bWAPP Directory Traversal labını kullanarak örnekler göreceğiz.

URL kısmını incelediğimizde web uygulamasının PHP kullandığını söyleyebiliriz. Sayfadaki butonların tek tek üzerlerine gelerek incelemeliyiz. Farklı bir hedefte geziyor olabilirdik ve burada aşağıdaki url’ye benzer şekilde “admin” etiketli bir bağlantı keşfedebilirdik.

 http://example.com/example/index.php?page=admin.php

bWAPP ekran görüntüsünde görülen URL kısmında web uygulamasının PHP ve “page” adı verilen bir parametre kullandığını görüyoruz. Bu parametrelerin farklı sayfaları da görüntülemek için kullanılabileceğini düşünüyoruz. PHP, değişkenleri bir GET isteği aracılığıyla yönetmek için $_GET‘i kullanır.

bWAPP URL adresinde görüldüğü üzere “page” parametresinde “message.txt” isimli bir dosya çağırmaktadır. Artık potansiyel olarak güvenlik açığı bulunan parametredeki dizinler arasında geçiş yapmak için ../ komutunu kullanmayı deneyebiliriz. Dizin geçişi için sayfa parametresini test etmek amacıyla /etc/passwd‘ye göreli bir yol belirleyeceğiz.

Dizin geçişini kullanarak etc/passwd dosyasını başarılı bir şekilde okuduk. Directory Traversal güvenlik açıkları çoğunlukla bilgi toplamak için kullanılır. Daha önce de belirtildiği gibi, şifreler veya anahtarlar gibi hassas bilgiler içeren belirli dosyalara erişebilirsek, bu durum sisteme erişime yol açabilir.

Çoğu durumda web sunucusu www-data gibi özel bir kullanıcı bağlamında çalıştırılır. Bu kullanıcıların genellikle sistemde sınırlı erişim izinleri vardır. Ancak kullanıcılar ve yöneticiler genellikle dosya erişim izinlerini son derece geniş kapsamlı ve hatta herkes tarafından okunabilir olacak şekilde bilinçli olarak ayarlarlar. Bazen bu, dağıtımdaki zaman kısıtlamaları veya daha az olgunlaşmış güvenlik programları nedeniyle ortaya çıkar. Bu, SSH anahtarlarının varlığını ve erişim izinlerini her zaman kontrol etmemiz gerektiği anlamına gelir.

SSH anahtarları genellikle kullanıcının ana dizininde .ssh klasöründe bulunur. bWAPP labında /etc/passwd çıktısı bir çok kullanıcıyı gösterir. Kullanıcının özel anahtarının içeriğini görüntülemeye çalışmak için güvenlik açığı bulunan “page” parametresi için göreceli bir yol belirleyelim. Anahtarı oluşturduktan sonra aşağıdaki komut ile rsa dosyası okunabilir.

http://192.168.1.22/bWAPP/directory_traversal_2.php?directory=../../../../../../../../../../../home/bee/.ssh/id_rsa

Dosyayı okumak için cURL veya Burp Suite kullanabiliriz. Elde ettiğimiz anahtarı kopyalayıp bir dosyaya kayıt edelim ve bağlantı kurmayı deneyelim.

ssh -i rsa_key -p 22 [email protected]

Yukarıda yer alan komutu çalıştırdığımızda bağlantıyı sağlayıp aşağıdaki gibi terminal görüntüsüne erişeceğiz.


kali@kali:~$ ssh -i rsa_key -p 22 [email protected]
...
bee@bee-box:~$

Bağlantı sağlandığında yukarıdaki gibi makineye erişmiş olacağız.

Bu bölümü tamamlamadan önce Windows’ta dizin geçişi saldırılarını kısaca inceleyelim. Linux’ta dizin geçişindeki güvenlik açıklarını test etmek için genellikle /etc/passwd dosyasını kullanırız. Windows’ta, tüm yerel kullanıcılar tarafından okunabilen dizin geçişi güvenlik açıklarını test etmek için C:\Windows\System32\drivers\etc\hosts dosyasını kullanabiliriz. Bu dosyayı görüntüleyerek güvenlik açığının mevcut olduğunu doğrulayabilir ve web uygulamasının dosya içeriğini nasıl görüntülediğini anlayabiliriz. Güvenlik açığını doğruladıktan sonra yapılandırma dosyaları ve loglar gibi hassas bilgiler içeren dosyaları belirtmeyi deneyebiliriz.

Genel olarak Windows’ta sistem erişimi için dizin geçiş güvenlik açığından yararlanmak Linux’tan daha zordur. Linux sistemlerinde, dizin geçişi için standart bir vektör, /etc/passwd içeriğini görüntüleyerek sistem kullanıcılarını listelemek, ana dizinlerindeki özel anahtarları kontrol etmek ve bunları SSH aracılığıyla sisteme erişmek için kullanmaktır.

Bu vektör Windows’ta mevcut değildir ve ne yazık ki doğrudan bir eşdeğeri de yoktur. Ek olarak, hassas dosyalar genellikle Windows’ta dizinlerin içeriğini listelemeden kolayca bulunamaz. Bu, hassas bilgiler içeren dosyaları tanımlamak için web uygulamasını yakından incelememiz ve web sunucusu, çerçeve ve programlama dili hakkında bilgi toplamamız gerektiği anlamına gelir. Çalışan uygulama veya hizmet hakkında bilgi topladıktan sonra hassas dosyalara giden yolları araştırabiliriz. Örneğin, hedef sistemin Internet Information Services (IIS) web sunucusunu çalıştırdığını öğrenirsek, onun günlük yollarını ve web kök yapısını araştırabiliriz.

Microsoft belgelerini incelediğimizde logların C:\inetpub\logs\LogFiles\W3SVC1\ konumunda bulunduğunu öğreniyoruz. Hedef bir IIS web sunucusu çalıştırırken her zaman kontrol etmemiz gereken başka bir dosya da şifreler veya kullanıcı adları gibi hassas bilgiler içerebilen C:\inetpub\wwwroot\web.config dosyasıdır. Bu bölümde Linux’ta dizin geçişi için ../ dizisini kullandık. Gösterildiği gibi Windows, dosya yolları için ileri eğik çizgiler yerine ters eğik çizgiler kullanır. Bu nedenle ..\, Windows hedeflerinde ../‘ye önemli bir alternatiftir.

RFC 1738391, bir URL’de her zaman eğik çizgi kullanılması gerektiğini belirtirken, Windows’ta yalnızca ters eğik çizgi kullanılarak dizin geçişine karşı savunmasız olan web uygulamalarıyla karşılaşabiliriz. Bu nedenle, Windows üzerinde çalışan bir web uygulamasında olası bir dizin geçişi güvenlik açığını incelerken her zaman hem eğik çizgilerden hem de ters eğik çizgilerden yararlanmaya çalışmalıyız.

Encoding Special Characters

Directory Traversal zafiyetinden yararlanırken bazı güvenlik önlemlerine takılabiliriz. Bu önlemleri atlamak için çeşitli encoding teknikleri kullanılabilir. Bunlardan bazılarına (PayloadAllTheThings) aşağıda örnek verelim.

../
..\
..\/
%2e%2e%2f
%252e%252e%252f
%c0%ae%c0%ae%c0%af
%uff0e%uff0e%u2215
%uff0e%uff0e%u2216

16 bits Unicode encoding

. = %u002e
/ = %u2215
\ = %u2216

UTF-8 Unicode encoding

. = %c0%2e, %e0%40%ae, %c0ae
/ = %c0%af, %e0%80%af, %c0%2f
\ = %c0%5c, %c0%80%5c
Bypass "../" replaced by ""

..././
...\.\

Bypass "../" with ";"

..;/
http://example.com/page.jsp?include=..;/..;/sensitive.txt

Double URL encoding

. = %252e
/ = %252f
\ = %255c

Yukarıda bazı tekniklerden (PayloadAllTheThings) örnekler verdik. İnternet üzerinden araştırma yaparak çok farklı teknikler ve örnekler görebilirsiniz.

PEN-200 serisinin on sekizinci yazısının sonuna geldik. Başka yazılarda görüşmek üzere.

Bir yanıt yazın

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

eight + 20 =

Başa dön tuşu