Setuid укусил, кажется, не имеет никакого эффекта на удар

Проблема находится в команде echo $line. С тех пор вокруг нет никаких кавычек $line, оболочка выполняет разделение слова на нем, затем интерпретирует каждое слово как globbing шаблон. Испытайте его с

a='*.txt foo'
ls $a

В Вашем случае вкладки разделяют слова, которые затем становятся отдельными аргументами echo. echo управляйте печатает его аргументы, разделенные пространством. Так cut заканчивает тем, что получил разграниченные пространством поля вместо разграниченных вкладкой полей.

Всегда помещайте двойные кавычки вокруг подстановок переменных $foo и замены команды $(foo) (если Вы не понимаете, почему необходимо пропустить их и почему нормально делать так). echo "$line" работал бы здесь, но это - сложный способ сделать то, что Вы предлагаете.

Сохраняя Ваш подход парсинга в оболочке, можно сделать read управляйте анализируют вход в поля.

while read DB USER PASS; do
  echo "DB=$DB USER=$USER PASS=$PASS"
done <users.txt

read поля разделений, разделенные символами в значении IFS переменная, которая состоит из пространства и вкладки (плюс новая строка, которая не может произойти в строке), по умолчанию. Для разделения только во вкладках установить IFS к единственной вкладке сначала. Обратите внимание, что, ведя и запаздывая вкладки проигнорированы и последовательное количество вкладок как единственное.

read обработки \ как специальный символ: проигнорирована обратная косая черта, сопровождаемая новой строкой; \\ становится единственной обратной косой чертой. Если Вы хотите избежать этого поведения, передайте -r опция.

14
10.02.2015, 18:16
2 ответа

Объяснение является довольно раздражающим: сам удар является причиной. strace наш друг (должен быть сам корень SUID, чтобы это работало):

getuid()                                = 1000
getgid()                                = 1001
geteuid()                               = 0
getegid()                               = 1001
setuid(1000)                            = 0
setgid(1001)                            = 0

удар обнаруживает, что был запущен корень SUID (UID! =EUID) и использование его корневое питание выбросить это питание, сбрасывая EUID к UID. И позже даже FSUID, только чтобы быть уверенным...:

getuid()                                = 1000
setfsuid(1000)                          = 1000
getgid()                                = 1001
setfsgid(1001)                          = 1001

В конце: никакой шанс. Необходимо запустить удар с корня UID (т.е. sudo).

Редактирование 1

В странице справочника говорится это:

Если оболочка запускается с эффективного пользователя (группа) идентификатор, не равный реальному пользователю (группа) идентификатор, и-p опция не предоставляется, никакие файлы запуска не читаются, окружают функции, не наследованы от среды, SHELLOPTS, BASHOPTS, CDPATH, и переменные GLOBIGNORE, если они появляются в среде, проигнорированы, и эффективный идентификатор пользователя установлен на идентификатор реального пользователя. Если-p опция предоставляется при вызове, поведение запуска является тем же, но эффективный идентификатор пользователя не сбрасывается.

Но это не работает на меня. -p даже не упоминается среди опций запуска. Я также попробовал --posix; не работал также.

21
27.01.2020, 19:50

В любом случае корневая программа SUID не работает со средой корня ($HOME, конфигурация для оболочки, безотносительно), это работает с корневыми полномочиями (т.е. она может удалить любой файл, изменить любые полномочия, и т.д.).

2
27.01.2020, 19:50

Теги

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