TryHackMe — Command Injection Walkthrough — giselle

TryHackMe: Command Injection Walkthrough

Merhaba, bugün TryHackMe’nin Command Injection odasının çözümünü anlatacağım.

Görev 1 Giriş (Command Injection Nedir?)

Bu odada web güvenlik açığı olan command injection (komut enjeksiyonu) konusunu ele alacağız. Bu güvenlik açığını anladıktan sonra etkisini ve bir uygulamaya olan riskini inceleyeceğiz.

Ardından şu konuları pratiğe dökeceğiz:

  • Command injection açığını nasıl keşfederiz
  • Farklı işletim sistemleri için tasarlanmış payload’larla bu açığı nasıl test eder ve exploit ederiz
  • Bir geliştirici olarak bu açıktan nasıl korunuruz
  • Son olarak pratik uygulamada öğrendiklerinizi pekiştireceksiniz.

Command injection, bir uygulamanın davranışını kötüye kullanarak, uygulamanın çalıştığı aynı yetkilerle işletim sistemi üzerinde komut çalıştırma eylemidir. Örneğin, joe adlı kullanıcı olarak çalışan bir web sunucusunda command injection başarılı olursa komutlar joe yetkisiyle çalışır; dolayısıyla joe‘nun sahip olduğu tüm izinler elde edilmiş olur.

Command injection zafiyeti, bir saldırganın makineye doğrudan erişim olmaksızın (yani etkileşimli bir shell olmaksızın) bir dizi payload çalıştırabilmesini sağladığından “Uzaktan Kod Çalıştırma” (RCE) olarak da bilinir. Web sunucusu bu kodu işler ve uygulamayı çalıştıran kullanıcının yetkileri ve erişim kontrolleri dahilinde çalıştırır.

Görev 2 Command Injection’ı Keşfetmek

Bu güvenlik açığı; PHP, Python ve NodeJS gibi programlama dillerindeki fonksiyonların kullanıcıdan gelen veriyi işleyip işletim sistemi üzerinde sistem çağrıları yapmasından kaynaklanır. Örneğin bir alandan girdi alınarak bir dosyada girdi aranabilir. Aşağıdaki kod örneğini inceleyelim:

1. Uygulama, MP3 dosyalarını işletim sistemi üzerindeki bir dizinde saklar.

2. Kullanıcı, aramak istediği şarkı adını girer. Uygulama bu girdiyi $title değişkeninde saklar.

3. $title değişkenindeki veri, kullanıcının aramak istediği girişi bulmak için songtitle.txt adlı metin dosyasında grep komutuyla aranır.

4. songtitle.txt içindeki aramanın sonucuna göre uygulama kullanıcıya şarkının var olup olmadığını bildirir.

Bu tür bilgiler genellikle veritabanında saklanır; ancak bu, bir uygulamanın kullanıcıdan girdi alarak işletim sistemiyle etkileşime girdiğinin basit bir örneğidir.

Bir saldırgan, uygulamanın çalıştırması için kendi komutlarını enjekte ederek bu uygulamayı kötüye kullanabilir. grep ile songtitle.txt içinde arama yapmak yerine uygulamaya daha hassas dosyaları okumasını söyleyebilirler.

Uygulamaların bu şekilde kötüye kullanılması, kullanılan programlama dilinden bağımsız olarak mümkündür. Uygulama kodu işleyip çalıştırdığı sürece command injection gerçekleşebilir. Aşağıdaki Python ile yazılmış uygulamaya bakalım:

Görev 3 Command Injection’ı Exploit Etmek

Bu odanın pratik bölümünde göreceğiniz gibi, uygulamanın davranışlarından command injection’ın gerçekleşip gerçekleşmeyeceğini anlamak mümkündür.

Kullanıcı girdisini sistem komutlarıyla birleştiren uygulamalar zaman zaman istenmeyen davranışlar sergileyebilir. Örneğin ;, & ve && gibi shell operatörleri iki veya daha fazla sistem komutunu birleştirerek ikisini de çalıştırır. Bu konu hakkında daha fazla bilgi için Linux Fundamentals modülünü incelemenizi öneririm.

Command injection tespiti iki temel yöntemle yapılır:

  • Blind (kör) command injection
  • Verbose (açık) command injection

Blind Command Injection Tespiti

