четверг, 28 августа 2008 г.

Обход запретов в *nix

Unix-like системы имеют, с одной стороны, очень простую, с другой - довольно сложную систему распределения прав. И отнюдь не всегда, если у вас не хватает прав на то или иное действие с файлом вы не можете его сделать.

Итак, если мы уже в системе, то, при должной удаче, можем совершить любую операцию, если поправим всего один маленьких конфиг /etc/sudoers (или /usr/local/etc/sudoers в некоторых случаях). Конечно, есть еще /etc/passwd, /etc/shadow и /etc/group, но если к их защищенности всегда повышенное внимание, то к настройкам sudo часто нет. Но! Правка sudoers с помощью обычного текстового редактора может привести к неработоспособности sudo вообще, любая ошибка в конфиге и sudo не работает ни для какого пользователя. Будьте внимательны.

Дальше я просто опишу некоторые способы обхода прав на изменение файла.

1. Нет прав на запись/чтение файла, но есть права на запись у папки



[csx@localhost /tmp/test]$ ls -la
total 6
drwxrwxrwx 2 root wheel 512 Oct 28 09:48 .
drwxrwxrwt 7 root wheel 512 Oct 28 09:47 ..
-rw-r--r-- 1 root wheel 9 Oct 28 09:48 file
[csx@localhost /tmp/test]$ cat file
bad text
[csx@localhost /tmp/test]$ echo 'good text' > file
bash: file: Permission denied


Итак, у нас есть некая директория, в которую мы имеем право писать, и в ней есть файлик, который мы изменить не можем. В данном примере, мы даже можем посмотреть этот файлик, но это ни на что не влияет.

[csx@localhost /tmp/test]$ echo 'good text' > file2
[csx@localhost /tmp/test]$ cp file2 file
cp: file: Permission denied


Попытка создать другой файл с нужным содержимым и заменить file плодов не дала.

А если так?

[csx@localhost /tmp/test]$ mv file2 file
override rw-r--r-- root/wheel for file? (y/n [n]) y
[csx@localhost /tmp/test]$ cat file
good text
[csx@localhost /tmp/test]$ ls -al
total 6
drwxrwxrwx 2 root wheel 512 Oct 28 09:50 .
drwxrwxrwt 7 root wheel 512 Oct 28 09:47 ..
-rw-r--r-- 1 csx wheel 10 Oct 28 09:50 file


Получилось! Обратите внимание на то, что владелец поменялся. Практически в любой свободной версии *nix-подобной системы менять владельца может только root, поэтому замести следы за собой уже не получится. Кроме того, в некоторых случаях неверные права/владелец на конфиге могут повлиять на работоспособность программы (например, ssh не работает с неверными правами на ключи).
Разумеется, файл можно не заменять, а предварительно переименовать, а потом (когда нужные операции сделаны) переместить обратно. В таком случае, после всех наших операций, права вернутся на место.

2. У нас есть sudo на less


Это детский мат. Цитирую из man less
v - Invokes an editor to edit the current file being viewed.  The editor is taken  from  the environment  variable VISUAL if defined, or EDITOR if VISUAL is not defined, or defaults to "vi" if neither VISUAL nor EDITOR is defined.

Естественно, что если less запущен от root'а, то и редактор запустится от него же.

3. У нас есть sudo на редактирование какого-нибудь файла


Итак, если в sudoers указано что-то типа

[root@localhost ~]# cat /etc/sudoers | grep csx
csx ALL=NOPASSWD: /usr/bin/vim file.txt

Здесь все просто.
[csx@localhost /tmp]$ ln -s /etc/sudoers /tmp/file.txt
[csx@localhost /tmp]$ sudo vim file.txt

Это работает.

В том случае если путь к файлу указан полностью
[root@localhost ~]# cat /etc/sudoers | grep csx
csx ALL=NOPASSWD: /usr/bin/vim /usr/local/etc/file.txt


И у нас есть права на запись для папки в которой лежит "разрешенный" файл, то мы всегда можем его переместить (или удалить) и заменить симлинком.
И, наконец, если в качестве программы указан вовсе не редактор, то можно попытаться заменить сам бинарник.

Отмечу, что нужно это вовсе не для того, чтобы "взламывать" системы и чувствовать себя крутым хакером. А в тех ситуациях когда рутовые права потеряны.

1 комментарий:

a b комментирует...

если есть права на редактирование абсолютно любого файла с помощью vim или emacs, можно не мучиться, а просто в виме ":!zsh", а в емаксе M-x shell. И все будет.