はじめに
Linux システムでは、管理者は定期的なメンテナンス、バックアップ、システムアップデートを実行するために、自動タスクスケジューラを頻繁に使用します。この目的で最も一般的に使用されるユーティリティが Cron です。Cron は非常に便利ですが、スケジュールされたタスクの設定を誤ると、深刻なセキュリティ脆弱性を招く可能性があります。
スケジュールされたタスクは、信頼関係と書き込み権限が一致していない場合に危険となります。特権を持つタスクが、権限の低いユーザーでも変更可能なファイルを実行する場合、そのスケジュールは遅延型の特権昇格メカニズムへと変貌します。
この実験では、システム管理者が root ユーザーとして自動実行されるメンテナンススクリプトを作成したものの、誤ってファイル権限を緩く設定してしまったシナリオを体験します。この設定ミスを特定し、その影響を理解した上で、独自のコマンドペイロードを注入して標準ユーザーから root へと特権を昇格させる方法を学びます。
Cron ジョブの列挙
このステップでは、システム全体の Cron ジョブを列挙する方法を学びます。Cron は、Unix 系オペレーティングシステムにおける時間ベースのジョブスケジューラです。システム管理者はこれを使用して、ジョブ(コマンドやシェルスクリプト)を特定の時間、日付、または間隔で定期的に実行するようにスケジュールします。
システム全体の cron ジョブは、多くの場合 /etc/crontab ファイル内、または /etc/cron.d/ ディレクトリ内に定義されています。これらの設定ファイルには、スケジュール、コマンドを実行するユーザーアカウント、および実行されるコマンド自体が記述されています。
つまり、cron のエントリは「いつコードが実行されるか」「どのユーザー権限で実行されるか」「どのファイルやコマンドが実行されるか」という 3 つの重要な情報を一度に明らかにします。
/etc/cron.d/ ディレクトリを調査して、カスタムのスケジュールタスクが存在するか確認しましょう。cat コマンドを使用して、メンテナンス用 cron ジョブファイルの内容を読み取ります。
cat /etc/cron.d/maintenance
出力:
* * * * * root /usr/local/bin/maintenance.sh
出力結果から、5 つのアスタリスク (* * * * *) で示される通り、毎分実行されるようにスケジュールされていることがわかります。これは root ユーザーとして実行されるように設定されており、/usr/local/bin/maintenance.sh にある bash スクリプトを実行します。
書き込み可能なスクリプトの特定
このステップでは、cron ジョブによって実行されるスクリプトを調査し、潜在的なセキュリティ脆弱性を特定します。root のような高い特権を持つユーザーによってスクリプトが実行される場合、そのスクリプト内のすべてのコマンドも root 権限で実行されます。
これが、書き込み可能なスクリプトのパスが特権昇格の重要なシグナルとなる理由です。スクリプトの内容を制御することは、特権を持つスケジュールタスクを間接的に制御することと同義です。
標準ユーザーがこのスクリプトを変更できる場合、独自のコマンドを注入することができ、システムはそれを root として実行します。これは一般的な特権昇格のベクトルです。
ls コマンドに -l フラグを付けて、メンテナンススクリプトのファイル権限を詳細に確認しましょう。
ls -l /usr/local/bin/maintenance.sh
出力:
-rwxrwxrwx 1 root root 78 Oct 10 10:00 /usr/local/bin/maintenance.sh
出力行の先頭にある rwxrwxrwx に注目してください。これは、ファイルの所有者、グループ、およびシステム上のすべてのユーザーが、読み取り、書き込み、実行を行えることを意味します。誰でも書き込み可能であるため、現在の標準ユーザーでもその内容を変更できます。
root コマンドペイロードの注入
このステップでは、不適切なファイル権限を悪用して、メンテナンススクリプトに独自のコマンドを注入します。
スクリプトは毎分 root として実行されるため、追記したコマンドも root として実行されます。初心者にもわかりやすく確実な証明として、id コマンドの出力をプロジェクトディレクトリ内のファイルに書き込むコマンドを追記します。
echo コマンドを使用して、このペイロードをスクリプトに追記します。>> 演算子を使用することで、元の内容を削除せずにファイルの末尾にペイロードを追加できます。
echo "id > /home/labex/project/cron_pwned.txt" >> /usr/local/bin/maintenance.sh
tail コマンドを使用してファイルの末尾を読み取り、ペイロードが正常に追加されたことを確認できます。
tail -n 2 /usr/local/bin/maintenance.sh
出力:
echo "Maintenance run at $(date)" >> /var/log/maintenance.log
id > /home/labex/project/cron_pwned.txt
root 所有タスクの実行待ち
このステップでは、cron ジョブが注入したペイロードを実行するのを待ちます。
cron ジョブは 1 分ごとに実行されます。実行されると、id コマンドが root として実行され、その出力が ~/project/cron_pwned.txt に保存されます。
最大 60 秒待機してから、証明ファイルの内容を読み取ります。
cat /home/labex/project/cron_pwned.txt
エクスプロイトが正しく機能していれば、以下のような出力が表示されます。
uid=0(root) gid=0(root) groups=0(root)
おめでとうございます。cron ジョブを乗っ取り、root としてコマンドを実行することに成功しました。
まとめ
この実験では、Linux 環境において、セキュリティ設定が不十分なシステムメンテナンス作業を特定し、悪用して特権を昇格させる方法を学びました。まず、システム全体の cron ジョブを列挙して root ユーザーで実行されているタスクを見つけました。次に、ターゲットのスクリプトを調査し、ファイル権限が緩く、誰でも変更可能であることを発見しました。書き込み可能なスクリプトにペイロードを注入することで、自動化されたプロセスを乗っ取り、root 権限を取得することに成功しました。この演習は、特に特権を持つ自動化プロセスによって実行されるスクリプトにおいて、適切なファイル権限管理がいかに重要であるかを強調しています。



