今日、Unixトレーナーからrootのパスワードが生徒に漏らされたという話があり、その1人が/usr/bin/chmod
自体から実行権限を削除しました。この場合、どのようにしてchmod
を回復し、再度実行可能にしますか?外部ソースから取得するか、再コンパイルすることは好ましいオプションではないとしましょう。このchmod
自体を回復できるスマートなハックはありますか?
これはずっと前に起こったことであり、私は現在の問題の解決策を探しているのではなく、Unixがそのような問題の周りでどのように提供してくれるのか知りたがっています。
ローダーを直接実行して、実行するコマンドを渡すことができます。
/lib/ld-linux.so /bin/chmod +x /bin/chmod
ローダーへのパスは異なる場合があります。 64ビットシステムでは、chmod
のコンパイル方法に基づいて適切なものを選択する必要があります。 64ビットバージョンは/lib64/ld-linux-x86-64.so.2
chmod
ユーティリティは、chmod()
システムコールに依存しています(man 2 chmod
)。したがって、これをCの数行、またはラッパーが周囲にあるほとんどすべての言語(ほとんどの言語)でこれを行うことができます。 * nixシステムでは、CコンパイラとPerlインタプリタが不足することはほとんどありません。ほとんどのLinuxディストリビューションでは、後者が機能する必要があります。
Perl -e 'chmod 0755, "foobar.file"'
一部のシステムにはbusybox
もインストールされています。この場合、次のコマンドを実行できます。
busybox chmod +x /bin/chmod
あなたがハックを求めていたので、私は別のものを考えました:
mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod
これで/bin/chmod
これは実行可能ですが、実際にはchown
(つまり、他のバイナリ)です。これで、元のバイナリで上書きするだけです。
dd if=/bin/chmod.orig of=/bin/chmod
+ xフラグを保持するため、このファイル用の別のファイルの+ xを盗むだけです。
もちろん、それらすべての代替バイナリ(ローダー、Perl、python、gccなど)がchmod -xであった場合、レスキューシステムからそれを修正することが唯一のオプションである可能性があります。
簡単です。あなたができることは、他のいくつかの実行可能ファイルを準備し、それからcp chmod
を上書きすることです。
$ cp /bin/ls chmod
$ cp /bin/chmod .
最初のcp
は、実行権限を持つchmod
というファイルを作成しますが、これは実際にはls
実行可能ファイルです。 2番目のcp
は、ターゲットファイルの実行権限を保持しながら、このファイルにchmod
のバイナリコードを入力します(ソースファイルの権限を引き継ぐオプションを指定していないため)。
もう1つのアプローチは、install
ユーティリティを使用することです。このユーティリティは、許可を1ステップで設定できる、名誉あるコピープログラムです。 (-m
引数を参照してください。)
$ install -m a+x /bin/chmod .
$ ./chmod # executes
install
プログラムはUnix仕様の一部ではありませんが、BSDおよびGNU Coreutilsにあります。どちらもchmod-で-m
オプションをサポートしていますシンボリックと8進数の両方の構文のようです。
最初に頭から離れて
/usr/bin/chmod
は、アクセス許可を変更するためのシステムコールを実行するだけです。そのシステムコールには、さまざまな方法で実行できます。
これは他のどの回答よりもハッカーです(_ld-linux.so
_の回答は例外です(本当に賢いハックです))が、他の問題(特に時間の渦に陥り、Land Before Perl™に戻ります。
安全のため、_/bin/chmod
_を安全な場所にコピーしてください:
_cd
cp /bin/chmod .
_
_echo chmod | cpio -oc > chmod.cpio
_を実行
これにより、cpio
を含むtar
アーカイブが作成されます(chmod
アーカイブとは異なります)。 _-c
_オプションは、ファイルのメタデータが16進数(つまり、ASCII)で書き込まれることを指定します。
_vi chmod.cpio
_
次のようなものが表示されます
_0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
↑↑↑
_
制御文字、標準ASCII文字、および拡張ASCII文字の混合が続きます。0644= 0x1A4および0755 = 0x1EDであることに注意してください。_1A4
_(20番目の文字位置から開始)に変更し、_1ED
_に変更します。保存して終了します。
vi
がファイル内のバイナリ実行可能コードを汚染するリスクを回避するために、それを使用する方がよい場合があります。しかし、これをvi
で試したところ、問題なく動作したようです。cpio -i < chmod.cpio
_chmod
のコピーがあり、755で保護されました。他のアーカイブプログラムにも同様の機能がある場合があります。特に、cpio
は古く、廃止される可能性があります。ない場合は、pax
を探してください。
あるいはもっと簡単です-最近のシステムによくあるsetfacl
を使ってください:
ユーザーに実行権限を設定します。
# setfacl -m u::rx /bin/chmod
今すぐ実行可能なバイナリを使用して、独自の権限を元の権限に戻します(つまり、すべてのユーザーに対して)
# chmod +x /bin/chmod
拡張ACLエントリーをドロップする-オプションです。そもそもそれらが存在することには十分な理由があった可能性があるためです。
# setfacl -b /bin/chmod
setfacl
は、ACLをサポートしていないファイルシステムでも使用できることに注意してください。
rsync
は、ファイルの権限を変更するためにも使用できます
# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
-rwxr-x--- 1 root root 52000 Sep 6 15:13 /tmp/chmod
#
Chmodの内容を既に実行可能なファイルにパイプする
cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh