Command Injection Zafiyeti, Önlemler, Bypass ve Saldırı İzleri

Amaç

DVWA Lab. ortamında Command Injection zafiyetinin bir saldırgan tarafından nasıl istismar edileceği ve saldırı neticesinde erişim log kayıtlarında nasıl izler oluşacağını öğrenmek.

Command Injection Nedir?

Bu zafiyet türünde, saldırgan sunucu üzerinde çalışan uygulamanın açığından faydalanarak istediği komutları sisteme dahil eder ve çalıştırır. Örnekle ile açıklayacak olursak; hedefimizin linux sunucu üzerinde çalışan bir web uygulaması olduğunu düşünelim. Saldırgan uygulama üzerindeki açıklıktan faydalanarak linux komutlarını çalıştırır ve sistem üzerinde yetkisiz erişim gerçekleştirmeye yönelik işlemler yapabilir. Aynı konuyu bir windows sunucu üzerinde de düşünebilirsiniz. Bu saldırı türü ile sıklıkla karşılaşılmasının en önemli sebebi kullanıcının veri girişi yapacağı input alanlarında denetim mekanizmasının doğru bir şekilde yapılandırılmamasıdır.

DVWA Command Injection – {Low Level}

Öncelikle uygulamamızdan özetle bahsedecek olursak; karşımızda kullanıcıların girmiş olduğu IP adreslerine ping atmasına olanak sağlayan bir web sayfası mevcut. Aşağıda ping atılacak IP adresi kısmına www.loganalizi.com yazarak işlemimizi gerçekleştirdik ve dönen sonuç ekrana yansıdı.

Bu kısımda saldırgan tarafından akla gelmesi gereken ilk düşünce; bu uygulama eğer ping atma hizmeti veriyorsa, burada girilen verilerin web uygulama sunucusu tarafından cmd ya da terminal komutları ile birleştirilerek çalıştırıldığıdır. Dikkat ettiyseniz input alanına girilen değer, çıktı alanında ilk satırda anlaşılacağı üzere PING komutuna ekleniyor ve komutun çalıştırılmasıyla dönen sonuç ekrana basılıyor. Uygulama üzerinde herhangi bir saldırı işlemine geçmeden önce kaynak kodlarına da birlikte göz atalım.

Kaynak kodu yorumlayacak olursa; $target değişkeni ile kullanıcıdan alınan veri, shell_exec() fonksiyonu sayesinde ping komutunu, sunucunun komut satırı/cmd üzerinde çalıştırıyor.  Sonrasında ise komutun çalışmasıyla dönen sonucu echo komutu ile ekrana yazdırıyor.

Bu aşamada saldırgan $target değişkeninin yanına herhangi bir IP adresi ile birlikte farklı shell komutları ekleyerek çalıştırabilir. Yukarıda kaynak kodlarda görüldüğü üzere sistem üzerinde kullanıcıdan alınan verilerde herhangi bir denetleme ve filtreleme mekanizması bulunmamaktadır. Bu noktada &&, | veya || komutları birleştirerek çalışmasını sağlayan operatörler ya da ; gibi sonlandırıcı operatörlerden faydalanarak input alanına ekstra bir komut eklenir ve sistem üzerinde command injection zafiyeti istismar edilir.

Dikkat !

Kodlarda görüldüğü üzere erhangi bir denetleme mekanizması olmadığı için tıpkı bir yönetici gibi sistem üzerinde istenilen komutlar çalıştırılabilir. Command Injection zafiyetinden faydalanarak komutlar ile neler yapabileceğimize şimdi birlikte göz atalım.

Local’de DVWA uygulaması linux sunucu üzerine kurulu olduğu için biz input alanına girilen değerlerlerde; linux komutlarından faydalanacağız.

İlk olarak /etc/passwd dosyasını görüntülemeye çalışalım. Linux dağıtımlarında bu dosya içerisinde kullanıcı hakkında ayrıntılı bilgiler (kullanıcıların gerçek ismi, kullanıcı isimleri, ev dizinleri vb. gibi) bulunur.

