Shell_Exec PHP

307 views
Skip to first unread message

Diego Costa

unread,
Nov 13, 2013, 6:23:37 AM11/13/13
to tche...@googlegroups.com
Bom dia grupo,

Estou tentando utilizar um script que fica pingando para m host e retorna se o mesmo esta ON ou OFF, já tinha utilizado este mesmo script em 2010, hoje me deparo com um erro que não encontro solução poderiam me ajudar?

Script com nome de ping.html
______________________________
<?php
$arrayL = fopen("lista.txt","r");
 
while(!feof($arrayL)){
    $linha =fgets($arrayL, 999);
    $nome = strtok($linha, ":");
    $pingando = " ";
    $numeroip = strtr(strrchr($linha,":"), ":", " ");
 
    if(empty($numeroip)){
       echo "Final, sem ip";
       exit;
    }else{
 
       echo " ========== " .$nome ." ====== " ."<br>";
       $pingando = shell_exec("ping -c 1 $numeroip");

       if(!ereg("bytes from",$pingando)){
         echo "Servidor nao responde ping"."<br>";
       }else{
         echo "Resposta OK";
         echo "<pre>$pingando</pre><br>";

       }

       echo "<br>";
       echo "<br>";
    }
}
?>



-----------------------------------


Problema que o servidor WEB não esta mais executando este script, mostrando erro.

ao executar no navegador http://ip_do_server/ping.html

mostra em texto puro

"; $pingando = shell_exec("ping -c 1 $numeroip"); if(!ereg("bytes from",$pingando)){ echo "Servidor nao responde ping"."
"; }else{ echo "Resposta OK"; echo "
$pingando

"; } echo "
"; echo "
"; } } ?>


-------

Info: testado em varias distros, com php 5.4.4 e php 5.3.2
alguém poderia me ajudar, pois li a respeito do Shell_Exec estar desabilitado nas novas versões do Php. porem não achei como habilita-lo.


Agradeço desde já atenção de todos,

Diego Costa - Técnico em Informática
Acadêmico do Curso de Redes - Fatec Senac
            53-8405.6096 



Rafael Amorim

unread,
Nov 13, 2013, 6:45:42 AM11/13/13
to tche...@googlegroups.com
Olá

Quando rodei teu código aqui recebi warning na função ereg. Então cortei todo o código para ver se o shell_exec estava funcionando. Meu código ficou assim:

<?php

$numeroip = "10.8.0.2";
echo shell_exec("ping -c 1 $numeroip");

?>

Testa ai e vê se numa dessas o erro não é no ereg.

Abraço!




--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "TcheLinux" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para tchelinux+...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
 
Rafael M. Amorim
Especialista em Governança de TI - SENAC/RS
Analista de Tecnologia da Informação - Unipampa - Campus de Santana do Livramento
Telefone: (55) 3243-4540 - 8755

Ricardo Jose Maraschini

unread,
Nov 13, 2013, 11:37:48 AM11/13/13
to tche...@googlegroups.com
* Diego Costa (cdbu...@gmail.com) wrote:
> Estou tentando utilizar um script que fica pingando para m host e retorna
> se o mesmo esta ON ou OFF, j� tinha utilizado este mesmo script em 2010,
> hoje me deparo com um erro que n�o encontro solu��o poderiam me ajudar?
>
> Script com nome de ping.html

nao deveria ser ping.php ?
se o teu httpd estiver configurado pra usar o interpretador php pra arquivos
com final `.php', ele nao vai entender o `.html' como sendo um script a ser
interpretado.

-rm

Oscar Marques

unread,
Nov 13, 2013, 11:50:24 AM11/13/13
to tche...@googlegroups.com
Esse script tem que verificar se so existem IPs pois pode se aproveitar e colocar comandos lá:

127.0.0.1;id;w;etc....


Em 13 de novembro de 2013 14:37, Ricardo Jose Maraschini <ricardo.m...@gmail.com> escreveu:
* Diego Costa (cdbu...@gmail.com) wrote:
> Estou tentando utilizar um script que fica pingando para m host e retorna
> se o mesmo esta ON ou OFF, já tinha utilizado este mesmo script em 2010,
> hoje me deparo com um erro que não encontro solução poderiam me ajudar?

>
> Script com nome de ping.html

nao deveria ser ping.php ?
se o teu httpd estiver configurado pra usar o interpretador php pra arquivos
com final `.php', ele nao vai entender o `.html' como sendo um script a ser
interpretado.

-rm
--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.

---
Você está recebendo esta mensagem porque se inscreveu no grupo "TcheLinux" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para tchelinux+...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Sérgio