Blind command injection, komut enjeksiyonunun gerçekleştiği ancak herhangi bir çıktının görünmediği, dolayısıyla hemen fark edilemediği durumdur. Örneğin bir komut çalıştırılır ancak web uygulaması herhangi bir mesaj göstermez.

Bu tür command injection için zaman gecikmesine neden olacak payload’lar kullanmamız gerekir. Örneğin ping ve sleep komutları bu amaçla önemli payload’lardır. ping örneğinde uygulama, belirtilen ping sayısı kadar saniye boyunca yanıt vermez.

Blind command injection tespitinin bir diğer yöntemi ise çıktıyı zorla almaktır. Bunun için > gibi yönlendirme operatörleri kullanılabilir. Örneğin whoami gibi bir komutun çıktısını bir dosyaya yönlendirip ardından cat ile okuyabiliriz.

Bu şekilde command injection testi yapmak çoğu zaman karmaşıktır ve komut söz diziminin Linux ile Windows arasında farklılık göstermesi nedeniyle oldukça deneme yanılma gerektirir.

curl komutu, command injection testi için harika bir araçtır; çünkü payload içinde uygulamaya veri gönderip alabilirsiniz.

Verbose Command Injection Tespiti

Bu şekilde command injection tespit etmek muhtemelen iki yöntemin en kolayıdır. Verbose command injection, uygulamanın ne olduğu veya ne çalıştırıldığı hakkında geri bildirim ya da çıktı sağlamasıdır.

Örneğin ping veya whoami gibi komutların çıktısı doğrudan web uygulamasında görüntülenir.

Faydalı Payload’lar

Görev 4 Command Injection’dan Korunmak

Command injection çeşitli yollarla önlenebilir. Programlama dilindeki potansiyel olarak tehlikeli fonksiyon veya kütüphanelerin minimum kullanımından, kullanıcı girdisine güvenmeden girdi filtrelemeye kadar farklı yöntemler mevcuttur.

Savunmasız Fonksiyonlar

PHP’de işletim sistemiyle shell üzerinden komut çalıştıran birçok fonksiyon vardır:

  • Exec
  • Passthru
  • System

Bu fonksiyonlar, düzgün kontroller yapılmadan kullanıldığında command injection’a karşı savunmasız hale gelir.

Girdi Doğrulama (Input Sanitisation)

Kullanıcıdan alınan girdileri temizlemek, command injection’ı önlemenin etkili bir yoludur. Bu süreç, kullanıcının gönderebileceği veri formatlarını veya türlerini belirlemeyi içerir. Örneğin yalnızca sayısal veri kabul eden veya >, &, / gibi özel karakterleri kaldıran bir giriş alanı.

Filtreleri Atlatmak

Uygulamalar, kullanıcı girdisini filtrelemek için çeşitli teknikler kullanır. Bu filtreler sizi belirli payload’larla kısıtlayabilir; ancak uygulamanın mantığını istismar ederek bu filtreleri atlatabiliriz. Örneğin bir uygulama tırnak işaretlerini kaldırıyorsa bunun onaltılık değerini kullanarak aynı sonuca ulaşabiliriz.

Görev 5 Pratik: Command Injection

Bu göreve bağlı makineyi başlatın; hazır olduğunda bölünmüş ekran görünümünde görünecektir.

Bölünmüş ekran görünümündeki web sitesinde barındırılan uygulamada çeşitli payload’lar deneyin. Takılı kaldıysanız hile kağıdına başvurabilirsiniz.

/home/tryhackme/flag.txt konumundaki bayrağın içeriğini bulun.

Görev 6 Sonuç

Bu odanın sonuna ulaştığınız için tebrikler! Özetle şu konuları öğrendik:

  • Command injection açığını nasıl keşfederiz
  • Farklı işletim sistemleri için payload’larla bu açığı nasıl test eder ve exploit ederiz
  • Bir uygulamada bu açıktan nasıl korunuruz
  • Pratik bir uygulamada command injection gerçekleştirerek öğrendiklerimizi uyguladık

Muhtemelen fark ettiğiniz gibi aynı amaca ulaşmak için birden fazla payload kullanılabilir. Geri dönüp farklı yöntemlerle bayrağı almayı denemenizi şiddetle tavsiye ederim.


Son sorumuzu bulduk ve odayı tamamladık. Hacklemaya devam!

Pratik mükemmelleştirir. :)