Como executar o su do PHP lançado no Apache? [fechadas]

1

Eu tentei executar o comando su com a função shell_exec do PHP. No começo eu tentei:

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

e eu recebi:

su: must be run from a terminal

Então eu li sobre o terminal de desova com o arquivo python e coloquei no código shell:

<?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;'));
?>

e aqui está a saída:

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

Alguma idéia de por que o pty não está funcionando ou que outra ferramenta devo usar para gerar um terminal? O PHP corre atrás do Apache no Debian.

EDIT: Estou procurando uma solução alternativa que não exija acesso físico ao servidor ou conexão via SSH. Suponha que eu queira usar o su para iniciar o sshd e somente os servidores em funcionamento sejam o FTP e o Apache.

    
por Patryk Hes 08.03.2014 / 19:21

5 respostas

0

Meu amigo me mostrou como fazer tty e depois su.

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

Então você tem que fazer o telnet na porta 1234 e digitar esses comandos:

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

e funciona muito bem.

    
por 09.03.2014 / 12:39
5

A resposta (não uma solução) é simplesmente você não pode .

Um bom administrador impedirá isso sempre. É uma péssima ideia e você deve evitar e usar uma solução melhor.

Por exemplo definir apenas um sinalizador via php (FTP ou qualquer outro método)

Ou seja. agendar algumas ações (por exemplo, reiniciar o servidor SSH) quando um sinalizador específico é definido via php (por exemplo, arquivo está presente, resposta json ou valor db).

O gatilho pode por qualquer coisa do PHP, mas a chave é que a ação deve ser pré-definida e com resultado esperado e sólido, com um retorno quando a parte php falhar (por exemplo, quando alguém consegue acionar a parte do php sem a sua permissão).

Outra solução pode ser escrever scripts bash executando ações necessárias, configurar acesso sem senha a esses scripts (em sudoers file) e executá-los via php.

    
por 08.03.2014 / 23:02
2

É uma péssima ideia executar algo relacionado ao PHP em um servidor web. Ele abre muitas possibilidades para o comprometimento do servidor.

Se algum executável específico precisar ser executado como root, você poderá usar o mecanismo sudo para fazer isso. Infelizmente, configurar sudo exige muito esforço.

    
por 08.03.2014 / 19:28
1

Se for necessário usar su do seu programa php, então a maneira correta é usá-lo através de expect . Você pode usar um pequeno script:

#!/use/bin/expect -f

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

Mas, você deve estar ciente de que isso cria um risco de segurança - você está armazenando uma senha de texto simples de um usuário em um arquivo legível por um servidor da web. E esse usuário tem acesso a sudo .. Você deve pensar cuidadosamente sobre isso.

    
por 09.03.2014 / 18:07
0

Em vez de executar su diretamente, execute-o via sudo , certifique-se de que você concedeu a permissão do usuário do Apache para fazer isso sem senha, por isso seria tão simples quanto: sudo su … . Você também pode (e é melhor) limitar quais comandos devem ser executados usando sudo padrão de correspondência e, é claro, você pode usar sudo sem fazer com que invoque su .

    
por 09.03.2014 / 12:49

Tags