Java deserialization: ysoserial

Setup

log4j.rootLogger=DEBUG, consoleAppender, fileAppender

log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n

log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n
log4j.appender.fileAppender.File=demoApplication.log

Running the log4j server. We run it on port 5111 (first argument) with config.properties as config file(2nd argument)

$ java -jar JankenTestLogServer.jar 5111 config.properties # this will run a server on port 5111 listening for socket connection
# config.properties file is described above in setup

Finding the bug

Open JankenTestLogServer.jar with jadx to view the source code.

The code starts Listening on port provided(5111 in our case) and whenever there is a new connection a new Thread is spawn to fulfil the socket request. The following code is responsible for that:

So lets inspect SocketNode function. Its imported from import org.apache.log4j.net.SocketNode;. Lets open SocketNode.java

So the Input from socket stream is read directly into ObjectInputStream and this is where Deserialization occurs. So we just need to send a serialized rce object and this will get us rce.

Exploit

Enjoy the rce

Last updated