9.5 KiB
LFI2RCE via Eternal waiting
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したい または HackTricks をPDFでダウンロードしたい 場合は SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksのグッズを入手する
- The PEASS Familyを発見し、独占的な NFTs のコレクションを見つける
- **💬 Discordグループ に参加するか、telegramグループ に参加するか、Twitter 🐦 @carlospolopm をフォローする。
- ハッキングテクニックを共有するために、PRを HackTricks と HackTricks Cloud のGitHubリポジトリに提出してください。
基本情報
デフォルトでは、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
また、潜在的なファイル名の数は62*62*62*62*62*62 = 56800235584 です
その他のテクニック
その他のテクニックは、PHPプロトコルを攻撃することに依存しています(パスの最後の部分しか制御できない場合はできません)、ファイルのパスを開示すること、期待されるファイルを悪用すること、またはPHPにセグメンテーション違反を引き起こさせてアップロードされた一時ファイルが削除されないようにすることです。
このテクニックは、ゼロデイを見つける必要がない最後のものと非常に似ています。
永遠の待機テクニック
このテクニックでは、相対パスを制御するだけで十分です。ファイルをアップロードし、LFIが終了しないようにすることができれば、「十分な時間」があり、アップロードされたファイルをブルートフォースして、アップロードされたファイルのいずれかを見つけることができます。
このテクニックの利点:
- include内で相対パスを制御するだけでよい
- nginxや予期しないレベルのアクセス権限が不要
- セグメンテーション違反を引き起こすためのゼロデイが不要
- パスの開示が不要
このテクニックの主な問題点は:
- 特定のファイルが存在する必要がある(他にもあるかもしれない)
- 潜在的なファイル名の膨大な数: 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.conf
でrequest_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の接続をサポートしているようです(この数は改善される可能性があります)。