Назад | Перейти на главную страницу

Как запустить su из PHP, запущенного на Apache?

Я попытался запустить команду su с функцией PHP shell_exec. Сначала попробовал:

<?php
echo(shell_exec('echo \'password\' | su user -c \'whoami\' 2>&1;'));
?>

и я получил:

su: must be run from a terminal

Затем я прочитал о порождении терминала с помощью python pty и поместил его в код оболочки:

<?php
echo(shell_exec('echo "if [ -t 1 ] ; then echo "terminal found"; fi; echo \'password\' | su user -c \'whoami\';  exit" | python -c \'import pty; pty.spawn("/bin/bash")\' 2>&1;'));
?>

и вот результат:

if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami';  exit
www-data@server:/some/directory$ if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami';  exit
terminal found
su: must be run from a terminal
exit

Есть идеи, почему pty не работает, или какой другой инструмент мне следует использовать для создания терминала? PHP работает за Apache в Debian.

EDIT: я ищу обходной путь, который не требует физического доступа к серверу или подключения через SSH. Предположим, я хочу использовать su для запуска sshd, и только рабочие серверы - это FTP и Apache.

Ответ (не решение) просто ты не можешь.

Хороший админ всегда будет этому препятствовать. Это очень плохая идея, и вы знаете, что вам следует избегать ее и использовать лучшее решение.

Например. установить просто флаг через php (FTP или любой другой метод)

Т.е. запланировать некоторые действия (например, перезапустить SSH-сервер), когда определенный флаг установлен через php (например, присутствует файл, ответ json или значение db).

Триггер может быть любым из PHP, но ключ в том, что действие должно быть предварительно определено и иметь надежный ожидаемый результат с резервным вариантом, когда часть php выходит из строя (например, когда кому-то удается запустить часть php без вашего разрешения) .

Другим решением может быть написание сценариев bash, выполняющих необходимые действия, настройка доступа к этим сценариям без пароля (в sudoers файл) и запустить их через php.

Запускать что-либо, связанное с su, через PHP на веб-сервере - очень плохая идея. Это открывает слишком много возможностей для компрометации сервера.

Если какой-то конкретный исполняемый файл необходимо запустить от имени пользователя root, вы можете использовать sudo механизм для этого. К сожалению, настройка sudo требует довольно много усилий.

Если необходимо использовать su из вашей программы php, то правильный способ - использовать его через expect. Вы можете использовать небольшой скрипт:

#!/use/bin/expect -f

spawn "su some_user -c cmd.sh"
expect {
    ssword: { send "myStrongPass\r" }
}
interact

Но вы должны знать, что это создает угрозу безопасности - вы храните открытый текстовый пароль пользователя в файле, доступном для чтения веб-сервером. И этот пользователь имеет доступ к sudo.. Надо хорошенько подумать.

Мой друг показал мне, как получить tty, а затем su.

<?php
shell_exec('nc -l -p 1234 -c /bin/sh');
?>

Затем вам нужно подключиться к порту 1234 по telnet и ввести следующие команды:

python -c 'import pty; pty.spawn("/bin/sh")'
tty

и он отлично работает.

Вместо бега su напрямую, запустите его через sudo Убедитесь, что вы дали пользователю Apache разрешение делать это без пароля, поэтому это будет так просто, как: sudo su …. Вы также можете (и вам лучше) ограничить, какие команды должны запускаться, используя sudo сопоставление с образцом и, конечно, вы можете использовать sudo сам без вызова su.