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
現時点では暗唱できない魔法の呪文。
猫の友達を連れ戻すのを手伝ってくれませんか?
いくつかの可能性があり、すべて現在の状況の正確なパラメーターによって異なります。以下の例では、該当する場合、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 < ...
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
実行可能ファイルを最初のアイテム(または実際には唯一のアイテム)として取り込むことで、あらゆる点でハックを再利用せずにすべてのコマンドを利用できるようにすることです。