unread,
Nov 13, 2013, 12:52:50 PM11/13/13
to tche...@googlegroups.com
Boa tarde,

Duas sugestões:

1. Não utilize shell_exec (ou qualquer outra função do PHP que faça um fork e execute um comando na shell), aliás, para a segurança do teu servidor, deve banir todas elas (http://us1.php.net/manual/en/ref.exec.php) no php.ini. Manter estas funções disponíveis pode ser um vetor de ataque, uma vez que scripts mal intencionados (exploits) podem ser enviados e utilizados para rodar comando na shell;
2. Não utilize as funções ereg*. Elas são marcadas como obsoletas na versão 5.3.0 (http://us3.php.net/manual/en/function.ereg.php) e serão removidas da linguagem futuramente. Não utilize ereg* (ou preg*) para verificar se uma string está contida em outra, utilize strpos (http://us2.php.net/strpos) para este objetivo, que é muito mais rápido (em termos de tempo de execução);

Abraço,
Sérgio


Em 13 de novembro de 2013 09:23, Diego Costa <cdbu...@gmail.com> escreveu:

Diego Costa

unread,
Nov 13, 2013, 1:22:32 PM11/13/13
to tche...@googlegroups.com
Boa Tarde,

Resolvido por momento, concordo com o que o Sergio comentou sobre segurança, no caso é um servidor interno que não terá acesso a internet, apenas ficara fazendo monitoramento de maquinas internas, mas mesmo assim farei a lição de casa ;P lendo a documentação destas boas praticas.


Obrigado Ricardo Jose Maraschini tinha esquecido deste detalhe de arquivos .php e obrigado aos demais que tiveram a boa intenção de ajudar.


att,

Diego Costa


--
Diego Costa - Técnico em Informática
Acadêmico do Curso de Redes - Fatec Senac
     Atuante na TI. do HU - FURG
     53-8405.6096 / 53-3233.0218

Ernani Azevedo

unread,
Nov 13, 2013, 2:05:51 PM11/13/13
to tche...@googlegroups.com
Diego,

pode utilizar a seguinte função:

function ping ( $host, $timeout = 1)
{
  /* ICMP ping packet with a pre-calculated checksum */
  $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
  $socket = socket_create ( AF_INET, SOCK_RAW, 1);
  socket_set_option ( $socket, SOL_SOCKET, SO_RCVTIMEO, array ( "sec" => $timeout, "usec" => 0));
  socket_connect ( $socket, $host, null);
  $ts = microtime ( true);
  socket_send ( $socket, $package, strLen ( $package), 0);
  if ( socket_read ( $socket, 255))
  {
    $result = microtime ( true) - $ts;
  } else {
    $result = false;
  }
  socket_close ( $socket);
  return $result;
}

É mais segura, rápida e consome menos recurso (e faz a mesma coisa).

[]'s
--
Ernani Azevedo
(51) 92425885


2013/11/13 Diego Costa <cdbu...@gmail.com>

Marcos Carraro

unread,
Nov 13, 2013, 5:03:35 PM11/13/13
to tche...@googlegroups.com
Buenas,
Ia falar agora sobre os sockets, cara eu fiz uma aplicação que valida os serviços remotos dos servidores, tudo usando socket e mysql para armazenar os hosts portas. Utiliza socket é mais seguro.
abraços

--
Att
Marcos Carraro

Ricardo Jose Maraschini

unread,
Nov 14, 2013, 6:29:50 AM11/14/13
to tche...@googlegroups.com
* Marcos Carraro (marcos.g...@gmail.com) wrote:
> Buenas,
> Ia falar agora sobre os sockets, cara eu fiz uma aplica��o que valida os
> servi�os remotos dos servidores, tudo usando socket e mysql para armazenar
> os hosts portas. Utiliza socket � mais seguro.
> abra�os

- nao use php, eh mais seguro.
- nao use linux, use openbsd eh mais seguro.
- nao deixe a maquina ligada na rede 24x7, eh mais seguro
- criptografe seu disco, eh mais seguro
- nao use o apache, use o lighthttp que eh mais rapido
- nao faca o que eu digo, definitivamente eh mais seguro tu confiar no teu
taco.

-rm

Christiano F. Haesbaert

unread,
Nov 14, 2013, 6:32:28 AM11/14/13
to tche...@googlegroups.com
btw, deve ter alguma funcao em php que torna uma string "shell safe".

Christiano F. Haesbaert

unread,
Nov 14, 2013, 6:44:31 AM11/14/13
to tche...@googlegroups.com

Vinicius Mello

unread,
Nov 14, 2013, 6:45:11 AM11/14/13
to tche...@googlegroups.com
On 11/13/2013 08:03 PM, Marcos Carraro wrote:
> Buenas,
> Ia falar agora sobre os sockets, cara eu fiz uma aplica��o
> que valida os servi�os remotos dos servidores, tudo usando
> socket e mysql para armazenar os hosts portas. Utiliza
> socket � mais seguro.

Pra fazer um ping por socket � preciso um RAW SOCKET e
precisa de privil�gios de root pra isso, certo? Caso sim,
esta solu��o n�o seria f�cil de implementar com seguran�a.


A id�ia de rodar o /bin/ping <IP> diretamente n�o � t�o m�
do ponto de vista de seguran�a porque � f�cil validar uma
string que representa um IP (se pode validar o formato do IP
com a fun��o preg_match() e usar a fun��o escapeshellarg()
pra escapar os caracteres antes de executar).


Me parece que a usabilidade desta solu��o da forma como ela
est� � o principal problema. Supondo que a rede tenha 100
IPs e que o ping demore 0.2 segundo em cada IP, pra p�gina
carregar totalmente vai levar 20 segundos. A usabilidade
assim � p�ssima. E se fosse por exemplo 192.168.1.0/24 (254
IPs) seria ainda pior.


Uma solu��o alternativa seria:

1) rodar no crontab a cada 1 minuto um ping scan com o nmap
com o parametro pra exportar o resultado pra XML. Como o
nmap roda o scan em paralelo, isto vai reduzir
consideravelmente o tempo do scan. E no modo ARP scan ele
detecta hosts que est�o com o firewall habilitado (Windows
>= XP). Tem a desvantagem de que ficar rodando um scan a
cada 1 minuto � muito mais do que precisa, porque a p�gina
s� ser� vista de vez em quando. Tem outras formas melhores e
mais complicadas, mas deixo a id�ia assim como conceito.

2) o script PHP faz apenas o parse do resultado gerado pelo
nmap e mostra na tela