Çıktıdan anlaşılacağı üzere && operatörü sayesinde önce ping komutu sonrasında ise cat komutu çalıştırılıyor.

İkinci olarak ise anasayfa veya farklı bir dizine hacked yazısı yazılabilir, yeni bir dosya oluşturulabilir. Bulunduğum dizinde test.php adlı bir dosya içerisinde “hacked cenk” yazısı yazalım.

Üçüncü olarak ise; dizin değiştirerek veritabanına ait bilgilerin tutulduğu config dosyasını okumaya çalışalım. Sonrasında ise siteye komutlar yardımıyla shell yükleyelim.

Aşağıda öncelikle 1; ls komutu ile önce olmayan bir IP adresine ping at diyoruz, geçersiz bir işlem olduğu için ; ile işlemi sonlandırıyoruz böylece ekrana herhangi bir çıktı yansımıyor. Sonrasında ise ls komutu ile bulunduğumuz dizinde hangi dosyaların olduğunu görüyoruz.

Hangi dizinde olduğumuzu öğrenmek için pwd komutunu kullanıyoruz.

Sonrasında aşağıdaki komut ile iki dizin üste çıkıyoruz ve o dizinde hangi dosyaların olduğunu ls komutu ile listeliyoruz.

Devamında config dizinine geçiş yapıyoruz ve o dizin içerisinde yer alan dosyaları listeliyoruz.

Sonrasında cat komutu ile config dosyasını görüntülemeye çalışıyoruz.

Burada pwd komutuna artık ihtiyacımız yok kullanmayabilirsiniz 🙂 Uygulamada gözümden kaçmış.

Komutu çalıştırdıktan sonra karşımıza aşağıdaki şekilde bir çıktı gelecektir. Sağ tıkla kaynağı görüntüle dediğinizde veritabanına ait kullanıcı bilgileri çıkacaktır.

Dördüncü olarak siteye shell yüklemek içinse öncelikle wget komutu ile shell dosyasını .txt olarak sunucuya indireceğiz. Sonrasında ise .txt olan dosyası mv komutu ile aynı dizinde adını mysql.php yapacağız. Aşağıda r57 shell dosyası mysql.php olarak sunucuya yüklenmiştir.

DVWA Command Injection – {Medium Level}

Bu zafiyetin orta seviyesinde önce kaynak kodları inceleyerek ne tarz önlemler aldıklarını inceleyelim.

Yukarıda kaynak kodları incelediğimizde && ve ; karakterleri için kara liste oluşturulduğu ($substitutions dizisi) ve veri girişi kısmında bu karakter ile karşılaşıldığında str_replace() fonksiyonu kullanılarak silinmesi sağlanmaktadır. Burada güvenlik adımlarını atlatmak için aşağıdaki adımlardan herhangi birini kullanabiliriz. İlk seçenekte pipe işareti yasaklı bir karakter olmadığından komutumuz sorunsuz bir şekilde çalışmaktadır.

  • loganalizi.com | cat /etc/passwd
  • loganalizi.com &;& cat /etc/passwd

İkinci seçenekte ise str_replace() fonksiyonu öncelikle tek ampersand işaretini görünce silmeyecek es geçecektir.Peşinden gelen ; karakteri yasaklı karakter olduğu için silinecektir. Böylece iki ampersand işareti birleşerek sorunsuz bir şekilde çalışacaktır. Burada str_replace() fonksiyonu iki ampersand işaretini peş peşe görmediği için başlangıçta silme işlemi gerçekleştirmeyecektir ve böylece güvenlik önlemi bypass edilecektir.

DVWA Command Injection – {High Level}

Bu zafiyetin yüksek seviyesinde önce kaynak kodları inceleyerek ne tarz önlemler aldıklarını inceleyelim.

Kara listede görüldüğü üzere yasaklanan karakter sayısı arttırılmış. Ama dikkat ettiyseniz yasaklanan karakterler arasında pipe işaretinin yanında boşluk mevcut, peki ya biz bunu bitişik yazarsak bypass edemez miyiz ?

DVWA Command Injection – {impossible Level}

