[TR] ShellShock Zafiyeti Nedir?

Anıl Çelik
5 min readSep 18, 2020

Herkese merhaba.

Bu yazımda, CVE-2014-6271 kodlu güvenlik açığı olan ShellShock zafiyetinden bahsediyor ve devamında da buna dair örnek olarak bu güvenlik açığına sahip bir sanal makine üzerinden bu zafiyetin sömürülmesini gösteriyor olacağım.

ShellShock zafiyeti nedir?

ShellShock, BashBug veya BashDoor olarak adlandırılan zafiyet, UNIX tip işletim sistemlerinde bulunan ve kullanıcının bir komut satırı üzerinden kullanmakta olduğu sistemle etkileşime geçmesini sağlayan komut satırı olan Bash Shell’i hedef almaktadır ve genel olarak sistem üzerindeki Web Sunucuları üzerinden sömürülmektedir. Bu zafiyet başarılı bir şekilde sömürüldüğü takdirde, saldırgana Arbitrary Code Execution (ACE) olanağı sağlamaktadır. Arbitrary Code Execution ise bir sistem veya bir sistem üzerinde çalışan bir program üzerinde istenilen herhangi bir komutun veya komutların çalıştırılarak o sistemin veya programın saldırgan tarafından istenilen şekilde manipüle edilebilmesidir.

ShellShock nasıl çalışmaktadır?

Web sunucularında bulunan CGI (Common Gateway Interface) standardı, bu sunucular üzerinde web uygulaması çalıştırmaya yaramaktadır. Aşağıdaki figürde CGI’ın çalışma mantığını görebilirsiniz:

Referans: CGI Interface

Sunucu üzerinde genellikle “/cgi-bin/” dizininde bulunan ve CGI tarafından çalıştırılan uygulama(lar) C, C++, Perl ve daha fazla türdeki uygulamalar olmakla birlikte, bunlara ek olarak en önemlisi UNIX Shell Scriptleri de çalıştırabildiği için, kendisine gelen Bash Shell komutlarını da çalıştırabilmektedir ve bu da CGI’a sahip web sunucularını bu zafiyete karşı savunmasız bırakmaktadır. Bu zafiyet sadece CGI’a sahip web sunucularını etkilemekle kalmamakla birlikte, OpenSSH Server, DHCP Clients, Qmail Server ve IBM HMC Restricted Shell gibi yapıları da etkileyebilmektedir.

UNIX sistemlerde bulunan ve Environment Variables adı verilen değişkenler, sistem içerisindeki shell çağrıldığında o shell’in nasıl çalışacağını belirleyen ve sistem üzerindeki uygulamaların ve işlemlerin birbirleriyle konfigürasyon ayarlarını paylaşmasını sağlamaktadır. ShellShock zafiyetinde ise, özel olarak oluşturulan Environment Variablelarla birlikte oluşturulmakta olan fonksiyon tanımlamalarıyla birlikte gelen rastgele komutlar, bu güvenlik açığının başarılı bir şekilde sömürülmesine olanak sağlamaktadır. Bu Environmental Varieablelar aşağıdaki şekildedir:

env x=’() { :;}; echo vulnerable’ bash -c “echo not vulnerable”

Burada sistem üzerinde “x” adında bir Environment Variable oluşturup, devamında gelen özel karakterler ile eğer sistem ShellShock zafiyetine karşı savunmasızsa ekranda “vulnerable” yazısı, eğer sistem ShellShock zafiyetine karşı savunmasız değilse de ekranda “not vulnerable” yazısının yazdırılmasını beklemekteyiz. ShellShock zafiyetine karşı savunmasız olmayan bir sistemde bu komutu çalıştırdığımızda:

Gördüğümüz gibi “not vulnerable” yazısını görmekteyiz.

Not: Bir variable’a bir integer, float veya string bir değer atayabiliriz ancak bir variable’a atanan değer asla ama asla bir komut çalıştırmamalıdır. Bu zafiyette ayrıca bu kısıtlama da aşılmaktadır.

