Reconhecendo um sistema operacional com o ping


Recentemente, li um pequeno texto no site da Dicas-L a respeito de como se pode utilizar o comando ping como uma forma de detectar um sistema operacional remoto. Aliás, sempre que posso, ensino em sala de aula esse recurso.

Resumindo um pouco do que se trata. Para que sistemas operacionais diferentes possam se comunicar normalmente em uma rede, é preciso que todos “falem” a mesma língua. No caso da Internet e na maioria das redes da atualidade, essa língua significa os protocolos que compõem a arquitetura TCP/IP cujas especificações, conhecidas como RFC (Request For Comments) são públicas e podem, portanto, ser consultadas livremente através do site http://www.ietf.org. Em outras palavras, cada fabricante deve consultar essa documentação para implementar em seu sistema operacional os protocolos da arquitetura TCP/IP, seguindo as recomendações que irão garantir a correta interoperabilidade em rede.

Muitos dos aspectos descritos nas RFCs devem ser seguidos à risca pelos desenvolvedores e isso é uma tarefa trabalhosa e que requer bastante experiência. Por outro lado, existem alguns aspectos das especificações que devem ser definidos de acordo com cada fabricante. São essas decisões particulares na implementação da pilha TCP/IP que ajudam no desenvolvimento das ferramentas de “OS fingerprinting”, que visam reconhecer o tipo e a versão de um sistema operacional remotamente. O NMAP talvez seja o melhor exemplo desse tipo de ferramenta.

Em especial, existe um campo no cabeçalho do protocolo IP chamado TTL (Time-To-Live). O objetivo desse campo é evitar que, por exemplo, por problemas de roteamento, um pacote IP fique trafegando indefinidamente de roteador em roteador. Inicialmente, o campo indicava o tempo que um pacote IP poderia ficar “em trânsito” para seu destino. A dificudade técnica logo apareceu uma vez que era difícil para cada roteador controlar quanto tempo exatamente um pacote havia ficado sobre seu controle.

Outras dificuldades técnicas também mostraram que essa forma de controle era inviável. Por conta disso, o entendimento do TTL mudou e passou a ser entendido como a quantidade de “saltos” entre roteadores (do inglês, hops) que um pacote pode dar até alcançar seu destino final. Com isso, cada roteador que recebe um pacote e o repassa adiante decrementa, antes de enviá-lo, em 1 o valor do TTL. Se o pacote não tiver mais “crédito” para continuar trafegando, o roteador que o recebeu e identificou, em primeira mão, a impossibilidade de entregá-lo ao seu destino final, descarta o pacote e encaminha ao originador uma mensagem de TTL Time Exceeded, através do protocolo ICMP.

Pois bem, voltando ao assunto das RFCs, o TTL é um dos campos cujo valor default, utilizado em um pacote assim que ele é criado, fica a cargo de cada sistema operacional. Com isso, os sistemas operacionais mais conhecidos do mercado acabaram adotando valores diferentes. Por exemplo, o Microsoft Windows costuma adotar como valor padrão para o TTL o valor de 128. Já sistemas GNU/Linux costumam utilizar o valor de 64. O Solaris, por sua vez, adota o máximo que o campo permite: 255. É essa particularidade que torna simples a investigação de um sistema operacional, remotamente, apenas pelo resultado do ping.

Diante disso, ao executar o comando ping para uma determinada máquina, basta verificar o valor do TTL apresentado como resultado e identificar de qual padrão ele aproxima-se mais. Por exemplo, no exemplo abaixo o valor de TTL de 57 está mais próximo de 64 do que de 128 (Microsoft Windows) e 255 (Solaris). Nesse caso, pode-se suspeitar que trata-se de um sistema GNU/Linux.

Suspeitar? Isso mesmo. Apesar desse comportamento refletir a realidade na maioria dos casos, é importante tomar cuidado com o fato de que esses valores podem ser alterados, principalmente por sistemas que, como o GNU/Linux, possuem alguns recursos que permitem interagir diretamente com o kernel e, consequentemente, com a pilha TCP/IP do seu sistema operacional.

Por exemplo, para alterar em tempo real o valor do TTL utilizado por seu ambiente GNU/Linux, basta, como root, executar o seguinte comando:

  # echo 1 > /proc/sys/net/ipv4/ip_default_ttl

Depois, para consultar o valor atual, basta utilizar o cat:

  # cat /proc/sys/net/ipv4/ip_default_ttl

Conhecer bem o comportamento da pilha TCP/IP dos diversos sistemas operacionais é fundamental para exercer a função de administrador de sistemas. A detecção de um sistema operacional por meio do valor do TTL é um recurso importante e ágil, desde que seja considerado em um ambiente de rede controlado onde se pode assumir que apenas os valores padrões do TTL estão sendo utilizados. Por outro lado, caso trata-se de um ambiente não restrito, considere utilizar outras técnicas e ferramentas.

Fonte: Dicas-l (http://www.dicas-l.com.br/index.xml)

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s