Как chmod без /usr /bin /chmod? [Дубликат]

    

У этого вопроса уже есть ответ:

    

Сегодня мне рассказали рассказ тренера Unix, где пароль root был просочился ученикам, и один из ребята удалил разрешение на выполнение из /usr/bin/chmod. Как вы восстанавливаете chmod в этом случае и снова выполняете его? Предположим, что получить его из внешнего источника или перекомпилировать, это не предпочтительный вариант, есть ли какой-то умный хак, который может восстановить этот chmod сам?

Обратите внимание, что это произошло давно, и я не ищу решение какой-либо текущей проблемы, просто интересуюсь, каким образом Unix предоставляет нам такую ​​проблему.

146 голосов | спросил sundar 21 J000000Sunday13 2013, 23:08:11

9 ответов


180

Вы можете запустить загрузчик напрямую и передать ему команду, которую вы хотите запустить:

/lib/ld-linux.so /bin/chmod +x /bin/chmod

Ваш путь к загрузчику может отличаться. В 64-битной системе вам нужно выбрать правильный вариант, основываясь на том, как был скомпилирован chmod; 64-битная версия называется чем-то вроде /lib64/ld-linux-x86-64.so.2

ответил Michael Mrozek 21 J000000Sunday13 2013, 23:23:35
97

Утилита chmod основана на системном вызове chmod() (см. man 2 chmod). Таким образом, вы можете сделать это с помощью нескольких строк C или любого другого языка, на котором есть обертка вокруг него (что было бы большим количеством из них). Очень немногим системам * nix не хватает компилятора C и интерпретатора perl; большинство дистрибутивов Linux требуют более позднего использования.

perl -e 'chmod 0755, "foobar.file"'
ответил goldilocks 21 J000000Sunday13 2013, 23:22:18
65

В некоторых системах также установлен 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 et cetera), были chmod -x, исправление его из системы спасения может быть единственным вариантом.

ответил frostschutz 22 J000000Monday13 2013, 00:42:04
42

Легко. Что вы можете сделать, так это подготовить другой исполняемый файл, а затем cp chmod.

 $ cp /bin/ls chmod
 $ cp /bin/chmod .

Первый cp создает файл с именем chmod с исполняемыми правами, но это действительно исполняемый файл ls. Второй cp заполняет этот файл двоичным кодом chmod, сохраняя при этом права на выполнение целевого файла (поскольку мы не указали какие-либо параметры переноса разрешений исходный файл).


Другой подход заключается в использовании утилиты install, которая является прославленной программой копирования, которая может устанавливать разрешения за один шаг. (См. Аргумент -m.)

$ install -m a+x /bin/chmod .
$ ./chmod # executes

Программа install не входит в спецификацию Unix, но находится в BSD и в GNU Coreutils. Оба поддерживают параметр -m с синтаксисом типа chmod, как символическим, так и восьмеричным.

ответил Kaz 22 J000000Monday13 2013, 18:55:46
15

Первые вещи с головы,

  • Загрузите из любого другого источника (сетевую книгу, компакт-диск и т. д.) и используйте chmod для этого источника, чтобы установить разрешения.
  • Напишите небольшую программу на C, чтобы изменить разрешения.
  • Напишите скрипт perl (ruby, php, python и т. д.) для изменения разрешений

/usr/bin/chmod просто делает системный вызов для изменения разрешений, вы можете заставить эту систему называть себя любым количеством способов.

ответил EightBitTony 21 J000000Sunday13 2013, 23:23:27
9

Это хакер, чем любой другой ответ (за исключением, возможно, ответа ld-linux.so который является умным действительно умным ), но может быть более адаптируемым к другим проблемам (особенно если вы попадаете во время вихря и вернуться обратно в Land Before Perl ™).

  1. В целях безопасности скопируйте /bin/chmod в безопасное место:

    cd
    cp /bin/chmod .
    
  2. Сделайте echo chmod | cpio -oc > chmod.cpio
    Это создает архив cpio (в отличие от архива tar), содержащего chmod. Параметр -c указывает, что метаданные файла записаны в шестнадцатеричном формате (то есть в ASCII).

  3. vi chmod.cpio
    Вы увидите что-то вроде

    0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                       ↑↑↑
    

    , за которым следует смесь управляющих символов, стандартных символов ASCII, и расширенные символы ASCII. Обратите внимание, что 0644 = 0x1A4 и 0755 = 0x1ED. Найдите 1A4 (начиная с позиции 20-го символа) и измените его на 1ED. Сохранить и выйти.

    • Если у вас есть шестнадцатеричное редактирование или что-то подобное, было бы лучше использовать это, чтобы избежать риска что vi будет загрязнять двоичный исполняемый код в файле. Но я пробовал это с помощью vi, и, похоже, он работал нормально.
  4. cpio -i < chmod.cpio
    Теперь у вас есть копия chmod в вашем каталоге, защищенная 755.

Другие архивные программы могут иметь схожие возможности. В частности, cpio является старым и может быть устаревшим; если у вас его нет, найдите pax.

ответил Scott 8 PM000000100000003431 2015, 22:09:34
5

Или еще проще - используйте setfacl, который часто присутствует в современных системах:

  1. Задайте для пользователя права на выполнение:

    # setfacl -m u::rx /bin/chmod
    
  2. Теперь используйте исполняемый бинарный файл, чтобы установить его собственные права на исходные (т. е. для всех пользователей)

    # chmod +x /bin/chmod
    
  3. Отбросить расширенные записи ACL - необязательно, поскольку, возможно, была хорошая причина, по которой они были там в первую очередь.

    # setfacl -b /bin/chmod
    

Обратите внимание, что setfacl может использоваться в файловой системе, которая также не поддерживает ACL.

ответил Pedro Guimaraes 27 Jpm1000000pmTue, 27 Jan 2015 19:48:13 +030015 2015, 19:48:13
3

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
#
ответил Ofer 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 06 Sep 2015 15:17:09 +0300 2015, 15:17:09
1

Содержит содержимое chmod в уже исполняемом файле

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
ответил p.j 4 +04002014-10-04T18:07:04+04:00312014bEurope/MoscowSat, 04 Oct 2014 18:07:04 +0400 2014, 18:07:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132