hacktricks/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md

8.7 KiB
Raw Blame History

LFI2RCE via Eternal waiting

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

基本情報

デフォルトでは、PHPにファイルがアップロードされるとそれが期待されていなくても、**php[a-zA-Z0-9]{6}**のような名前の一時ファイルが/tmpに生成されます。ただし、一部のDockerイメージでは、生成されたファイルに数字が含まれていないことがあります。

ローカルファイルインクルージョンでは、そのアップロードされたファイルをインクルードできれば、RCEを取得できます

デフォルトでは、PHPは単一リクエストで20ファイルのみをアップロードできるように許可しています/etc/php/<version>/apache2/php.iniで設定)。

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

永遠の待ち技術

この技術では、相対パスを制御するだけで済みます。ファイルをアップロードし、LFIを終了させないようにすることができれば、アップロードされたファイルをブルートフォース攻撃して、アップロードされたファイルのいずれかを見つけるのに「十分な時間」があります。

この技術の利点:

  • include内で相対パスを制御するだけで済む
  • nginxやログファイルへの予期せぬアクセスレベルは必要ない
  • セグメンテーション違反を引き起こすための0日が必要ない
  • パスの開示が必要ない

この技術の主な問題点は:

  • 特定のファイルが存在する必要がある(他にもあるかもしれない)
  • 潜在的なファイル名の膨大な数: 56800235584
  • サーバーが数字を使用していない場合、合計潜在的な数は: 19770609664
  • デフォルトでは1リクエストで最大20ファイルしかアップロードできない。
  • 使用されているサーバーの最大並列ワーカー数
  • これらの制限により、この攻撃が長引く可能性があります
  • PHPリクエストのタイムアウト。理想的には永久にするか、PHPプロセスを削除せずに一時的にアップロードされたファイルを削除する必要があります。そうでない場合、これも問題になります

では、どのようにしてPHP includeを終了させないようにできるでしょうか?単に、ファイル /sys/kernel/security/apparmor/revision をインクルードするだけです(Dockerコンテナでは利用できません残念ながら...)。

試してみるには、次のように呼び出してください:

php -a # open php cli
include("/sys/kernel/security/apparmor/revision");

Apache2

デフォルトでは、Apacheは150の同時接続をサポートしています。https://ubiq.co/tech-blog/increase-max-connections-apache/に従って、この数を最大8000までアップグレードすることが可能です。PHPをそのモジュールと共に使用するには、https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04に従ってください。

デフォルトでは(私のテストで確認できるように)、PHPプロセスは永遠に続くことができます。

計算してみましょう:

  • 149の接続を使用して、149 * 20 = 2980個の一時ファイルをWebシェルで生成できます。
  • 次に、最後の接続を使用して、潜在的なファイルをブルートフォースします。
  • 10リクエスト/秒の速度で、時間は次のようになります:
    • 56800235584 / 2980 / 10 / 3600 ≈ 530時間50%の確率で265時間
    • 小数点以下を無視19770609664 / 2980 / 10 / 3600 ≈ 185時間50%の確率で93時間

{% hint style="warning" %} 前述の例では、他のクライアントを完全にDoS攻撃していることに注意してください! {% endhint %}

Apacheサーバーが改善され、4000の接続を悪用できるようになれば(最大数の半分まで)、3999*20 = 79980 ファイルを作成し、は約19.7時間または6.9時間10時間、3.5時間50%の確率)に短縮されます。

PHP-FMP

Apacheの通常のphpモジュールを使用する代わりに、webページがPHP-FMPを使用している場合これはWebページの効率を向上させるため、一般的に見つけることができます、テクニックを改善するために他にもできることがあります。

PHP-FMPは、/etc/php/<php-version>/fpm/pool.d/www.confrequest_terminate_timeoutパラメータを設定できます。
このパラメータは、PHPへのリクエストが終了する必要がある最大秒数を示しますデフォルトでは無限ですが、パラメータがコメントアウトされている場合は30秒。PHPによってリクエストが処理されている間に、指定された秒数が経過すると、それが中断されます。つまり、リクエストが一時ファイルをアップロードしていた場合、php処理が停止されたため、それらのファイルは削除されません。したがって、リクエストをその時間だけ続けることができれば、削除されない数千の一時ファイルを生成でき、それによりそれらを見つけるプロセスが高速化され、すべての接続を消費してプラットフォームにDoSを引き起こす確率が低下します。

したがって、DoSを回避するために、攻撃者が同時に100の接続しか使用しないと仮定し、php-fmpによるphp最大処理時間request_terminate_timeout)が30秒であるとします。したがって、1秒あたりに生成できる一時ファイルの数は100*20/30 = 66.67です。

その後、10000個のファイルを生成するには、攻撃者が必要とする時間は:10000/66.67 = 150秒です(100000個のファイルを生成するには、時間は25分になります)。

その後、攻撃者はこれらの100の接続を使用して検索ブルートフォースを実行できます。300リクエスト/秒の速度を仮定すると、この攻撃を実行するために必要な時間は次のとおりです:

  • 56800235584 / 10000 / 300 / 3600 ≈ 5.25時間50%の確率で2.63時間)
  • 100000個のファイルを使用する場合56800235584 / 100000 / 300 / 3600 ≈ 0.525時間50%の確率で0.263時間)

はい、EC2中サイズのインスタンスで100000個の一時ファイルを生成することが可能です

{% hint style="warning" %} タイムアウトをトリガーするには、脆弱なLFIページを含めるだけで十分です。これにより、永遠にインクルードループに入ります。 {% endhint %}

Nginx

デフォルトでは、Nginxは同時に512の接続をサポートしているようです(この数は改善できます)。