web-dev-qa-db-ja.com

猫の助けを借りてファイルの権限を変更する

root@system:~# less myfile
-bash: /bin/less: Input/output error

ルートファイルシステムは死んでいます。しかし、私の猫はまだ生きています(私の記憶の中で):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

でも彼はちょっと寂しいです、彼の友達はみんななくなってしまった:

root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error

システムはまだ実行中であり、その目的を果たしています。私は知っています、これに対する唯一の健全な対応は、システムを停止してルートドライブを交換することです。残念ながら、これには多くの時間とお金がかかるため、選択肢にはなりません。また、それは私の猫を殺すでしょう、そしてそれは私を悲しくします。

私は彼に彼のいつもの友達をドナーから連れてくることを考えました。 sshがロードを試みて行をカットした場合に備えて、それらをscpで挿入しようとはしません(とにかくバイナリはなくなっています)。これは私の猫のいとこの仕事のように聞こえます:

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found

残念ながら彼はもういなくなっています。

今、私は猫をだまして彼を復活させる儀式を行うように試みることができます:

cat > netcat < /dev/tcp/localhost/9999

そして、そのように働いた。彼はほとんど生きています。

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied

彼はほんの小さなspark=人生を必要としています。その小さな+x現時点では暗唱できない魔法の呪文。

猫の友達を連れ戻すのを手伝ってくれませんか?

54
goncalopp

いくつかの可能性があり、すべて現在の状況の正確なパラメーターによって異なります。以下の例では、該当する場合、Linuxを想定していますが、ほとんどの場合、他のプラットフォームにも同様の機能が存在します。

  • 動的ローダーに実行可能ファイルを実行させることができる場合があります。 catが動的にリンクされていると仮定すると、プラットフォームの同等の/lib/ld-linux.so.2もメモリ内にあり、バイナリの実行に使用できる可能性があります。

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    

    あなたはこれらの複数を持っているかもしれません(32ビットと64ビットはありそうです)そして利用可能な複数のコピー、または解決する必要があるシンボリックリンクがあるかもしれません。それらの1つが機能する可能性があります。

  • マウントされたvfatまたはNTFSファイルシステム、またはすべてのファイルを777として扱う別のシステムがある場合、そこに実行可能ファイルを作成できます。

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
    
  • マウントされたネットワークファイルシステムがある場合、ローカルで書き込み可能でなくても、リモートシステムでファイルを作成して、通常どおり使用できます。
  • 内容を気にしないマウントされたパーティションがある場合は、まだほとんど機能しているドライブで、必要な実行可能ファイルを含む同じファイルシステムタイプの新しいイメージで内容を置き換えることができます。catはこれで問題ありません。人々が通常ddを使用する役割であり、ネットワーク経由でイメージを提供できます。

    $ cat > /dev/sdb1 < ...
    

    これはもっともらしいですが、そのパーティションからメモリに何が残っているかによっては機能しない場所がたくさんあります。

  • 書き込み可能なファイルシステムで実行権限を持つanyアクセス可能なファイルがある場合、そのファイルにcat >を実行して、内容をあなたの選択。

    $ cat > ~/test.py < ...
    
  • Bashはまだ実行中なので、chmodを公開するプロセスにBashプラグインを動的にロードできます。特に、Bashへの外部関数インターフェイスを提供する install and load ctypes.sh を実行し、次にdlcall chmod ./netcat 511を実行できます。
  • 作成した動的ライブラリファイルfoo.soを取り込み、LD_PRELOADを使用してcatに代わりにロードさせ、任意のコードを実行することができます。

    $ LD_PRELOAD=./hack.so cat /dev/null
    

    たとえば、openを傍受する場合:

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }
    

    次に、そこで必要なことをすべて実行できます。

私の提案は、静的にリンクされたbusybox実行可能ファイルを最初のアイテム(または実際には唯一のアイテム)として取り込むことで、あらゆる点でハックを再利用せずにすべてのコマンドを利用できるようにすることです。

37
Michael Homer