--
Vinicius Mello

Rafael Jeffman

unread,
Nov 14, 2013, 7:03:12 AM11/14/13
to tchelinux
Thread bem interessante, mas e se a máquina remota estiver configurada para NÃO responder ao ping ICMP?

Na verdade, foi o que eu pensei lá no primeiro email quando o Diego disse que "parou de funcionar": "Bah, mudaram a configuração das máquinas".

Rafael

http://www.rafaelfoto.com
Fotografia de Casamentos, Aniversários, Formaturas, Shows, Eventos Esportivos, e festas em geral.


2013/11/14 Vinicius Mello <vmm...@vmmello.eti.br>
On 11/13/2013 08:03 PM, Marcos Carraro wrote:
Buenas,

Ia falar agora sobre os sockets, cara eu fiz uma aplicação
que valida os serviços remotos dos servidores, tudo usando

socket e mysql para armazenar os hosts portas. Utiliza
socket é mais seguro.

Pra fazer um ping por socket é preciso um RAW SOCKET e precisa de privilégios de root pra isso, certo? Caso sim, esta solução não seria fácil de implementar com segurança.


A idéia de rodar o /bin/ping <IP> diretamente não é tão má do ponto de vista de segurança porque é fácil validar uma string que representa um IP (se pode validar o formato do IP com a função preg_match() e usar a função escapeshellarg() pra escapar os caracteres antes de executar).


Me parece que a usabilidade desta solução da forma como ela está é o principal problema. Supondo que a rede tenha 100 IPs e que o ping demore 0.2 segundo em cada IP, pra página carregar totalmente vai levar 20 segundos. A usabilidade assim é péssima. E se fosse por exemplo 192.168.1.0/24 (254 IPs) seria ainda pior.


Uma solução alternativa seria:

1) rodar no crontab a cada 1 minuto um ping scan com o nmap com o parametro pra exportar o resultado pra XML. Como o nmap roda o scan em paralelo, isto vai reduzir consideravelmente o tempo do scan. E no modo ARP scan ele detecta hosts que estão com o firewall habilitado (Windows >= XP). Tem a desvantagem de que ficar rodando um scan a cada 1 minuto é muito mais do que precisa, porque a página só será vista de vez em quando. Tem outras formas melhores e mais complicadas, mas deixo a idéia assim como conceito.


2) o script PHP faz apenas o parse do resultado gerado pelo nmap e mostra na tela


--
Vinicius Mello
--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.

--- Você está recebendo esta mensagem porque se inscreveu no grupo "TcheLinux" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para tchelinux+unsubscribe@googlegroups.com.

Christiano F. Haesbaert

