ShellShock Zafiyeti (CVE-2014-6271) Nedir? Nasıl Çalışır?

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 haiz bir sanal makine üstünden bu zafiyetin sömürülmesini gösteriyor olacağım.

ShellShock zafiyeti nedir?

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

ShellShock nasıl iş koşturmacasındadır?

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

Sunucu üstünde çoğu zaman “/cgi-bin/” dizininde bulunan ve CGI tarafınca çalıştırılan uygulama(lar) C, C++, Perl ve daha çok türdeki uygulamalar olmakla beraber, 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 haiz web sunucularını bu zafiyete karşı savunmasız bırakmaktadır. Bu zafiyet bir tek CGI’a haiz web sunucularını etkilemekle kalmamakla beraber, OpenSSH Server, DHCP Clients, Qmail Server ve IBM HMC Restricted Shell şeklinde yapıları da etkileyebilmektedir.

UNIX sistemlerde bulunan ve Environment Variables isminde olan değişkenler, sistem içindeki shell çağrıldığında o shell’in nasıl çalışacağını belirleyen ve sistem üstündeki uygulamaların ve işlemlerin birbirleriyle konfigürasyon ayarlarını paylaşmasını sağlamaktadır. ShellShock zafiyetinde ise, hususi olarak oluşturulan Environment Variablelarla beraber oluşturulmakta olan fonksiyon tanımlamalarıyla beraber gelen rastgele komutlar, bu güvenlik açığının başarıya ulaşmış bir halde 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 üstünde “x” isminde bir Environment Variable oluşturup, devamında gelen hususi 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 şeklinde “not vulnerable” yazısını görmekteyiz.

Not: Bir variable’a bir integer, float yada string bir kıymet atayabiliriz sadece bir variable’a atanan kıymet asla fakat asla bir komut çalıştırmamalıdır. Bu zafiyette ek olarak bu engelleme da aşılmaktadır. 

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

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

Buradaki örnekte, giden Header detayları içinde yapılmakta olan HTTP isteğinin türünün GET bulunduğ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ü şeklinde çeşitli bilgiler görmekteyiz. Burada, bu isteği göndermekte olduğumuz web sunucusu mesela bizim User-Agent bilgimizi çözümleyerek hangi Browser’ı kullandığımızı bilmek isterse, bizim göndermekte olduğumuz bu bilgiler sunucu içinde birer variable’a dönüşür ve bu şekilde işlenir. Tam da bu aşamada, dönüştürülmekte olan bu variablelar üstünden aşağıdaki gösterildiği şeklinde 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 kuramsal kısmı bitirerek uygulama kısmına geçelim. 

Uygulama

Uygulama esnasında, PentesterLab tarafınca oluşturulmuş ve VulnHub üstünde bu linktegösterilmekte 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 sonrasında, kolay bir nmap taraması gerçekleştirip hedef sistem üstündeki açık portları tarayıp bunlar üstünde bulunabilecek ihtimaller içinde zafiyetlerin taramasını yapabiliriz. Bunun için lüzumlu komut:

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

Görüldüğü şeklinde sistem üstünde SSH portu ve HTTP portu açık bulunmakta. HTTP servisini ziyaret edelim:

HTTP servisini ziyaret ettiğimizde, bu zafiyete hususi olarak hazırlanmış bir index sayfasıyla karşılaşıyoruz. Sayfada görebileceğimiz şeklinde 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 üstünden bilgiler elde etmeye çalışabiliriz:

Gördüğümüz şeklinde kendi local makinemize bir ping gönderebiliyor ve “/etc/passwd” dosyasını başarıya ulaşmış bir halde okuyabiliyoruz. Şimdi de sistem üstünden 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ıya ulaşmış bir halde 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 suretiyle.

Referanslar:


Merhaba, beni Instagram'da takip etmeyi unutmayın : @tahamumcu
Taha Mumcu
Ben Taha Mumcu, Bilişim sektöründe uzun süreden beri tecrübe edinerek bir yerlere gelmek için çalışmalarına devam eden ve sektörü yakından takip ederek hiç bir veriden geri kalmayan, girişimci ruhu ile tüm işlere elinden geldiğinde çalışma yapan bir girişimciyim. Henüz genç yaşta birçok tecrübeye ulaşan ve koyulan engelleri aşarak bir yerlere gelmek için çaba göstermekten çekinmiyorum.