
私の目標は、/etc/passwd に書き込んで権限を root に昇格することです。
新しい root ユーザーのパスワード「test1」を生成しました。openssl passwd test1
そして echo を使用して /etc/passwd ファイルに新しいエントリを追加します。sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd
しかし、この最後のコマンドを実行すると、これを行う権限がないことが示されます。bash: /etc/passwd: Permission denied
しかし、コマンドを使用してファイルの末尾にsudo nano /etc/passwd
コピーすると機能します。root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash
コマンドの問題は何ですかecho
?
答え1
すでにコメントで回答しましたが、もう少し詳しく説明します。
sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd
次のように翻訳されます。
- bash(昇格されていない)に、書き込み用にファイル/etc/passwdを開くように指示します。
- bash(まだ昇格されていない)にいくつかの引数を指定してコマンドを実行するように指示し
sudo
、手順1のファイル記述子をstdoutとして使用します。- sudo(setuid root)
echo
にいくつかの引数を付けて コマンドを実行するよう指示する- echo (root として実行し、通常はシェルの組み込みを呼び出すのに対し、これは /usr/bin/echo のようなものになる可能性が高いことに注意してください
echo
) に指示し、sudo から stdout を継承して、stdout にテキストを出力します。 - 任務完了、エコーは退場
- echo (root として実行し、通常はシェルの組み込みを呼び出すのに対し、これは /usr/bin/echo のようなものになる可能性が高いことに注意してください
- 仕事が終わると、sudoは終了し、rootとして何も実行されなくなります。
- sudo(setuid root)
- Bash (まだ昇格されていません) は /etc/passwd へのファイル記述子を閉じます (書き込みキューをフラッシュします)
- Bashは次のコマンドを待ちます
ただし、もちろん、ステップ 1 は失敗します。Bash は昇格されていないため、書き込み用に /etc/passwd を開くことができません。したがって、bash: /etc/passwd: Permission denied
ステップ 2 のサブステップを含め、ステップ 2 または 3 のどの部分も実行されません。
sudo nano /etc/passwd
昇格されたプロセス (sudo からルート権限を継承する nano) が書き込み用にファイルを開くため、問題なく動作します。
ここで echo を使用する場合は、bash 自体を昇格させる必要があります。これは、sudo 内で bash (または他のシェル) を明示的に呼び出し、次に何を実行するかを指示することで実行できます。
sudo bash -c 'echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd'
または、3 つの個別のコマンドとして実行することもできます (最後の 2 つは bash の昇格されたインスタンスに渡されます)。
sudo bash
echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd
exit