unread,
Nov 14, 2013, 7:12:13 AM11/14/13
to tche...@googlegroups.com
2013/11/14 Rafael Jeffman <raf...@gmail.com>:
> Thread bem interessante, mas e se a máquina remota estiver configurada para
> NÃO responder ao ping ICMP?
>
> Na verdade, foi o que eu pensei lá no primeiro email quando o Diego disse
> que "parou de funcionar": "Bah, mudaram a configuração das máquinas".
>

Ae a unica solucao 'e matar o cara que acha que bloquear echo-req traz
alguma seguranca.
>> envie um e-mail para tchelinux+...@googlegroups.com.
>> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>
>
> --
> Mensagem enviada para <http://groups.google.com/group/tchelinux>.
> Regras de Conduta para o grupo: <http://tchelinux.org/regras>.
>
> ---
> Você está recebendo esta mensagem porque se inscreveu no grupo "TcheLinux"
> dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie
> um e-mail para tchelinux+...@googlegroups.com.

Sérgio

unread,
Nov 14, 2013, 7:29:27 AM11/14/13
to tche...@googlegroups.com

A idéia de rodar o /bin/ping <IP> diretamente não é tão má do ponto de vista de segurança porque é fácil validar uma string que representa um IP (se pode validar o formato do IP com a função preg_match() e usar a função escapeshellarg() pra escapar os caracteres antes de executar).

Bom dia,

A problema de segurança em utilizar (ou não banir elas no php.ini) qualquer das funções PHP que permitam acesso a shell, é que scripts mal intencionados que seja enviado para o servidor, digamos por um ckeditor sem autenticação ou um bug do wordpress, podem abusar delas para realizar um ataque. Basta fazer uma busca no seu site favorito de buscas por "php shell" e conferir dezenas ou centenas destes scripts.

Deixar o PHP rodando em um *servidor WEB qualquer*, em um *sistema operacional qualquer*, com acesso as funções que executam programas em segundo plano *sempre* será uma falha grave de segurança, pois qualquer bug em qualquer aplicação (ou formulário) que permita o envio de um script malicioso é suficiente para o comprometimento.

p.s. Existe uma coleção *enorme* de funções do PHP que devem ser desativadas para prover o mínimo de segurança, leia com atenção o manual do PHP e identifique elas.

Abraço,
Sérgio

Fabio Olive Leite

unread,
Nov 14, 2013, 7:36:56 AM11/14/13
to tche...@googlegroups.com
On 2013-11-14 Christiano F. Haesbaert wrote:
>
> Ae a unica solucao 'e matar o cara que acha que bloquear echo-req traz
> alguma seguranca.

Bah, pior que eu já vi isso em uma empresa que trabalhei há muitos
anos. Tinha algum daqueles "ping da morte" rolando nos Windows, então a
"solução" era bloquear ICMP em todos os roteadores. Massa é que vários
equipamentos da engenharia pingavam um servidor central de atualização
e atualizavam seu firmware se ele estivesse acessível. O resultado é
que nenhum dos equipamentos se atualizava, nunca, e levou tempo pro
"time de TI" confessar o porquê. :-(

Fico imaginando se eles chegaram a bloquear TCP também, já que a grande
maioria dos exploits é sobre TCP. Devem ter feito isso, e depois
voltado ao normal porque "a internet travou". Ignorância--.

Aliás, tem dias que parece que TI significa Total Ignorância. Como um
gurizinho que ontem "consertou" o laptop da minha esposa na empresa
dela, colocando o Thunderbird pra acessar um servidor POP3 na porta
583. Como não acessava ele disse que era problema no servidor, mas que
ia voltar a funcionar mais tarde. Que maravilha de serviço!

Fábio
--
[ Fábio Olivé Leite, olive, FabioOlive : OeSC-Livre.org ]
[ Na matemática das idéias, permuta é igual a adição, ]
[ e um debate inteligente implementa a multiplicação. ]

Oscar Marques

unread,
Nov 14, 2013, 10:08:21 AM11/14/13
to tche...@googlegroups.com

Toda entrada de dados deve ser tratada como maliciosa.

All input is evil.

Rafael Jeffman

unread,
Nov 15, 2013, 9:05:02 AM11/15/13
to tchelinux
Frase do ano 2014: "Tem dias que parece que TI significa Total Ignorância." -- LEITE, Fabio Olive

E olha que o ano ainda nem começou!

Rafael

http://www.rafaelfoto.com
Fotografia de Casamentos, Aniversários, Formaturas, Shows, Eventos Esportivos, e festas em geral.


2013/11/14 Oscar Marques <osc...@gmail.com>
Reply all
Reply to author
Forward
0 new messages