ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 모의해킹의 열두 번째 자바 역직렬화 취약점 공격
    웹 해킹 2021. 3. 25. 22:52

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

    자바 프로그램상에서 어떤 객체가 생성되면 그 객체는 메모리에 상주하게 되고, 프로그램이 실행되는 동안 필요에 따라 사용된다.

    그런데 프로그램이 종료되면 메모리에 있던 객체는 사라지게 된다. 객체에는 저장한 데이터가 있는데, 그 데이터를 다음 번에 계속 사용해야 한다면, 메모리에 상주하던 객체와 그 데이터를 파일이나 데이터베이스 등에 저장해 두어야 할 것이다. 

    이때 저장을 하기 위해 객체르르 바이트 스트림이라는 순차적인 데이터로 변환하는 과정을 거치는데, 이것을 직렬화라고 한다. 역직렬화는 반대로 저장되어 있는 바이트 스트림을 다시 객체로 만들어 원래의 데이터를 다시 불러오는 과정이다.

     

    추가로 직렬화와 역직렬화는 객체 데이터를 네트워크를 통해 전송할 때에도 사용할 수 있다. 하나의 호스트 내에서 여러 개의 프로세스가 동일한 객체를 사용할 수 있도록 할 수 있고, 인터넷을 통해 여러 호스트의 프로그램이 동일한 객체를 사용하는 것도 가능해진다.

     

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

     

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

     

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

    8080번 포트로 접속한 JBoss 초기 화면

     

    /invoker/JMXInvokerServlet 요청

     

    우선 직렬화된 데이터가 어떤 식으로 표시되는지 알아보기 위해, 위 URL 접속한다.

    위 그림을 보면, 직렬화된 데이터가 전달되고 있다는 것을 알 수 있다.

    직렬화된 데이터가 전달되는 응답 메세지 확인

     

    헥스 코드에서 바이트 스트림 aced0005 확인하는 화면

     

    바디가 시작하는 부분에서 직렬화된 데이터임을 알려주는 바이트 스트림 코드를 볼 수 있다.

     

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

    ysoserial.jar 파일 다운로드 

     

    위 파일을 이용하여 공격코드를 만들 수 있다. 그렇게 임의로 생성한 페이로드를 /invoker/JMXInvokerServlet URL로 전송하여 페이로드에 지정된 명령어를 실행할 수 있게된다.

     

    우선 칼리리눅스에서 nc -lvnp 4000 명령어를 입력하여 4000번 포트를 열어 nc 명령어를 서버로 실행해 놓는다.

     

    bWAPP에서 nc 접속을 위한 명령어 입력 화면

     

    bWAPP 명령어를 실행하고 칼리 리눅스의 서버 화면

     

    ysoserial로 공격 코드를 생성하는 화면

     

    위 그림에서 CommonsCollections1은 페이로드의 한 종류로, 그 뒤에 나오는 명령어는 우리가 실행하고자 하는 명령어이고, > 은 리다이렉션으로 stdout 파일을 reverse.bin 파일로 생성하도록 해주었다.

     

    /invoker/JMXInvokerServlet URL을 리피터로 전달한 화면

     

    reverse.bin 파일을 붙인 화면

     

    reverse.bin파일을 붙이고 send한 화면

     

    리버스 접속이 이루어진 화면

     

    python을 이용하여 프롬프트가 표시되는 쉘 생성 화면

     

     

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

    CommonsCollections 패키지를 최신 버전으로 업데이트하여 공격을 예방해야 한다. 

    -    역직렬화 전에 반드시 인증 과정을 수행한다.

    -    출처를 알 수 없는 객체의 경우 역직렬화를 수행하지 않는다.

    -    직렬화된 객체에 디지털 서명이 되도록하여 역직렬화 과정에서 객체의 변조 여부(무결성)를 점검한다.

    -    가급적 최소 권한으로, 가능하다면 격리된 환경에서, 역직렬화를 수행한다.


    위 글은 화이트 해커를 위한 웹 해킹의 기술을 참고했습니다.

    댓글

Designed by Tistory.