Bu zafiyetin imkansız seviyesinde önce kaynak kodları inceleyerek ne tarz önlemler aldıklarını inceleyelim. Sonrasında zaten çözemeyeceğiz 🙂

Burada özetle; başlangıçta anti-CSRF token güvenlik mekanizmasının uygulandığını görüyoruz, sonrasında ise “\” işaretleri (stripslashes) temizleniyor, IP adresleri oktetlere ayrılarak sayısal değer olup olmadığı kontrol ediliyor (explode ve is_numeric), birleştirilerek sunucu tarafında çalıştırılıyor.

  • stripslashes fonksiyonu : ters bölü (\) işareti temizleniyor,
  • explode fonksiyonu : bir dizgeyi bir ayraca göre bölüp bir dizi haline getiriyor,
  • is_numeric : Değişken bir sayı veya bir sayısal dizge mi diye bakıyor,

Command Injection saldırılarından korunmak için özetle;

  • Kullanıcının veri girişi yapacağı alanlara kesinlikle güvenilmemeli,
  • Denetim mekanizmaları geliştirerek özel karakterleri mutlaka engellenmeli,
  • Her veri girişini özelliğine göre sınırlandırarak mümkün olduğunca kısıtlanmalı, (impossible seviyesinde olduğu gibi)

Command Injection Saldırı Sonrasında Oluşan Erişim Log Kayıtları

DVWA Lab. ortamında gerçekleştirdiğimiz bu saldırı türünde kullanıcı tarafından girilen veriler sunucuya POST edildiği için erişim log kayıtlarında haliyle gönderilen verinin detayı gözükmeyecektir. Fakat yukarıdaki saldırı tekniklerinden yola çıkarak;

  • aynı IP adresi üzerinden belirli aralıklarla POST isteğinin gelmesi,
  • IP adresinin hareketlerinin adım adım kontrol edildiğinde site üzerinde farklı dosyaya gidilerek o kısımda da POST isteklerinin yoğunlaşması,

şüphe uyandırmalıdır. Hatırlayacağınız üzere yazımızda shell dosyasını sunucuya indirmiştik ve sonrasında mysql.php olarak adını değiştirip erişim gerçekleştirmiştik. Sonrasında bu dosya üzerinden yetkisiz erişim gerçekleştirmeye yönelik çeşitli işlemler yapıldığında bu sefer /mysql.php dizininde sürekli POST isteklerinin gerçekleştiği log kayıtlarına yansıyacaktır. Aşağıda ekran görüntüsü verilen ilgili satırları inceleyebilirsiniz. Burada bu dosya üzerinden gerçekleştirilen POST işlemlerinde açılan sayfanın boyutunun sürekli değişmesi çeşitli komutların çalıştırılarak tarayıcı üzerinde farklı bilgilere erişim sağlandığına dair sizlere ipucu verebilir.

Ayrıca tespit edilen shell dosyalarına farklı tarih ve zamanlarda başka erişim sağlayan IP adreslerinin de olup olmadığı kontrol edilmelidir.

Ayrıca yine hatırlarsanız yukarıdaki örneklerde test.php adlı bir dosya içerisinde “hacked cenk” yazmıştık. Saldırgan yazdırmış olduğu bu veriyi bir şekilde görüntülemek isteyebilir. Sayfayı tarayıcıda ziyaret ettiğinde erişim log kayıtlarına düşecektir. Daha önce sürekli POST eden şüpheli bir IP’nin hareketleri takip edilerek takibinde çok zaman geçmeden test.php dosyasını ziyaret etmesi de inceleyen kişide şüphe uyandırabilir.

POST edilen verinin detayı erişim log kayıtlarında görünmemektedir. Bu nedenle POST edilen verinin içeriğine ulaşmak için trafiği wireshark ile kayıt altına alıp, inceleyebilirsiniz. Bu gibi durumlarda POST edilen veride windows / linux komutları incelenerek saldırı hakkında bilgi edinilebilir.

Faydalı ve Faydalanılan Kaynaklar

  • https://www.homelab.it/index.php/2016/01/07/dvwa-command-injection-soluzione-completa/
  • http://php.net
  • http://www.includekarabuk.com/dvwatutorial.php

Site Footer