Dizin Aşımı / Atlama Zafiyetinin İstismarı

0
155
views
Web uygulamaları sızma testlerinde karşılaşılabilecek zafiyetlerden birisi de Dizin Aşımı/Atlama (Directory Traversal) zafiyetidir. Bu yazıda güvenilir olarak yapılandırılmamış Pentester Lab: Web For Pentester (I) sanal makinesindeki dizin aşımı zafiyeti istismar edilerek uygulama kullanıcı yetkileri ile sunucu üzerindeki dosyalar okunacaktır.

 

Yazıda kullanılan Pentester Lab: Web For Pentester (I) sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/pentester-lab-web-for-pentester,71/

 

Gerekli girdi kontrollerinin (filtreleme/kodlama vb.) yapılmadığı dinamik sayfalarda, uygulamaya bağlanan saldırgan, bu zafiyeti istismar ederek sunucu üzerinde normalde erişmemesi gereken dosyaları okuyabilir, dizinlere erişebilir. Bu zafiyet, “Dot-Dot-Slash“, “Directory Traversal“, “Path Traversal“, “Directory Climbing“, “Backtracking“,… olarak adlandırılabilir.

 

Not: Bazı ortamlarda bağlantı kurulan uygulama ile erişilmesi gereken dosyalar farklı olabilir. Yani dosyalar uygulama suncusunda değil de arka plandaki bir dosya sunucusu üzerinde depolanıyor olabilir. Bu gibi durumlarda Dizin Atlama saldırısı ile uygulama sunucusundaki dosyalara değil, arka taraftaki dosya sunucusundaki dosyalara erişim sağlanmış olur. Kurumsal ortamlardaki doküman yönetim sistemlerinde bu gibi katmanlı yapılar ile karşılaşılabilir.

 

1) Pentester Lab: Web For Pentester (I) Sanal Makinesi

Pentester Lab: Web For Pentester (I) sanal makinesinin TCP/80 portuna erişildiğinde bir çok zafiyet ile ilgili ortama erişim sağlanabilmektedir. Bu zafiyetler XSS, Dosya Dahil etme, LDAP saldırıları, SQL enjeksiyonu, Kod enjeksiyonu, Dosya Yükleme, Dizin Aşımı, Komut Enjeksiyonu, XML atakları olarak sıralanabilir.

 

Bu zafiyetleri barındıran kodlar için SSH ile bağlanılarak “/var/www” dizini altındaki PHP dosyaları incelenebilir.

 

2) Dizin Aşımı Zafiyetinin Tespiti

Aynı değer tekniği (“Same Value Technique“) ile zafiyet tespiti gerçekleştirilebilir. Şöyle ki; “file=/Resimler/Foto.jpg” gibi bir ifade olması durumunda aşağıdaki dosyaların çağrılması ile zafiyetin keşfi incelenebilir.

  • file=/Resimler/./Foto.jpg: Aynı dosyanın gelmesi beklenir.
  • file=/Resimler/../Foto.jpg: (Bir üst dizinde aynı isimde (Foto.jpg) bir dosya bulunmuyorsa) Hata alınması beklenir.
  • file=/Resimler/OlmayanDizin/../Foto.jpg: Aynı dosyanın gelmesi beklenir.
  • file=/Resimler/../Resimler/Foto.jpg: Aynı dosyanın gelmesi beklenir.
  • file=/Resimler/../RESIMLER/Foto.jpg: Bir üst dizinde aynı isimde (Foto.jpg) bir dosya bulunmuyorsa) Dosya sistemine bağlı olarak hata alınması veya beklenmedik bir sonuç ile karşılaşılması beklenir.

 

3) Dizin Aşımı Zafiyetinin İstismarı

Gerekli kontrollerden sonra işletim sistemindeki diğer dosyalara erişim sağlanmaya çalışılabilir. Erişim kontrolü için denenebilecek dosyalar aşağıdaki gibi sıralanabilir.

  • Linux ortamında;
    • /etc/hosts
    • /etc/passwd
    • /etc/group
  • Windows ortamında;
    • C:\boot.ini
    • C:\winnt\win.ini
    • C:\Windows\system32\config\sam

 

Daha geniş bir liste için kaynaklardaki Pentestlab yazısı incelenebilir.

