ShellShock Exploit
Last updated
Last updated
"Shellshock" ya da "Bash Bug" olarak bilinen zafiyet özellikle Unix tabanlı işletim sistemlerini ve Linux'u etkileyen bir açıktır. Bu açık, Bash adlı kabuk (shell) programında bulunan bir zafiyetten kaynaklanmaktadır. 2014 yılında keşfedilmiş olup geniş çapta yaygın olan bu işletim sistemlerini etkileyebilecek güce sahipti.
ShellShock, saldırganların kötü niyetli komutlarını hedef sistemde çalıştırmasına izin veren bir açık olarak kabul edilir. Bu tür bir açık, saldırganın sistemlere yetki kazanmalarına veya hassas bilgilere erişim sağlamalarına olanak tanır. Özellikle de sunucular için büyük bir tehdit oluşturdu ve birçok sistem yönetici için ciddi bir güvenlik riskini beraberinde getirdi.
ShellShock, makalemizin başından da anlayacağımız üzere bir Bash açığıdır. Bu yüzden ilk olarak Bash nedir? bununla başlayalım.
Bash veya Boune-Again Shell terminal veya komut yorumlayıcısı olarak adlandırılan alana yazılan komutları yorumlayan komut yorumlayıcısır. Örnek olarak "ls" komutunu verebiliriz ve aşağıdaki resimlerdende göreceğimiz gibi bir komut yorumlayıcısı olduğunu kanıtlıyoruz.
Ayrıca Linux işletim sistemimizde mevcut olan Bash kabuklarını da görüntüleyebiliyoruz.
Her şeyden önce Bash nedir? , ne işe yarar? bununla ilgili kısa bir bilgi edindik. Şimdi bu zafiyetimizin kaynağının ne olduğuna bakalım. Açıklığın ana nedeni, özellikle ortam değişkenlerinin belirli tipteki komutları işlemesine izin vermesi nedeniyle ortaya çıkmıştır. Bu durum, saldırganların ortam değişkenleri aracılığıyla sistemde çalışan uygulamalar üzerinden komut yürütmesine olanak tanır.
Bu güvenlik açığının ana nedeni özetle, Bash'in ortam değişkenlerinde saklanan komutları çalıştırabilme yeteneğidir.
Biraz kafa karıştırıcı anlayabiliyorum o yüzden her şeyi açıklayarak gitmeye özen gösteriyorum. Buradaki "Ortam Değişkeni" dediğimiz olay nedir buna bakalım.
Bash ortam değişkenleri, bir işletim sistemi kabuğunda (shell) çalışan süreçlerin davranışlarını ve yapılandırmalarını belirlemek için kullanılan ad-değer çiftleridir. Ortam değişkenleri, genellikle büyük harflerle yazılan ve belirli işlevler için kullanılan özel değişkenlerdir. Bu değişkenler, bir kullanıcı oturumu boyunca veya belirli bir süreç tarafından erişilebilir ve değiştirilebilir.
Ortam değişkenleri, hem sistem genelinde (global) hem de oturum başına (local) tanımlanabilir. Örneğin, bir kullanıcı oturumu başlatıldığında belirli varsayılan ortam değişkenleri otomatik olarak ayarlanır. Bunlar, sistem yapılandırma dosyaları (örneğin, /etc/profile
) ve kullanıcıya özel yapılandırma dosyaları (örneğin, ~/.bashrc
veya ~/.profile
) aracılığıyla ayarlanabilir.
Yaygın Ortam Değişkenleri
PATH: Yürütülebilir dosyaların aranacağı dizinlerin listesini belirtir. Bu değişken, kullanıcı bir komut girdiğinde işletim sisteminin bu komutun yerini bulabilmesi için kullanılır.
HOME: Kullanıcının ev dizinini belirtir.
USER: Şu anki kullanıcı adını belirtir.
SHELL: Kullanıcının varsayılan kabuğunu belirtir.
LANG veya LC_ değişkenleri*: Sistem dil ve yerel ayarlarını belirtir.
PWD: Mevcut çalışma dizinini belirtir.
gibi örnekler verebiliriz.
Şimdi devam edelim ve bununla ilgili bir örnek yapalım. Bu örnek aslında bizim sistemimiz de herhangi bir Bash açığı var mı bununla ilgili bir kontrol de sağlamaktadır.
Sistemimde şu anda herhangi bir Bash açığı bulunmamaktadır. Ancak, yukarıda yazdığımız komutu tek tek açıklayalım ve kafamız karışmasın.
env Komutu:
Öncelikle, env
komutu Unix tabanlı sistemlerde ortam değişkenlerini görüntülemek veya bir komutu belirli bir ortam değişkenleri kümesiyle çalıştırmak için kullanılır. Bu komut, belirli bir komutu çalıştırırken geçici olarak ortam değişkenlerini ayarlamaya olanak tanır. Bu tanımdan da anlayacağımız üzere, env
komutu ile "x" adında bir ortam değişkeni tanımlıyoruz.
Fonksiyon Tanımlaması:
Daha sonrasında, kafamızı karıştıran kısım () { :;};
bu betiğimiz. Bu betiği tek tek açıklayalım. env
komutu ile "x" değişkenine bir değer atıyoruz, bu değer ()
yani fonksiyon tanımlamasıdır.
Fonksiyon Gövdesi:
{ :;};
bu kısım ise fonksiyonun gövdesini belirler. İçerisindeki :
işareti, Bash'de no-op yani hiçbir şey yapmayan bir komuttur. ;
ile bu komutu sonlandırıyoruz.
Bash -c:
Bash -c
ise burada Bash'e hemen ardından gelen komut dizisini çalıştırmasını söyler.
Buraya kadar anladığımızı düşünüyorum. Eğer sistemde herhangi bir bash zafiyeti olsaydı, bizim oluşturmuş olduğumuz "x" ortam değişkeni ile komut yürütebilecektik. Yani ekranda "this is a test" yerine "aciklik_mevcut" yazacaktı.
ShellShock'un bir bash açığı olduğunu öğrendik. Peki bu açığı nasıl sömürebiliriz biraz da bu konuya değinelim.
İlk sömürü vektörlerimizden biri CGI tabanlı web sunucularıdır. Ancak önce CGI nedir ona bakalım. CGI (Common Gateway Interface), web sunucuları ile harici programlar arasında iletişimi sağlayan bir protokol ve ara yüz standardıdır. CGI, web tarayıcılarından gelen istekleri işleyerek dinamik web sayfaları oluşturmak için kullanılır. Örneğin, bir kullanıcının bir web formunu doldurduğunda ve gönderdiğinde, form verilerini işleyen ve sonuçları kullanıcıya sunan bir CGI betiği çalıştırılabilir. CGI, bu tür kullanıcı etkileşimlerini işlemek için çok yönlü bir yol sunar.
Yukarıdaki örneği görsel bir şekilde anlamaya çalışalım. İlk olarak, kullanıcı bir HTTP Request isteği gönderiyor ve bu istek sunucuya ulaşıyor. Ardından, sunucu bu isteği CGI Programına gönderiyor ve CGI Programı veritabanına bir sorgu gönderiyor. Sonrasında işler tam tersine dönüyor; Veritabanı CGI programına cevap göndererek, CGI Programı da sunucuya isteklerini ileterek en son sunucu, tarayıcıya yani kullanıcıya HTTP Response'u gösteriyor. İşte tam burada yukarıda bahsettiğimiz gibi, bir form olsaydı ve kullanıcı web formunu doldurduğunda ve gönderdiğinde, form verilerini işleyen ve sonuçları kullanıcıya sunan bir CGI betiği çalıştırılsaydı, bu açıktan yararlanılabilirdi.
Makalemden anlaşılacağı üzere tek tek ve yavaş yavaş ilerliyorum bu yüzden öncelikle OpenSSH hakkında bilgilendirme yapacağım. SSH, veya Secure Shell, kullanıcılara sunucularını internet üzerinden kontrol etmelerini ve düzenlemelerini sağlayan uzak yönetim protokolüdür. SSH, şifreleme tekniğini kullanarak uzaktaki sunucuya giden ve uzaktaki sunucudan gelen tüm iletişimlerin şifrelendiğinden emin olur. Ayrıca, uzak bir kullanıcının kimliğini doğrulamak, istemciden ana bilgisayara girişleri aktarmak ve çıktıyı istemciye geri göndermek için bir mekanizma sağlar.
Tanımdan anladığımız üzere, SSH uzaktan kontrol mekanizması sağlar. Ancak, bu ShellShock zafiyetimizin kökeni olarak karşımıza çıkıyor. Bir SSH sunucusuna bağlanmak için ne yapmamız gerektiğine bakalım. Mantıklı olarak, uzaktan kontrol etmemiz için bir bağlantı göndermemiz gerekiyor. Örnek olarak:
bu şekilde bir bağlantı gönderebiliriz. Peki, bunun bağlantıyla ve bizim ShellShock zafiyetimizle ne ilgisi var? Yukarıda CGI tabanlı programlamada bahsetmiştik, bir CGI betiği çalıştırabilir diye. Burada ise saldırgan, SSH sunucusuna bağlanırken sunucuda ShellShock yani bash zafiyeti varsa, bunu kullanarak gerekli verileri elde edebilir. Peki bunu nasıl yapabilir bununla ilgili de hemen örnek verelim.
SSH {USER}@{HOST} '() { :; }; /USR/BİN/İD'
Saldırgan eğer bir Bash açığı varsa makalemizin başında da anlattığım gibi bu zafiyetten yararlanarak id bilgilerine ulaşım sağlayabilir.
Diğer bir sömürü vektörü olan DHCP sistemleri ile devam edelim. DHCP, Dinamik Ana Bilgisayar Yapılandırma Protokolü anlamına gelir. İnternet Protokolü (IP) ağlarında kullanılan bir ağ yönetimi protokolüdür. Bu protokolde, bir DHCP sunucusu ağdaki her aygıta dinamik olarak bir IP adresi ve diğer ağ yapılandırma parametrelerini atar, böylece aygıtlar diğer IP ağlarıyla iletişim kurabilirler.
Hemen tekrardan DHCP ile ShellShock arasındaki ilişkiye bakalım. DHCP sistemleri genellikle Unix tabanlı işletim sistemlerinde çalışır. Bu da bizi ShellShock zafiyeti için bir adım ileriye götürüyor. Ayrıca, DHCP ile aynı ağda bulunan tüm kullanıcıların komut satırına erişebilmesi, bu zafiyetin daha da tehlikeli hale gelmesine neden olur. Söz konusu zafiyeti istismar etmek için bir payload çalıştırıldığında, ciddi güvenlik sorunları ortaya çıkabilir.
Payload: Siber güvenlik terimlerinden biridir ve genellikle kötü niyetli amaçlar için kullanılan bir yazılım veya veri parçasını ifade eder. Genellikle bir saldırganın hedef sistemde belirli bir eylemi gerçekleştirmesini sağlamak için tasarlanmış olan, genellikle zararlı bir kod içeren bir dosya veya komut dizisidir.
Bu sömürü vektörü ile ilgili örneğimizde aşşağıdaki resimde bulabilirsiniz.
Burada ek ayarlar kısmına 114 servisinde bir komut dizisi gönderiyoruz. Artık bu komut dizilerine aşina olduk diyebiliriz. Yukarıda bahsetmiştik aslında burada karşı tarafın komut dizesine bir payload yolluyoruz.
Bu gördüğümüz resimde ise bizim göndermiş olduğumuz payloadın karşı tarafın komut dizisinde çalıştığını görebiliyoruz. Burada 'foo' yazdırmak yerine neler yapılabileceğini düşünebiliyor musunuz?
Makelimizin sonuna gelmiş bulunmaktayız. Bu makaleden anlayacağımız üzere ShellShock yani Bash açığı oldukça zararlı bir zafiyet olarak karşımıza gelmektedir. Burada yaygın olarak kullanılan sömürü vektörlerinden bahsettik. Umarım bu makale yardımcı olmuştur. Son olarak böyle bir zafiyetle karşı karşıya kalmak istemiyorsanız güncellemelerinizi yapmayı unutmayın...