0% found this document useful (0 votes)
60 views

Exploiting Deserialization Vulnerabilities in Java

The document discusses exploiting deserialization vulnerabilities in Java applications. It describes how to find and exploit object deserialization calls to achieve remote code execution. A specific exploit is described that uses the Apache Commons Collections library to dynamically invoke methods via reflection.

Uploaded by

20dominic
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
60 views

Exploiting Deserialization Vulnerabilities in Java

The document discusses exploiting deserialization vulnerabilities in Java applications. It describes how to find and exploit object deserialization calls to achieve remote code execution. A specific exploit is described that uses the Apache Commons Collections library to dynamically invoke methods via reflection.

Uploaded by

20dominic
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 38

Exploiting Deserialization

Vulnerabilities in Java
HackPra WS 2015
2015/10/28
Matthias Kaiser
About Code White

▪ Pentest and Security Research Startup


▪ Based in Ulm
▪ Attacking corporate infrastructures in Red Teams
▪ Strong focus on post-exploitation
▪ Love to use 0day-angle to get initial hop
▪ AV is our best friend to gain SYSTEM
▪ Always looking for candidates ;-)

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 2


About me

▪ Head of Vulnerability Research at Code White


▪ Doing Technical Security for 6 years now
▪ Worked as Java Dev for a defense company
▪ Lead Expert Offensive Security at an automotive IT company
▪ Likes to find easy bugs in Java Software
▪ Found vulns in products of Oracle, IBM, SAP, Symantec, Apache, Adobe, Atlassian, etc.
▪ Enjoys low-level stuff recently
▪ @matthias_kaiser

2015/10/28 Exploiting Deserialization Vulnerabilities in Java 3


Why this talk?

▪ Deserialization vulnerabilities are less known and exploited (compared to unserialize() in


PHP)
▪ A dedicated bug class on its own
▪ Only a few researchers disclosed deserialization vulnerabilities like Takeshi Terada, @djorm,
@gebl & @frohoff, etc.
▪ Easy to spot, easy RCE if the right classes are in the classpath
▪ I spent research time of CW to analyze several products of Oracle, Atlassian, Apache, etc.
▪ Only my Atlassian Bamboo vulnerability is patched, more RCEs to come ☺

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 4


Disclaimer

▪ This is not a reference how Serialization works, I skip details for speed. Read the spec.
▪ This talk does _not_ cover Privileged Deserialization (from @samikoivu) used to escape the
JVM Sandbox
▪ Custom Serialization Frameworks like XStream, Castor etc. won’t be discussed although the
exploitation vectors shown here can be applied to XStream

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 5


Agenda

1 What is serialization?

2 What‘s the issue?

3 How to exploit it?

4 Where is serialization used?

5 Case-Study: CVE-2015-6576

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 6


1 What is serialization?

To serialize an object means to convert its


state to a byte stream so that the byte stream
can be reverted back into a copy of the object
(x)

(x) https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 7


1 What is serialization?

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 8


1 What is serialization?

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 9


1 What is serialization?

Class java.io.ObjectOutputStream
▪ Writes serialized data to an OutputStream
▪ Has methods writeObject(), writeChar(), writeShort(), writeUTF(), etc.

Class java.io.ObjectInputStream
▪ Reads serialized data from an InputStream
▪ Has methods readObject(), readChar(), readShort(), readUTF(), etc.

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 10


1 What is serialization?

Customizing serialization
▪ Developers can customize how objects are serialized to bytes /deserialized from bytes
▪ Serializing
1. writeReplace() → Developer can provide a replacement object to be serialized
2. writeObject() → Full control over what will written to the stream
▪ Deserializing
1. readObject() → Full control over what will be read from the stream
2. readResolve() → Replacing a deserialized object with another one

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 11


1 What is serialization?

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 12


1 What is serialization?

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 13


2 What‘s the issue?

▪ ObjectInputStream does not check which class gets deserialized


▪ There is no whitelist/blacklist which classes are allowed to get deserialized
▪ All serializable classes that the current classloader can locate and load can get deserialized
▪ Although a class cast exception might occur in the end, the object will be created!
▪ User supplied input can be processed in readObject()/ readResolve()
▪ If a class does something “dangerous” in readObject()/ readResolve() it might get abused
▪ Case-Study:

Apache Commons FileUpload (CVE-2013-2186)

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 14


2 What‘s the issue?

Apache Commons FileUpload


▪ Makes your life easy when dealing with HTTP file uploads
▪ Just add to your webapp and uploads are easy

CVE-2013-2186:

▪ But requires the null-byte vulnerability, patched in Java 7u40 or Java8

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 15


2 What‘s the issue?

▪ Values of the object are read with


defaultReadObject()
▪ getOutputStream() gets called

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 16


2 What‘s the issue?

▪ Calls getTempFile()

▪ Creates new File


▪ repository is a member of the class under
our control
▪→we can put a \u0000 at the end of
repository path

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 17


3 How to exploit it?