Şimdi bu Environment Variablelara bir de HTTP üzerinden bakalım:

Bir Web Sunucusuna bir HTTP isteği gönderildiğinde, gönderilen bu istek içerisinde Header bilgilerinin de dahil olduğu bazı bilgiler gitmektedir. Örneğin https://medium.com’a bir HTTP isteği gönderelim:

Buradaki örnekte, giden Header bilgileri içerisinde yapılmakta olan HTTP isteğinin türünün GET olduğunu ve HTTP 1.1 ile Persistent bir bağlantı sağladığımızı, Host olarak bahsetmiş olduğumuz medium.com adresinin bulunduğunu, User-Agent kısmında bu isteği göndermekte olduğumuz Browser’ın türü gibi çeşitli bilgiler görmekteyiz. Burada, bu isteği göndermekte olduğumuz web sunucusu örneğin bizim User-Agent bilgimizi çözümleyerek hangi Browser’ı kullandığımızı bilmek isterse, bizim göndermekte olduğumuz bu bilgiler sunucu içerisinde birer variable’a dönüşür ve bu şekilde işlenir. Tam da bu noktada, dönüştürülmekte olan bu variablelar üzerinden aşağıdaki gösterildiği gibi ShellShock zafiyetini tetiklemeye çalışabiliriz.

User-Agent:() { :;}; /bin/bash -c ‘ping <remote_host>; cat /etc/passwd’

Eğer karşı taraftaki sunucu ShellShock zafiyetine karşı savunmasızsa, çalıştırmakta olduğumuz bu komut ile karşı sunucuda “/etc” dizini altında bulunan ve sistem kullanıcı bilgilerini barındıran “passwd” dosyasını okuyabiliyor olacağız.

Şimdi teorik kısmı bitirerek uygulama kısmına geçelim.

Uygulama

Uygulama esnasında, PentesterLab tarafından oluşturulmuş ve VulnHub üzerinde bu linkte sunulmakta olan zafiyetli makineyi kullanacağım. Makineyi sistemimize indirdikten ve saldırıyı gerçekleştireceğimiz makine (Kali) ile aynı local network’e bağladıktan sonra, basit bir nmap taraması gerçekleştirip hedef sistem üzerindeki açık portları tarayıp bunlar üzerinde bulunabilecek olası zafiyetlerin taramasını yapabiliriz. Bunun için gerekli komut:

nmap -Pn -A -vv — script=vuln <REMOTE_HOST>

Görüldüğü gibi sistem üzerinde SSH portu ve HTTP portu açık bulunmakta. HTTP servisini ziyaret edelim:

HTTP servisini ziyaret ettiğimizde, bu zafiyete özel olarak hazırlanmış bir index sayfasıyla karşılaşıyoruz. Sayfada görebileceğimiz gibi sistemin ayakta olduğu süreyi gösteren bir “uptime” ve “kernel” değişkenleri görülmekte. Sayfa kaynağını incelediğimizde:

Bu verilerin “/cgi-bin/status” dizininden çekildiğini görüyoruz. Şimdi bu dizine bir HTTP isteği gönderebilir ve göndermekte olduğumuz bu isteği manipüle ederek sistem üzerinden bilgiler elde etmeye çalışabiliriz:

Gördüğümüz gibi kendi local makinemize bir ping gönderebiliyor ve “/etc/passwd” dosyasını başarılı bir şekilde okuyabiliyoruz. Şimdi de sistem üzerinden local makinemize bir reverse shell elde etmeye çalışalım.

İsteği gönderelim:

Ve isteği gönderdiğimizde:

Reverse shell’i de başarılı bir şekilde elde etmekteyiz.

ShellShock zafiyeti ile ilgili sizlerle paylaşmak istediklerim bu kadardı. Yazımı okuduğunuz için teşekkür ederim.

Bir sonraki yazımda görüşmek üzere.

Referanslar:

--

--