Ders 4 - Command Injection (Low Level) | |||||
Bu yazıda DVWA adlı web uygulamasının içerisinde bulunan bir sayfanın zafiyetinden faydalanarak "Linux bir sisteme" Command Injection saldırısında bulunulacaktır.
Dersin HedefiHedefiniz Command Injection saldırısı yaparak zafiyetin bulunduğu sayfaya "Hacked By Script Kiddies" yazısını yazdırmaktır.Command Injection Nedir?Command Injection, yani komut enjeksiyonu saldırganın zafiyet barındıran bir uygulama üzerinden hedef sistemde dilediği komutları çalıştırabilmesine denir. Komut ile kastedilen şey Windows'ta CMD ve Linux'ta Terminal pencerelerine girilen sistem komutlarıdır. Literatürde Shell kodlaması diye de geçer. Command Injection saldırısı büyük oranda yetersiz input denetleme mekanizması nedeniyle gerçekleşmektedir. Şimdi burada anlatılanların ne anlama geldiğini DVWA üzerinden pratik olarak görelim.Command Injection Saldırısı Nasıl Yapılır?Öncelikle DVWA'nın sunduğu Command Injection sayfasına bir göz atalım:![]() Command Injection sayfasında bir metin kutusu görmektesiniz. Bu metin kutusuna gireceğiniz bir IP adresi ya da bir domain adresi sonucu ekrana 4 tane ping paketinin belirtilen adrese gönderildiğini göreceksiniz. ![]() Buradan şu tespite varmanız gerekir: Eğer ping paketleri gönderiliyor ve alınıyorsa - ki çıktı bunu söylüyor - bu durumda web uygulaması sunucu tarafında CMD ya da Terminal komutları çalıştırıyor demektir. Bu tespitten sonra ikinci tespit etmeniz gereken nokta ise metin kutusuna girdiğiniz IP ya da domain adresinin sunucu tarafındaki CMD/Terminal komutlarına eklendiği ve bu şekilde CMD/Terminal komutlarının çalıştırıldığıdır. Çünkü çıktıya dikkat edecek olursanız metin kutusuna girilen adresin aynısı çıktıda da mevcuttur. Yani ping paketleri metin kutusundaki adrese gönderilmiştir: ![]() Bu tür bir hizmet veren web uygulamasında eğer metin kutusu denetlemeye tabi tutulmamışsa saldırgan komut satırı kodlama bilgisini kullanarak var olan ping komutunun yanına kendi komutunu ekleyebilir. Böylelikle ping komutunu çalıştıran sunucu istemeden saldırganın gönderdiği komutu da çalıştıracaktır ve ekrana yansıtacağı çıktının içinde saldırganın eklediği komutun çıktısı da yer alacaktır. Şimdi bu işlemi daha iyi anlayabilmek için metin kutusundan gönderdiğimiz verinin sunucu tarafında nasıl işlendiğini PHP kodlaması ile görelim: Metin kutusuna girilen site adı sonrası ekrana 4 paketli bir ping çıktısı yansımaktadır. Bu paketlerin belirttiğimiz adrese gittiği ifade edildiğine göre arkaplanda metin kutusundan alınan verinin ping komutunun sonrasına eklendiği sonucuna varabiliriz. Bu durumda arkaplanda çalışan ilgili PHP kodu şöyle bir şey olmalıdır ki ekrana bizim gözlemlediğimiz çıktıyı verebilsin: echo shell_exec('ping -c 4 ' . $metinKutusu); shell_exec() fonksiyonu, içerisinde yer alan ping komutunu sunucunun komut satırı üzerinde çalıştıracaktır ve echo komutuyla da çalıştırılan komutun çıktısı ekrana yansıtılacaktır. Yukarıdaki satırda yer alan -c 4 ifadesi 4 kere ping paketi gönder anlamına gelir ve $metinKutusu değişkeni ise ekrandaki metin kutusuna girilen veriyi tutan bir değişkeni temsil eder. Şimdi bu PHP kodunu gördükten sonra command injection'ı daha iyi idrak edebiliriz. $metinKutusu'na girilecek bazı operatörlerle yeni komutlar dahil edilebilmektedir. Eğer shell (komut satırı) diline biraz vakıfsanız bilirsiniz ki &&, | ya da || gibi operatörler, ayrıca ; gibi sonlandırıcılar shell komutlarını birbirlerinden ayıran ya da birbirlerine bağlayan özelliğe sahiptirler. İşte bu operatörler yardımıyla ping komutunun sonuna yeni bir komut ekleyeceğiz. Böylece command injection teşebbüsünde bulunmuş olacağız. Metin kutusuna girilecek bir site adından sonra && operatörünü eklersek bundan sonra istediğimiz shell komutunu girebiliriz. ping www.includekarabuk.com && cat /etc/passwd Yukarıdaki satır şu anlama gelir: ping'i çalıştırdıktan sonra cat'i çalıştır. Bu shell kodlamasındaki cat komutu argüman olarak aldığı dosyanın içeriğini ekrana basmaya yarayan bir komuttur. && operatörü ise operand'larını sırayla çalıştırmaya yarayan bir AND operatörüdür. Yukarıdaki kodu okuyacak sunucu ping komutundan dönen çıktıyı nasıl ekrana yansıtıyorsa ping'le beraber kullanılan cat komutunun çıktısını da ekrana yansıtacaktır. Çünkü hatırlayın! Arkaplanda çalışan script kodu şu şekilde idi: echo shell_exec('ping -c 4' . $metinKutusu); $metinKutusu www.includekarabuk.com değerine sahipken sunucu bu veriyi şöyle okuyordu: echo shell_exec('ping -c 4 www.includekarabuk.com'); Dolayısıyla ekrana ping komutunun yaptıkları yansıyordu. Eğer $metinKutusu değişkeni www.includekarabuk.com && cat /etc/passwd değerini tutarsa bu durumda sunucu arkaplanda bunu şöyle okuyacaktır: echo shell_exec('ping -c 4 www.includekarabuk.com && cat /etc/passwd'); Dolayısıyla shell_exec() fonksiyonu, içindeki komutların oluşturduğu toplam çıktıyı döndürecektir ve echo ile de hepsi ekrana yazdırılacaktır. Dolayısıyla && operatörü enjeksiyonu kusursuzca yapmamızı sağlamış olacaktır. Şimdi ekrandaki metin kutusuna aşağıdaki kodu girelim: www.includekarabuk.com && cat /etc/passwd Submit butonuna tıklayalım ve ekrana yansıyan yeni çıktıya bakalım: ![]() Görüldüğü üzere enjekte ettiğimiz cat /etc/passwd komutunun çıktısı ping çıktısının altında görüntülenmektedir. Böylelikle hedef sitenin "sunucusunda" kendi belirlediğimiz sistem komutunu çalıştırabildiğimizi fark ettik. Yani sayfanın bir Command Injection zafiyeti barındırdığını müşahade etmiş olduk. Bu zafiyet ekrandaki veri girilen metin kutusunun herhangi bir denetleme mekanizmasına sahip olmayışından kaynaklanmaktadır. Denetleme mekanizmasıyla ne demek istediğimi Ders 5 - Command Injection (Medium Level)'da daha iyi anlayacaksınız. Sayfa Hack'lemek Şimdi ilgili zafiyetin bulunduğu sayfayı hack'leyelim ve sayfada sadece "Hacked By Script Kiddies" yazısının görüntülemesini sağlayalım. Bunu yukarıda bahsedilen Command Injection ile yapacağız. Yani yine shell (komut satırı) kodlaması kullanacağız. Fakat önce DVWA'nın kurulu olduğu dizine gidin ve Command Injection sayfasını kopyalıp yedekleyin (dvwa/vulnerabilities/exec/index.php). Çünkü sayfanın içeriğini "Hacked ..." şeklinde değiştireceğimiz için daha sonra tekrar eski haline getirmek isteyebilirsiniz. index.php'yi yedekledikten sonra metin kutusuna aşağıdakini girin: www.includekarabuk.com && echo "<font color=red><center><h1>Hacked By Script Kiddies</h1></center></font><br>" > index.php Yukarıdaki enjeksiyon kodundaki echo komutu argüman olarak aldığı string'i ekrana basmaya yarar. > operatörü ise kendinden önceki komutun output'unu kendinden sonraki dosyanın içeriğine yazmaya yarar. Yukarıdaki komut girildikten sonra sayfayı yenileyin. Böylelikle temiz bir şekilde sayfayı hack'lemiş olursunuz. ![]() Bu örnekte biz sayfaya sadece metin yazdırdık. Fakat istenildiği takdirde resim ve video da konulabilir. Bunun için yapılması gereken şey yukarıdaki enjeksiyon kodunun && operatörü sonrasında yer alan tırnak işaretleri arasına ilgili resmin ya da videonun html kodunu yerleştirmektir. Böylece görüntülenecek sayfa belirtilen resim ve videoyu ekrana yansıtacaktır. NOT: Eski sayfaya tekrar kavuşabilmek için yedeklediğiniz index.php'yi dvwa/vulnerabilities/exec/ dizini içine yapıştırmalısınız. EkstraPeki Command Injection saldırısıyla saldırgan başka ne yapabilir? Bu sorunun cevabı kısa ve nettir: Hedef sistemde oturup makinayı kontrol eden kişinin yapabileceği herşeyi saldırgan da yapabilir (Hack'lediği web uygulamasının yetkileri ölçüsünde). Örnek olarak diyelim ki saldırgan zafiyet barındıran web sayfasının bulunduğu dizindeki tüm dosyalarını görmek istiyor. Bu durumda aşağıdaki enjeksiyon kodunu girer:1; ls1 sayısı ile 1 adresine ping at demiş oluyoruz. Geçersiz bir işlem olacağı için ekrana onla ilgili bir çıktı yansımayacaktır. Böylece sadece enjekte ettiğimiz kodun çıktısını görebileceğiz. 1'den sonraki noktalı virgül ile ping komutunu sonlandır demiş oluyoruz ve yeni bir komut satırına geçiş yapmış oluyoruz. Bu yeni satırdaki ls komutu ile de bulunulan dizindeki dosyaların isimlerini döndürüyoruz ve en sonunda echo komutuyla da bulunulan dizindeki dosyaların isimlerini çıktı olarak ekrana bastırıyoruz. ![]() Eğer saldırgan bir üst dizinde yer alan dosyaları görüntülemek isterse aşağıdaki komutu girebilir: 1; cd .. && ls ![]() Eğer saldırgan üst dizinin üst dizininde yer alan dosyaları görüntülemek isterse aşağıdakini girebilir: 1; cd .. ; cd .. && ls ![]() Böylelikle saldırgan hep bir üst dizine giderek veya farklı bir dizine dallanarak dilediği dosyanın konumunu öğrenebilir ve içeriğini ekrana yazdırabilir. Aynı zamanda dilediği dosyanın içeriğine Hacked By Falan Filan tarzı şeyler yazdırabilir. Farzedelim ki saldırgan vardığı dizine bir not bırakmak istiyor. Bunun için aşağıdaki komutu girmesi yeterlidir: 1; cd .. ; cd .. ; echo "Hack yedin. Açığını kapatmak için şunları şunları yap vs..." > HACKED.txt; cat HACKED.txt Böylelikle DVWA'nın kök dizininde HACKED.txt adlı bir metin belgesi oluşturulur. ![]() Aynı zamanda kodun enjekte edildiği sayfaya oluşturulan not belgesinin içeriği yansıtılır. Böylelikle dosyanın oluşturulduğundan emin olunur: ![]() Yararlanılan Kaynak https://www.owasp.org/index.php/Command_Injection |
|||||
![]() |
|||||
|
|||||
Yorumlar |
|||||
|
|||||
|
|||||
Yorum Ekle | |||||