08 Şubat 2015

Web Uygulama Denetimi - Bölüm-11: İşletim Sistemi Komutları Enjeksiyonu (Command Injection)

Web uygulama betikleri doğrudan işletim sistemi komutları çalıştırmayı destekleyen fonksiyonlara sahiptirler. Örneğin PHP’nin “exec”i, ASP’nin “wscript.shell”i gibi. Bu türden açıklıklara genellikle koruma duvarı, yazıcılar, yönlendiriciler ve diğer kurumsal sunuculara yönetsel arayüz sağlayan web uygulamalarında rastlanır.
Bu fonksiyonalitenin bulunma ihtimaline işaret olabilecek örnekler vermek gerekirse:
  • Dizin listesi görüntüleme
  • Bir dosyanın (örneğin bir log dosyasının) içeriğini metin olarak görüntüleme
  • İşletim sistemi kullanıcısı yaratma
  • ve komut satırından yapılabilecek diğer işlem ve görüntülemeler sayılabilir.
Uygulamaların sağladığı işletim sistemi komut satırı komutlarını kullanma fonksiyonu “|” (pipe) yönlendirme karakteri ve arka arkaya komut çalıştırmayı destekleyen “&”, “;”, yeni satır (new line = %0a) gibi kabuk (shell) metakarakterleri enjekte edilip kendi istediğimiz komutları girdi alanlarına girerek kötü amaçla kullanılabilir. Windows işletim sisteminde “&&” karakterlerinin kullanılması bu karakterlerden sonra gelen komutun ancak önceki komut başarı ile çalışmışsa, “||” karakterlerinin kullanılması ise önceki komut başarılı olsa da olmasa da sonra gelen komutun çalıştırılması anlamına gelir.

Karşımızda Unix ailesinden bir sunucu varsa geri tırnak “`” karakteri kullanılarak bir komutu çalıştırabiliriz. Unix kabuğunda bu karakterler arasında yer alan komut ilk olarak çalıştırılarak çıktısı içinde bulunduğu diğer komut ifadesinde kullanılır.

Unutulmaması gereken bir nokta da web sunucusu belli bir işletim sistemi üzerinde çalışsa da enjekte edilen işletim sistemi komutu başka bir işletim sistemi üzerinde çalıştırılıyor olabilir. Varsa komut sonucu veya kullanılan anahtar kelimelerden yola çıkarak bunun da kestirilmesi mümkün olmakla birlikte denetim sırasında hem Windows hem de Unix metakarakterlerini kullanmakta fayda vardır.

İşletim Sistemi Komut Enjeksiyon Açıklıklarının Tespiti


Tıpkı SQL enjeksiyonunda olduğu gibi işletim sistemi komut enjeksiyonunun sonuçlarını da doğrudan görüntüleme imkanları ile tespit etmek ve kullanmak mümkün olabileceği gibi bu açıklık mevcut olsa da çalıştıracağımız komutların sonuçlarını uygulama fonksiyonalitesi aracılığıyla görebilmek mümkün olmayabilir. Bu nedenle yine benzer şekilde zaman gecikmesi (time-delay) yöntemi en pratik olmasa da en yüksek güvenceyle bu açıklıkların tespitini sağlayacaktır.
Bir başka yöntem de eğer web sunucunun kök dizinini tahmin edebiliyorsak bu dizin veya altındaki dizinlerden herhangi birinde yeni bir dosya yaratmak olabilir. Böylece daha sonra tarayıcıdan bu dosyaya ulaşmaya çalışıp komutun başarılı olup olmadığını anlayabiliriz.
Bu açıklıkların tespiti için izlenebilecek denetim adımları aşağıdaki gibidir:
  • Aşağıdaki komut “ping” komutu loopback arayüzüne doğru çalıştırılarak 30 saniyelik bir zaman gecikmesi yaratmak için kullanılabilir. Bu komut hem Windows hem de Unix makinelerde işe yarayacaktır:
    • || ping –i 30 127.0.0.1 ; x || ping –n 30 127.0.0.1 &
  • Belli metakarakterlerin filtrelenmesi ihtimaline karşın başarı şansını yükseltmek amacıyla aşağıdaki metinlerin her biri test girdisi olarak kullanılabilir:
  • | ping –i 30 127.0.0.1 |
  • | ping –n 30 127.0.0.1 |
  • & ping –i 30 127.0.0.1 &
  • & ping –n 30 127.0.0.1 &
  • ; ping 127.0.0.1 ;
  • %0a ping –i 30 127.0.0.1 %0a
  • `ping 127.0.0.1`
  • Eğer yukarıdaki komutların çalıştırılması sırasında bir gecikme yaşanırsa –i veya –n parametresinin değerindeki değişikliklerle enjekte edilen komutun gecikmeye neden olup olmadığı netleştirilmeye çalışılır.
  • Komut enjeksiyon açıklığı tespit edildikten sonra “ls” veya “dir” gibi diğer komutlar da denenerek işletim sistemi ve dosya sistemi hakkında web uygulaması aracılığıyla bilgi alınıp alınamadığı araştırılır.
  • Eğer komut sonuçları uygulama arayüzü ile doğrudan elde edilemiyorsa şu alternatifler denenebilir:
  • Bir bant dışı kanal kullanılabilir, tftp ile hedef sunucuya araçlar yüklenebilir, telnet veya netcat ile kendi bilgisayarımıza bir ters kabuk (reverse shell) açılabilir, mail komutu ile çalıştırılan komut çıktıları SMTP ile gönderilebilir, vs.
  • Bir komutun sonuçları web kök dizinine yazılarak daha sonra bu bilgilere tarayıcıyla ulaşmaya çalışılabilir. Örneğin “dir > c:\inetpub\wwwroot\dene.txt”
  • Komut enjekte edebiliyorsak işletim sistemine erişim haklarımızı belirlemek için “whoami” gibi komutlar çalıştırılabilir. Bundan sonra arka kapı açmak, kullanıcı haklarını yükseltme (privilege escalation) saldırıları gibi aktivitelerle devam edilebilir.

Bazı durumlarda filtreleme kuralları veya başka kısıtlar nedeniyle tam bir komut enjekte etmek mümkün olmayabilir ancak yine de komut anahtarlarını değiştirme, komut çıktılarını başka yere yönlendirme (> karakteri ile) gibi saldırılar yapmak mümkün olabilir. Bunun için uygulamanın hangi komutu çalıştırdığı işlemin niteliği, üretilen sonuç / çıktı ve istemci tarafından alınan parametre bilgileri kullanılarak belirlenmeye çalışılabilir.

Yine bazı durumlarda boşluk karakterinin enjekte edilmesi engelleniyor olabilir. Bu durumda eğer karşımızda bir Unix sistem bulunuyorsa “$IFS” çevresel değişkeni kullanılarak çalışma anında bu değer yerine boşluk karakteri geçmesini sağlayabiliriz.


<<Önceki Bölüm                                                                                                      Sonraki Bölüm>>