
既知のAPP_KEYを使用した暗号化セッションの安全でないデシリアライゼーションを介して、脆弱なLaravelアプリケーションでリモートコード実行を達成するCVE-2018-15133用のPythonエクスプロイト。
このPythonスクリプトは、安全でないデシリアライゼーションを利用した脆弱なLaravelアプリケーション向けのリモートコード実行(RCE)エクスプロイトを実装しています。これはCVE-2018-15133の脆弱性に基づいています。
このエクスプロイトは、Laravel(バージョン5.5.40以前、および5.6.0〜5.6.29)の脆弱性を悪用します。この脆弱性では、暗号化されたセッションが適切な検証なしに自動的にデシリアライズされます。攻撃者はLaravelのAPP_KEYにアクセスできれば、悪意のあるペイロードを暗号化し、サーバー上でデシリアライズされて実行されるようにできます。
Laravelはセッションに3つのコンポーネントを持つ対称暗号化メカニズムを使用します。
IV(初期化ベクトル): 各セッションに対して生成されるランダムな初期化ベクトル
Value(値): AES-128-CBCまたはAES-256-CBCを使用して暗号化された値
MAC: IV + value + APP_KEYに対して計算されるメッセージ認証コード(HMAC-SHA256)
入力として3つのパラメータを受け取る: base64のLaravel APP_KEY、実行するコマンド、対象ドメイン
PHPGGCツールをLaravel/RCE5ガジェットチェーンとともに呼び出し、悪意のあるPHPオブジェクトチェーンを生成する
被害サーバー上で実行されるOSコマンドを構築する(例: system('whoami');)
連結されたガジェットを含むPHPシリアライズペイロードを生成する
ペイロードをbase64からバイナリ形式にデコードする
APP_KEYを処理し、存在すれば"base64:"プレフィックスを削除する
キーが有効なbase64になるように必要なパディングを追加する
キーをbase64からバイトにデコードする
16バイトのランダムな初期化ベクトル(IV)を生成する
キーとIVを使用してAES CBCモードでペイロードを暗号化する
暗号化前にペイロードにPKCS7パディングを適用する
IVをbase64にエンコードする
暗号文(暗号化されたペイロード)をbase64にエンコードする
HMAC用のメッセージとして、base64のIVとvalueを連結する
連結されたメッセージに対して、キーをシークレットとしてHMAC-SHA256を使用してMACを計算する
iv、value、macの3つのフィールドを持つJSONオブジェクトを構築する
JSON全体をbase64にエンコードする
curlを使用して、laravel_sessionクッキーにペイロードを入れたHTTPリクエストを構築する
対象ドメインにリクエストを送信する
Laravelサーバーはクッキーを受け取り、base64をデコードする
Laravelは受信したIVとvalueに対してMACの整合性を検証する
Laravelは自身のAPP_KEYを使用してAES-CBCでコンテンツを復号する
Laravelは復号されたコンテンツを自動的にデシリアライズする
PHPはデシリアライズされたオブジェクトのマジックメソッド__destruct()または__wakeup()を呼び出す
call_user_func()またはeval()に至るガジェットチェーンが発動する
OSコマンドがサーバー上で実行される
このエクスプロイトは、PHPのマジックメソッド呼び出しを連結するガジェットチェーンを使用します。
デシリアライズ中、PHPは自動的に__destruct()または__wakeup()を呼び出し、任意のコードを実行するeval()に至るチェーンを開始します。
前提条件 エクスプロイトを機能させるために、攻撃者には以下が必要です。
LaravelのAPP_KEY(環境変数の漏洩、露出したS3バケット、ソースコードなどを通じて取得)
デシリアライゼーションがデフォルトで有効な脆弱なLaravelバージョン
./phpggc/ディレクトリにインストールされたPHPGGC https://github.com/ambionics/phpggc
使用例
python exploit.py "base64:dGhpc2lzYXNlY3JldGtleQ==" "whoami" "http://target.htb"
Este comando generará un payload serializado que ejecutará whoami cuando Laravel deserialice la sesión.