▪ Finding ObjectInputStream.readObject() calls on user supplied input is easy


▪ You can decompile and grep for it … / “Open Call Hierarchy” in Eclipse ☺
▪ The question is how you can turn a ObjectInputStream.readObject() call into RCE
▪ Several universal exploitation vectors exist:
▪ Spring Framework <=3.0.5, <=2.0.6 (cve-2011-2894 of @woutercoekaerts)
▪ Groovy < 2.4.4 (cve-2015-3253 of @gebl & @frohoff)
▪ Apache Commons Collection (cve-xxxx-xxxx of @gebl & @frohoff)
▪ More to come … (e.g. cve-xxxx-xxxx of @matthias_kaiser)
▪ @gebl & @frohoff were so kind and published “ysoserial” to make exploitation easy …
▪ Let’s find out how an universal exploit for Apache Commons Collection works

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 18


3 How to exploit it?

Apache Commons Collection Exploit


▪ I adapted the one from @gebl /@frohoff to skip what a java.lang.reflect.Proxy is ☺
▪ It’s just AWESOME, because Commons Collection is almost everywhere in the classpath
▪ Disclosed 274 days ago at AppSec California 2015, still not patched
▪ Self-executing, just send the stream and wait for ObjectInputStream.readObject()
▪ The vulnerabilities are in several Collection implementations (Map, Set, etc.)
▪ A TransformedMap can be created that invokes methods via reflection (=dynamically)
▪ An InvocationHandler from the “sun.”-namespace is used to trigger the vulnerability

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 19


3 How to exploit it?

▪ The TransformedMap transforms keys/values when stored into the map (put(), putAll())
▪ Therefore the keyTransformer/valueTransformer are invoked
▪ All elements of the Map are stored in a set of Map.Entry objects

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 20


3 How to exploit it?

▪ When the value of a Map.Entry object is changed, the valueTransformer is invoked

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 21


3 How to exploit it?

▪ Transformers can be chained using a ChainedTransformer

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 22


3 How to exploit it?

1
1. Constructor takes the method to invoke,
argument types and the arguments
2. Invokes the method on the input object
and returns the method return value
2

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 23


3 How to exploit it?

▪ Now we need a serializable class that calls Map.Entry.setValue() in a readObject() or


readResolve() method to get code execution

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 24


3 How to exploit it?

▪ Member type is of class Class, memberValues of class Map!


▪ Constructor is package-private and performs some checks before setting the members

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 25


3 How to exploit it?

1. Read in default values (type,


1 memberValues)

2 2. type is a annotation type. We can use


java.lang.annotation.Target.class
3. memberValues is a map
implementation of our choice
4 3
5 4. memberValue is a of Map.Entry
5. If our map contains an entry like
6
(“value”,”value”) we can pass the checks
6. memberValue.setValue is invoked!

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 26


3 How to exploit it?

1. Since the constructor of


AnnotationInvocationHandler is
package-private, we need to make it
accessible/callable using reflection
2. We create a new instance using our
1 parameters with reflection
2

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 27


3 How to exploit it?

No Groovy or Commons Collection in the Classpath?


▪ Look for readObject(), readResolve() doing „nasty“ things
▪ Java has the concept of Proxies that forward method calls to InvocationHandler
▪ So take another look for serializible InvocationHandler, because they often do reflection
magic on user input
▪ There is more to come, several researchers are working in this topic
▪ As soon as my vulnerabilites are fixed I will release the vectors on our blog/github

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 28


4 Where is Serialization used

▪ Remote Method Invocation (RMI/JRMP)


▪ Custom RMI/IPC protocols (e.g. Spring HTTP invoker, …)
▪ Java Management Extension (JMX)
▪ Java Messaging Service (JMS)

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 29


5 Case-Study: CVE-2015-6576

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 30


5 Case-Study: CVE-2015-6576

▪ Bamboo is a continuous build server from Atlassian


▪ Just did a grep for readObject() on the source
▪ One hit which looked interesting: DeliverMessageServlet

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 31


5 Case-Study: CVE-2015-6576

1. Valid fingerprint
required

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 32


5 Case-Study: CVE-2015-6576

▪ We need a valid fingerprint


▪ Atlassian Bamboo uses Struts ☺
▪ There is an action “GetFingerprint” that can be invoked via HTTP request

▪ We have some check but let’s see how easy it is to bypass them

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 33


5 Case-Study: CVE-2015-6576

1 1. Authentication is checked
2. If we are an Elastic Agent we pass
4 3. We are an Elastic Agent if our
5 agentType is “elastic”
4. Again!
5. Get the fingerprint
3

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 34


5 Case-Study: CVE-2015-6576

O
E M
D
2015/10/23 Exploiting Deserialization Vulnerabilities in Java 35
5 Case-Study: CVE-2015-6576

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 36


5 Case-Study: CVE-2015-6576

2015/10/23 Exploiting Deserialization Vulnerabilities in Java 37


Q&A
www.code-white.com
[email protected]
@codewhitesec

You might also like