Acesso à linha de comando a partir do seu browser usando shell.php
On Janeiro 5, 2022 by admin>
Algumas vezes você quer acesso à shell a partir do browser. Ele pode ser alcançado usando PHP se as configurações de segurança o permitirem. Eu implementei esta funcionalidade em shell.php (disponível no Github). Na imagem de tela acima você vê como funciona o acesso à shell a partir de um navegador. O script permite que você carregue, baixe, veja editar e remover um arquivo, zipar e descompactar um diretório e atravessar os diretórios no servidor usando o mouse, mas você também pode digitar comandos personalizados usando o teclado.
Alerta de segurança e isenção de responsabilidade
Por favor execute este script somente em máquinas que você possui (ou durante uma pentest autorizada). Certifique-se também de que a máquina está devidamente equipada com firewall (a porta 80 não deve estar acessível a partir da Internet). Não a utilize para fins maliciosos! Leia mais sobre abuso de scripts shell aqui.
Known issues
Se o script não funcionar pode ser porque a função “passthru” do PHP na qual ele se baseia está desativada. Para listar funções PHP desabilitadas execute o seguinte código PHP:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Em um Ubuntu 14.04 out-of-the-box que irá sair:
bool(false)Array( => pcntl_alarm => pcntl_fork => pcntl_waitpid => pcntl_wait => pcntl_wifexited => pcntl_wifstopped => pcntl_wifsignaled => pcntl_wexitstatus => pcntl_wtermsig => pcntl_wstopsig => pcntl_signal => pcntl_signal_dispatch => pcntl_get_last_error => pcntl_strerror => pcntl_sigprocmask => pcntl_sigwaitinfo => pcntl_sigtimedwait => pcntl_exec => pcntl_getpriority => pcntl_setpriority =>)Array( =>)
Comandos de execução de shell PHP
Se o script não for executado usando passthru()
, ele irá tentar alguns outros comandos. Os seguintes comandos são similares:
-
exec()
Retorna a última linha de comandos de saída -
passthru()
Passa os comandos de saída directamente para o browser -
system()
Passa os comandos de saída directamente para o browser e retorna a última linha -
shell_exec()
Retorna os comandos de saída -
popen()
Abre pipe de leitura ou escrita para processar um comando -
proc_open()
Similar ao popen() mas com maior grau de controle -
pcntl_exec()
Executa um programa
Escutar o seu servidor com open_basedir
Se o script acima parece assustador para você, então você pode querer impedi-lo de executar no seu servidor. Você pode fazer isso ativando o modo seguro (depreciado), usando a variável php.ini “disable_functions” e/ou a blacklist de execução da função Suhosin.
Eu encontrei um post bem escrito sobre como proteger sua instalação do PHP, confira! Além de limitar as funções executáveis, eles também recomendam a variável de configuração php.ini “open_basedir”. Ela limita os arquivos que podem ser acessados pelo PHP para a árvore de diretório especificada. Eu acredito que esta é uma ferramenta poderosa.
Tal como pode ser uma boa ideia proteger o seu directório “/tmp” com a bandeira “nodev”, “nosuid” e “noexec” como descrito aqui.
Não pode encontrar Suhosin?
Note que o pacote “php5-suhosin” (uma extensão de segurança PHP) não está mais instalado nem disponível em sistemas baseados em Debian. Algumas das melhorias de segurança foram incorporadas nas últimas versões do PHP (5.4 e 5.5). Se você quiser instalar o Suhosin (do Github) no Ubuntu 14.04 (PHP 5.5.9) você pode seguir este tutorial.
Você pode ler mais sobre a controvérsia em torno da remoção do Suhosin na LWN.net.
Separação de privilégios
Se houver vários usuários no sistema “separação de privilégios” é um DEVERÁ. Isto significa executar o código PHP no contexto do usuário (por exemplo, como usuário “maurits”) e não como usuário “www-data”. Encontrei um grande artigo que explica como isto pode ser conseguido. A solução mais fácil é correr:
sudo apt-get install libapache2-mpm-itk
E depois adicionar a directiva “AssignUserID” a cada configuração “VirtualHost”. Note que esta pode não ser a solução mais segura, mas tem um bom desempenho e é fácil de instalar.
Conclusion
Você deve sempre atualizar e corrigir o PHP para a versão mais recente para evitar a exploração de falhas de segurança conhecidas. Ferramentas como “disable_functions”, “open_basedir”, Suhosin e bandeiras de sistema de arquivos reduzem a superfície de ataque e previnem a exploração de falhas de segurança desconhecidas. Você pode usá-las para criar uma estratégia de segurança em camadas. Também não se esqueça da separação de privilégios.
Deixe uma resposta