Изменить разрешения файла с помощью моей кошки

55
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 попытается загрузить его и обрезает строку (бинарный файл все равно пропал). Это звучит как работа для двоюродного брата моей кошки:

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

Ему просто нужна крошечная искра жизни. Это маленькое +xволшебное заклинание, которое я не могу сейчас произнести.

Можете ли вы помочь мне вернуть друзей моей кошки?

goncalopp
источник
3
Можете ли вы запустить /lib/ld-linux.so.2 ./netcat(или эквивалент вашей системы) и запустить что-то?
Майкл Гомер
4
Кроме того: что это за операционная система? Есть ли у вас какие-либо файловые системы vfat или NTFS? Сетевые файловые системы? Разделы, которые вы можете стереть содержимое? Существуют ли какие - либо доступные файлы с правами на выполнение?
Майкл Гомер
3
«Кроме того, это убило бы мою кошку, и это сделало бы меня грустным». - Я всегда думал, что поговорка «Никакие кидены не пострадали во время производства этого» была просто поговоркой, но хорошо…
rugk
7
Я полностью должен был выразить это за все эти аналогии с кошками… 😂
rugk
2
бедный кот, я надеюсь, что он в порядке :(
кот

Ответы:

37

Есть несколько возможностей, все в зависимости от точных параметров вашей ситуации прямо сейчас. Я собираюсь предположить Linux в следующих примерах, где это применимо, но в большинстве случаев аналогичные функциональные возможности существуют на других платформах.

  • Возможно, вы сможете заставить динамический загрузчик запустить исполняемый файл для вас. Предполагая, что catон динамически связан, эквивалент вашей платформы, /lib/ld-linux.so.2скорее всего, также будет находиться в памяти и, следовательно, может использоваться для запуска двоичного файла:

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

    У вас может быть несколько из них (вероятно, 32- и 64-разрядные), и может быть доступно несколько копий или символических ссылок, которые необходимо разрешить. Один из тех, кто может работать.

  • Если у вас есть смонтированная файловая система vfat или NTFS или другая, которая обрабатывает все файлы как 777, вы можете создать там свой исполняемый файл.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • Если у вас есть смонтированная сетевая файловая система, даже если она не доступна для локальной записи, вы можете создавать файлы в удаленной системе и использовать их как обычно.
  • Если есть смонтированный раздел, содержимое которого вас не волнует, на диске, который все еще в основном работает, вы можете заменить содержимое новым образом того же типа файловой системы, содержащим необходимые вам исполняемые файлы - catдля этого подойдет Роль, которую обычно используют люди dd, и вы можете предоставить изображение по сети.

    $ cat > /dev/sdb1 < ...

    Это правдоподобно, но есть много мест, где нельзя работать, в зависимости от того, что именно находится в памяти этого раздела.

  • Если есть какой-либо доступный файл, который имеет разрешение на выполнение в любой доступной для записи файловой системе, вы можете cat >в него заменить содержимое двоичным файлом по вашему выбору.

    $ cat > ~/test.py < ...
  • Поскольку Bash все еще работает, вы можете динамически загрузить плагин Bash в процесс, который предоставляет chmod. В частности, вы можете установить и загрузитьctypes.sh , который предоставляет интерфейс сторонней функции для Bash, а затем dlcall chmod ./netcat 511.
  • Вы можете загрузить динамический библиотечный файл foo.soвашей конструкции, а затем catзагрузить его от вашего имени LD_PRELOAD, что позволит вам выполнить произвольный код.

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

    Если вы перехватываете, например open,:

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

    тогда вы можете делать там все, что вам нужно.

Моим предложением было бы ввести статически связанный busyboxисполняемый файл в качестве первого элемента (или, действительно, единственного элемента), чтобы у вас был полный набор доступных команд без повторного использования любого хака, приведшего вас к истощению.

Майкл Гомер
источник
3
«Статически связанный busybox»: обратите внимание, что он sashбыл специально разработан для этого варианта использования и может быть более доступным в крайнем случае (например, вы можете установить его заранее и оставить копию работающей где-нибудь, чтобы она находилась в памяти, когда система перерывы ... или вы можете угробить своих питомцев и купить кучу крупного рогатого скота вместо этого, я полагаю).
Кевин