mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-22 19:13:39 +00:00
115 lines
5.5 KiB
Markdown
115 lines
5.5 KiB
Markdown
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
|
|
Neste POST, será explicado um exemplo usando `java.io.Serializable`.
|
|
|
|
# Serializable
|
|
|
|
A interface Java `Serializable` (`java.io.Serializable` é uma interface de marcador que suas classes devem implementar se forem **serializadas** e **desserializadas**. A serialização de objetos Java (escrita) é feita com o [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) e a desserialização (leitura) é feita com o [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html).
|
|
|
|
Vamos ver um exemplo com uma **classe Person** que é **serializável**. Esta classe **sobrescreve a função readObject**, então quando **qualquer objeto** desta **classe** é **desserializado**, esta **função** será **executada**.\
|
|
No exemplo, a **função readObject** da classe Person chama a função `eat()` de seu animal de estimação e a função `eat()` de um Dog (por algum motivo) chama um **calc.exe**. **Vamos ver como serializar e desserializar um objeto Person para executar esta calculadora:**
|
|
|
|
**O seguinte exemplo é de [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)**
|
|
```java
|
|
import java.io.Serializable;
|
|
import java.io.*;
|
|
|
|
public class TestDeserialization {
|
|
interface Animal {
|
|
public void eat();
|
|
}
|
|
//Class must implements Serializable to be serializable
|
|
public static class Cat implements Animal,Serializable {
|
|
@Override
|
|
public void eat() {
|
|
System.out.println("cat eat fish");
|
|
}
|
|
}
|
|
//Class must implements Serializable to be serializable
|
|
public static class Dog implements Animal,Serializable {
|
|
@Override
|
|
public void eat() {
|
|
try {
|
|
Runtime.getRuntime().exec("calc");
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
System.out.println("dog eat bone");
|
|
}
|
|
}
|
|
//Class must implements Serializable to be serializable
|
|
public static class Person implements Serializable {
|
|
private Animal pet;
|
|
public Person(Animal pet){
|
|
this.pet = pet;
|
|
}
|
|
//readObject implementation, will call the readObject from ObjectInputStream and then call pet.eat()
|
|
private void readObject(java.io.ObjectInputStream stream)
|
|
throws IOException, ClassNotFoundException {
|
|
pet = (Animal) stream.readObject();
|
|
pet.eat();
|
|
}
|
|
}
|
|
public static void GeneratePayload(Object instance, String file)
|
|
throws Exception {
|
|
//Serialize the constructed payload and write it to the file
|
|
File f = new File(file);
|
|
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
|
|
out.writeObject(instance);
|
|
out.flush();
|
|
out.close();
|
|
}
|
|
public static void payloadTest(String file) throws Exception {
|
|
//Read the written payload and deserialize it
|
|
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
|
|
Object obj = in.readObject();
|
|
System.out.println(obj);
|
|
in.close();
|
|
}
|
|
public static void main(String[] args) throws Exception {
|
|
// Example to call Person with a Dog
|
|
Animal animal = new Dog();
|
|
Person person = new Person(animal);
|
|
GeneratePayload(person,"test.ser");
|
|
payloadTest("test.ser");
|
|
// Example to call Person with a Cat
|
|
//Animal animal = new Cat();
|
|
//Person person = new Person(animal);
|
|
//GeneratePayload(person,"test.ser");
|
|
//payloadTest("test.ser");
|
|
}
|
|
}
|
|
```
|
|
## Conclusão
|
|
|
|
Como você pode ver neste exemplo muito básico, a "vulnerabilidade" aqui aparece porque a função **readObject** está **chamando outras funções vulneráveis**.
|
|
|
|
|
|
{% hint style="success" %}
|
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Compartilhe truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
{% endhint %}
|