인공지능 개발일지

[웹해킹] 역직렬화 취약점 실습 본문

보안/웹 해킹

[웹해킹] 역직렬화 취약점 실습

Prcnsi 2021. 7. 22. 18:21
728x90

1. 직렬화(Serialization)

 

  • 객체를 직렬화하여 전송 가능한(바이트 스트림) 형태로 만드는 것
  • 지원 언어: JAVA, Python, PHP, C# 등등

바이트 스트림 : 저장을 하기 위해 객체를 순차적인 데이터로 변환한 것

ex) 이진 구조 또는 구조화된 텍스트

 

 

 

2. 역직렬화(Deserialization)

  • 수신받은 데이터를 다시 원래의 형식으로 복구시키는 과정을 역직렬화라고 한다.

 

3. 역직렬화 취약점
(
Insecure Deserialization)

 

  • OWASP 2017년 Top 10에서 8위를 차지하고 있는 취약점 
  • 발생빈도와 위험도가 높다

 :직렬화되어 전송되는 데이터 변조원격으로 실행되는

 역직렬화시 문제 발생 코드를 추가하는 등의 공격으로

 기존에 구성되어 있는 데이터 구조를 변경하는 공격이가능한 취약점

OWASP TOP 8

 

 

정리하면 바이트 스트림 형태로 보내는 게 직렬화고,

바이트 스트림 형태를 사용하기 위해 데이터 구조로 다시 바꾸는 게 역직렬화다.

 

정리

 

 

 

 

 

 

4.역직렬화 공격 실습

1) Jboss접속

bee-box
자바 취약점

 

 

 

 

 

 

 

 

2) 직렬화된 객체 확인(in Burp Suite)

 

직렬화 확인 URL
다운로드

 

직렬화된 객체를 확인하기 위해 먼저 위 URL로 들어간 뒤 들어간 로그를 

버프슈트에서 찾아준다.

 

이때 아래 사진과 같이 Other binary에 체크해야지 다운로드한 이진 파일 로그를 확인할 수 있다.

 

2진파일

 

 

 

체크를 하면 아래와 같이 로그를 확인할 수 있다.

로그

 

 

확인했으면 해당 로그의 Request 탭에서 Send to Decoder로 보내준다.

디코더

 

 

 

디코더로 가면 아래처럼 직렬화된 데이터임을 알려주는 패턴 ac ed 00 05를 확인할 수 있다.

 

직렬화

이를 통해 직렬화된 데이터가 전달되고 있는 것을 알 수 있다.

 

 

 

 

 

3) 공격 코드 다운로드

다음으로는 아래 깃허브 오픈소스에서 공격코드를 다운로드하여준다.

https://github.com/frohoff/ysoserial
 

GitHub - frohoff/ysoserial: A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.

A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization. - GitHub - frohoff/ysoserial: A proof-of-concept tool for generating payloads that exploit unsafe Ja...

github.com

다운로드

 

 

다운로드 완료

 

 

 

 

 

 

4) 서버 실행(=공격 준비)

아래와 같이 각각 칼리와 비박스에서 서버를 열어준다.

참고로 비박스에 ip는 칼리의 ip이다.

 

 

<kali>

서버 실행

 <bee-box>

bee-box

 

두 서버에서 위와 같은 명령을 실행하면 커서가 깜빡거리며 서버가 실행된다.

 

따라서 칼리에서 터미널을 추가로 열어준다.

kali Terminal

 

 

 

 

 

 

5) 공격 코드(페이로드) 만들기

새로 연 터미널에서 아래와 같은 명령어로 다운로드한 ysoserial파일을 페이로드로 만들고

이를 출력 재지정으로 reverse.bin파일에 담아준다.

 

페이로드 만들기

 

 

 

 

 

6) 공격 코드 실행

루트는 아래와 같다.

HTTP history -> Send to Repeater->Paste from file->Request reverse.bin선택-> Send (bee-box 쉘 획득)

Burp suite

처음 로그 탭으로 가서 해당 탭을 Repeater로 보내준다.

 

 

repeater

 

 

 

 

리피터의 요청 탭에서 우클릭해서 paste from file로 아까 생성한 reverse파일을 추가해준다.

 

reverse.bin

 

 

파일을 추가하고 왼쪽 상단의 send로 요청을 변조해서 보낸다.

그러면 아래와 같이 이전의 열린 서버에서

<전>

 

 

bee-box로 연결된 것을 확인할 수 있다.

<후>

위  화면을 보면 root@kali로 칼리 계정의 쉘에서

비박스의 터미널(bee@bee-box$ )로 들어가졌다.

 

 

 

 

 

7) 루트 권한 획득

위 과정을 통해 원격으로 칼리에서 비박스 쉘로 접속됐다.

 

예시로 ls명령어를 입력해보면 비박스의 목록이 나온다.

 

그리고 exam이라는 디렉터리도 잘 만들어진다.

 

마지막으로 gedit을 실행해보면 bee-box에서는 아무것도 건들지 않았는데아래 오른쪽 화면처럼 gedit이 실행된다.

 

루트 계정 탈취

 

 

 

 

아래는 참고로 exam 디렉터리가 잘 만들어졌는지 bee-box에서 확인한 화면이다.

mkdir확인

 

 

5. 대응

  • 우선 사용자 입력을 신뢰하지 않는 것
  • 직렬화된 객체에 대한 무결성 심사 및 역직렬화의 엄격한 형식 제약조건을 적용
  • 지속적인 역직렬화 요청을 감시
  • 역직렬화 예외나 실패에 대한 로그를 남기는 것
  • 공격을 사전에 알아차릴 수 있을 것
  • 역직렬화의 입력을 사용하지 않는 것
  • 원시 데이터 유형만을 허용하는 직렬화 매체
  • 지속적인 보안패치
728x90