Вопрос или проблема
Итак, вот в чем ситуация. У меня есть гипотетическая система с 2 пользователями – ‘user1’ и ‘root’. Пользователь ‘user1’ – это обычный пользователь без прав sudo с uid=1000, а root – это обычный пользователь root с uid=0.
Предположим, что через определенную уязвимость в системе user1 может получить euid=0, но его uid все равно остается 1000. Это дает ему некоторые способности администратора, но не все. Например: доступ к /root осуществляется так, как если бы root пытался это сделать, но выполнение команд ‘sudo’ или ‘su’, похоже, происходит на основе UID, а не EUID.
Мой вопрос: есть ли элегантный способ, который не требует загрузки бинарных файлов, изменения /etc/shadow или /etc/passwd для переключения uid на 0, теперь, когда у нас есть euid=0? Было бы также здорово, если бы метод работал нативно и не предполагал наличие специфических программ, таких как gcc, например.
Пока мне удалось придумать python -c 'import pty; import os; os.setuid(0); pty.spawn("/bin/bash")'
, что довольно неплохо, но предполагает, что Python установлен в системе. Есть ли какие-то лучшие предложения?
Это работает во многих стандартных конфигурациях.
perl -MEnglish -e '$UID = 0; $ENV{PATH} = "/bin:/usr/bin:/sbin:/usr/sbin"; exec "su - root"'
Это установит uid и позволит вам стать пользователем root.
Заимствовано у ilkkachu.
Ответ или решение
В вашей ситуации, когда пользователь ‘user1’ имеет эффективный UID (EUID) равный 0, но его реальный UID остается 1000, вы пытаетесь найти элегантное решение, позволяющее переключить реальный UID на 0 без необходимости загружать бинарные файлы или вносить изменения в /etc/shadow или /etc/passwd.
Ваше первоначальное решение с использованием Python действительно работает в системах, где установлен Python, но если вы хотите избежать зависимостей от конкретных программ, вы можете использовать Perl, который часто предустановлен во многих дистрибутивах Linux.
Вот пример команды на Perl, которая позволит вам переключить реальный UID на 0 и выполнить команду как суперпользователь:
perl -MEnglish -e '$UID = 0; $ENV{PATH} = "/bin:/usr/bin:/sbin:/usr/sbin"; exec "su - root"'
Объяснение команды:
perl -MEnglish
: Запускает Perl с модулем English, который позволяет использовать английские имена для специальных переменных.$UID = 0;
: Устанавливает реальный UID равным 0, что соответствует пользователю root.$ENV{PATH} = "/bin:/usr/bin:/sbin:/usr/sbin";
: Устанавливает переменную окружения PATH, чтобы гарантировать доступ к необходимым системным командам.exec "su - root"
: Запускает командуsu
для переключения на пользователя root.
Это решение является довольно элегантным и не требует установки дополнительных пакетов, а также обходит большинство стандартных ограничений системной безопасности.
Альтернативные подходы:
Если Perl по каким-то причинам недоступен, вы можете использовать другие языки, которые могут быть установлены на системе, такие как Ruby или bash. Однако Perl является наиболее распространенным и стабильным вариантом.
Не следует забывать, что даже при наличии EUID равным 0, подобные действия могут быть рассмотрены как нарушения безопасности, и использование таких методов должно быть возможно только в тестовой среде или с разрешением на это действие, чтобы избежать юридических последствий.