Not: Belirtilen dosyalara erişim için “../“, “./“, “..\” gibi ifadeler kullanılabilir. Ayrıca belirtilen dosyalara erişim için düz taksim (“/“) ve/veya ters taksim (“\“) karakterleri beraber kullanılabilir. Sızma testleri sırasında her iki ihtimal beraber denenebilir. Çünkü ön yüz Linux olsa da dosyanın depolandığı sunucu Windows olabilir.

Dizin aşımı zafiyetinin tespiti ve istismarı her zaman kolay olamayabilir. Ancak eğitim amaçlı hazırlanan Pentester Lab: Web For Pentester (I) ortamında, zafiyet kolay bir şekilde tespit edilebilmekte ve istismar edilebilmektedir. Bu yazıda incelenecek olan dizin aşımı zafiyeti “/var/www/files/” altındaki “hacker.png” dosyasını çekerken karşılaşılmaktadır.

http://10.100.50.131/dirtrav/example[N].php?file=[XXX]

 

İlk uygulamanın bağlantısı şeklindedir.

http://10.100.50.131/dirtrav/example1.php?file=hacker.png

 

İlk uygulamaya ait özetlenmiş kaynak kod aşağıdaki gibidir. Kod içerisinde de görüldüğü gibi, kullanıcıdan alınan değer (“file” değişkeni) doğrudan “/var/www/files/” dizinine eklenmekte ve bu dosya çağırılarak son kullanıcıya içeriği gösterilmektedir.

 

İlk uygulamadaki bu zafiyetin istismarı için 3 üst dizinine (“/var/www/files/” dizinleri 3 tane olduğu için) çıkılması ve “/etc/passwd” dosyasının çağırılması yeterli olur.

wget -O – ‘http://10.100.50.131/dirtrav/example1.php?file=../../../etc/passwd’

 

3 üst dizin yerine daha fazla (6 gibi) üst dizine gidilmesi durumunda da aynı sonuç elde edilebilirdi.

http://10.100.50.131/dirtrav/example1.php?file=../../../../../../../etc/passwd

 

Bu işlem için “dotdotpwn” aracı da kullanılabilir. 5 alt dizine girerek “/etc/passwd” dosyası içerisini okumaya çalışan ve içerisinde “root:” ifadesini bulunca çalışmasını sonlandıran komut aşağıdaki gibidir.

dotdotpwn -m http-url -u http://10.100.50.131/dirtrav/example1.php?file=TRAVERSAL -M GET -f /etc/passwd -k “root:” -d 5 -b

 

Yapılan denemeler sonrasında 3 üst dizinde şartın sağlandığı ve dosyanın okunabildiği (zafiyetin keşfedildiği) görülmüştür.

 

4) Dizin Aşımı Kontrollerini Atlatma

Dizin Aşımı zafiyetinin istismarı sırasında nokta ve taksim karakterleri WAF veya kod içerisindeki kontroller tarafından temizleniyor/engelleniyor olabilir. Bu sebeple çeşitli teknikler kullanılır.

  • Kodlama bu tekniklerden birisidir. Nokta (“.“) ve taksim (“/” ve “\“) işaretleri için URL kodlama, 16 bit Unicode kodlama, çift URL kodlama,… teknikleri ile de Dizin Aşımı zafiyeti istismar edilmeye çalışılabilir.
Standart Url 16 Bit Unicode Çift URL
. %2e %u002e %252e
/ %2f %u2215 %252f
\ %5c %u2216 %255c

 

Pentester Lab: Web For Pentester (I) ortamında bu şekilde bir kontrol yoktur. Ancak “dotdotpwn” aracı ile kodlama yaparak da zafiyetin mevcudiyetini kontrol edebilmektedir. Bu amaçla 2. uygulama incelenebilir. İkinci uygulamanın bağlantısı şeklindedir.

http://10.100.50.131/dirtrav/example2.php?file=/var/www/files/hacker.png

 

İkinci uygulamaya ait özetlenmiş kaynak kod aşağıdaki gibidir. Kod içerisinde de görüldüğü gibi, kullanıcıdan alınan değerin (“file” değişkeni) içerisinde “/var/www/files/” ifadesi geçiyorsa, bu dosya çağırılarak son kullanıcıya içeriği gösterilmektedir.

 

