web-dev-qa-db-ja.com

/ usr / bin / chmodなしでchmodする方法?

今日、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

196
Michael Mrozek

chmodユーティリティは、chmod()システムコールに依存しています(man 2 chmod)。したがって、これをCの数行、またはラッパーが周囲にあるほとんどすべての言語(ほとんどの言語)でこれを行うことができます。 * nixシステムでは、CコンパイラとPerlインタプリタが不足することはほとんどありません。ほとんどのLinuxディストリビューションでは、後者が機能する必要があります。

Perl -e 'chmod 0755, "foobar.file"'
104
goldilocks

一部のシステムには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であった場合、レスキューシステムからそれを修正することが唯一のオプションである可能性があります。

70
frostschutz

簡単です。あなたができることは、他のいくつかの実行可能ファイルを準備し、それから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進数の両方の構文のようです。

45
Kaz

最初に頭から離れて

  • 他のソース(ネットワークブック、CDなど)から起動し、そのソースのchmodを使用してアクセス許可を設定します。
  • アクセス許可を変更する小さなCプログラムを作成します。
  • パーミッションを変更するためのPerlスクリプト(Ruby、php、pythonなど)を作成する

/usr/bin/chmodは、アクセス許可を変更するためのシステムコールを実行するだけです。そのシステムコールには、さまざまな方法で実行できます。

16
EightBitTony

これは他のどの回答よりもハッカーです(_ld-linux.so_の回答は例外です(本当に賢いハックです))が、他の問題(特に時間の渦に陥り、Land Before Perl™に戻ります。

  1. 安全のため、_/bin/chmod_を安全な場所にコピーしてください:

    _cd
    cp /bin/chmod .
    _
  2. _echo chmod | cpio -oc > chmod.cpio_を実行
    これにより、cpioを含むtarアーカイブが作成されます(chmodアーカイブとは異なります)。 _-c_オプションは、ファイルのメタデータが16進数(つまり、ASCII)で書き込まれることを指定します。

  3. _vi chmod.cpio_
    次のようなものが表示されます

    _0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                       ↑↑↑
    _

    制御文字、標準ASCII文字、および拡張ASCII文字の混合が続きます。0644= 0x1A4および0755 = 0x1EDであることに注意してください。_1A4_(20番目の文字位置から開始)に変更し、_1ED_に変更します。保存して終了します。

    • 16進エディタなどを使用している場合、viがファイル内のバイナリ実行可能コードを汚染するリスクを回避するために、それを使用する方がよい場合があります。しかし、これをviで試したところ、問題なく動作したようです。
  4. _cpio -i < chmod.cpio_
    これで、ディレクトリにchmodのコピーがあり、755で保護されました。

他のアーカイブプログラムにも同様の機能がある場合があります。特に、cpioは古く、廃止される可能性があります。ない場合は、paxを探してください。

12
Scott

あるいはもっと簡単です-最近のシステムによくあるsetfaclを使ってください:

  1. ユーザーに実行権限を設定します。

    # setfacl -m u::rx /bin/chmod
    
  2. 今すぐ実行可能なバイナリを使用して、独自の権限を元の権限に戻します(つまり、すべてのユーザーに対して)

    # chmod +x /bin/chmod
    
  3. 拡張ACLエントリーをドロップする-オプションです。そもそもそれらが存在することには十分な理由があった可能性があるためです。

    # setfacl -b /bin/chmod
    

setfaclは、ACLをサポートしていないファイルシステムでも使用できることに注意してください。

8
Pedro Guimaraes

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
#
5
Ofer

Chmodの内容を既に実行可能なファイルにパイプする

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
3
p.j