как заставить оболочку выполняться с suid
Я пытаюсь засудить оболочку, но это не работает. Мне нужна помощь, чтобы понять, почему и как это исправить...
Я выполняю эти шаги (как root)
cp /usr/bin/bash /usr/bin/bash-emergency
chmod 4755 /usr/bin/bash-emergency
bash-emergency принадлежит пользователю root:root
Я ожидаю, что это должно выполнить bash-emergency от имени пользователя root, в результате чего появится корневая оболочка.
Я знаю все причины не делать этого. Это в лаборатории. su и sudo для этого теста не подходят. Мне нужно, чтобы пользователь мог получить корневую оболочку без необходимости проходить аутентификацию или иным образом подвергаться сомнению после первоначального входа в систему.
Я надеюсь, что смогу сделать это с помощью простого исполняемого файла suid, а не менять UID пользователя без полномочий root на 0.
Что я делаю не так?
2 ответа
Что вы делаете неправильно, так это открыто используете меры безопасности, предназначенные для обеспечения безопасности системы. Bash, Dash и другие оболочки обнаруживают, что они выполняются с root-правом setuid, и немедленно теряют привилегии при запуске. Это связано с тем, что установка suid root является очень распространенной тактикой повышения привилегий.
К счастью, для вас есть очень простой обходной путь. Запустите оболочку suid как/usr/bin/bash-emergency -p
.
Соответствующая цитата из документов:
Если оболочка запускается с эффективным идентификатором пользователя (группы), не равным реальному идентификатору пользователя (группы), и опция -p не указана, файлы запуска не читаются, функции оболочки не наследуются из среды, SHELLOPTS Переменные BASHOPTS, CDPATH и GLOBIGNORE, если они появляются в среде, игнорируются, а эффективный идентификатор пользователя устанавливается равным реальному идентификатору пользователя. Если при вызове указана опция -p, поведение при запуске такое же, но эффективный идентификатор пользователя не сбрасывается.
Хотя программы оболочки намеренно не делают то, что вы хотите, вы можете создать свою собственную программу, которая будет это делать. Это пример программы, которая проверит, есть ли у вас euid root, и если да, запустит определенную команду от имени uid root.
Использование что-то вроде/usr/bin/emergency-backdoor /usr/bin/bash
, или/usr/bin/emergency-backdoor "/usr/bin/vim /etc/passwd"
, и так далее.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
if (argc != 2) {
puts("Usage: <this> \"command and args\"");
return 1;
} else if (geteuid() == 0) {
setuid(0);
setgid(0);
puts("Executing the following as root");
puts(argv[1]);
system(argv[1]);
} else {
puts("You do not have privs");
}
return 0;
}