İkinci uygulamadaki bu zafiyetin istismarı için “/var/www/files/” ifadesinden sonra, kodlama yöntemleri kullanılarak 3 üst dizinine (“/var/www/files/” dizinleri 3 tane olduğu için) çıkılması ve “/etc/hosts” dosyasının çağırılması yeterli olur.

http://10.100.50.131/dirtrav/example2.php?file=/var/www/files/..%2f..%2f..%2fetc%2fhosts

 

Kodlama tekniğini otomatik olarak denemek için “dotdotpwn” aracı kullanılabilir.

dotdotpwn -m http-url -u http://10.100.50.131/dirtrav/example2.php?file=/var/www/files/TRAVERSAL -M GET -f /etc/hosts -k “localhost” -d 5

 

  • Kodlamanın yanında uygulama içerisinde döngüsel kullanım denetlenmiyorsa “//“, “\/“, “\\“, “/\” gibi ifadeler ile Dizin Aşımı kontrolleri atlatılabilir. Dizin Aşımı zafiyetinin istismarı için kullanılan “dotdotpwn” aracı bu kontrolleri yapmaktadır.

https://github.com/wireghoul/dotdotpwn/blob/master/DotDotPwn/TraversalEngine.pm

 

Bazı uygulamalarda kullanıcıdan alınan ifadenin sonuna dosya uzantısı otomatik olarak eklenir. Bu gibi bir uygulamada, erişilmek dosyanın sonuna NULL Byte (URL kodlanmış hakli olan “%00“) eklenmesi yeterli olacaktır. Böylece NULL Byte sonrası okunmayacak ve hedeflenen dosya kullanıcı tarafından okunabilecektir.

Pentester Lab: Web For Pentester (I) ortamındaki 3. uygulama bu amaçla incelenebilir. Üçüncü uygulamanın bağlantısı şeklindedir.

http://10.100.50.131/dirtrav/example3.php?file=hacker

 

Üçüncü uygulamaya ait özetlenmiş kaynak kod aşağıdaki gibidir. Kod içerisinde de görüldüğü gibi, kullanıcıdan alınan değer (“file” değişkeni) sonuna “.png” ifadesi ile birlikte “/var/www/files/” dizinine eklenmekte ve bu dosya çağrılarak son kullanıcıya içeriği gösterilmektedir.

 

Üçüncü uygulamadaki bu zafiyetin istismarı için 3 üst dizinine (“/var/www/files/” dizinleri 3 tane olduğu için) çıkılması ve “/etc/group” dosyasının sonuna NULL Byte (URL kodlanmış hakli olan “%00“) ifadesi eklenerek çağırılması yeterli olur.

http://10.100.50.131/dirtrav/example3.php?file=../../../../etc/group%00

 

Not: NULL Byte ifadesinden sonra herhangi bir değer kullanılsa da benzer sonuç elde edilecektir.

http://10.100.50.131/dirtrav/example3.php?file=../../../../etc/group%00Deneme.jpg

 

Bu kontrol için “dotdotpwn” aracı da kullanılabilir. 5 alt dizine girerek “/etc/group” dosyası içerisini okumaya çalışan ve içerisinde “root:” ifadesini arayan ve sadece uyan değerleri listeleyen komut aşağıdaki gibidir.

dotdotpwn -m http-url -u http://10.100.50.131/dirtrav/example3.php?file=TRAVERSAL%00 -M GET -f /etc/group -k “root” -d 5 -q

 

Yapılan denemeler sonrasında zafiyetin keşfedildiği durumlar listelenmiştir.

Bazı uygulamalarda ise, erişilmek dosyanın sonuna yeni satır (URL kodlanmış hali olarak “%0A“) eklenmesi yeterli olacaktır.

 

Kaynaklar:

https://pentesterlab.com/exercises/web_for_pentester/course
http://blog.btrisk.com/2015/04/Web-Uygulama-Guvenligi-Path-Traversal-Saldirilari.html
https://www.owasp.org/index.php/Path_Traversal
https://code-reference.com/bash/examples/iisscan
https://pentestlab.blog/2012/06/29/directory-traversal-cheat-sheet/

 

 

 

 

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz