No texto de hoje falarei a respeito de uma técnica de terminal que possibilita a identificação do SO (sistema operacional) de outro computador através do comando
ping
.- O comando
O ping é um comando presente na maioria dos sistemas operacionais, e ele é utilizado para teste de conectividade entre dispositivos da rede através do protocolo de controle de mensagens (ICMP). Basicamente o ping transmite e recebe pacotes de outros equipamentos da rede para verificar se estes estão disponíveis para troca de informações.
O comando em si é muito rico em opções e possibilidades de uso, por esse motivo incentivo a leitura das informações a respeito dele. Para ler tudo sobre essa ferramenta, abra o terminal e execute
- Código: Selecionar todos
$ info ping
ou se preferir
- Código: Selecionar todos
$ man ping
- Protocolo ICMP
O ICMP (Internet Control Message Protocol) é um protocolo que funciona na camada de Rede do modelo OSI e sua função é reportar mensagens (de controle e de erros acontecidos na transmissão de pacotes) ao host originador, ou seja, a máquina que realiza o ping para verificar se a outra está ativa. Esse protocolo foi concebido, pois um datagrama IP pode se perder, se atrasar ou ser duplicado durante o envio, e isso ocorre por vários motivos, dentre eles: Falhas na conexão, Destino inativo, Excesso de tráfego, etc.
Como o foco do texto não é a explicação detalhada do ping e do ICMP, não vou me aprofundar, o que fiz foi apenas "dar uma luz" para quem não conhecia o comando e o protocolo.
- Identificar um Sistema Operacional
Agora que temos uma noção do que é a ferramenta e seu respectivo protocolo, vamos a aplicação da técnica. E para uma explicação mais didática vamos a prática. Abra o terminal e execute a instrução abaixo:
- Código: Selecionar todos
# ping -c 3 127.0.0.1
O resultado do que foi executado deve ser algo parecido com a saída abaixo:
- Código: Selecionar todos
from 127.0.0.1: icmp_seq= ttl=64 time=
from 127.0.0.1: icmp_seq= ttl=64 time=
from 127.0.0.1: icmp_seq= ttl=64 time=
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss,
Da saída acima precisaremos apenas do campo
ttl
, pois ele é quem diz qual é o SO por trás da maquina.- TTL
O campo TTL (Time To Live), refere-se ao tempo de vida de um pacote na rede e o valor dele possui duas particularidades importantes. A primeira delas é o valor padrão, ou seja, cada SO possui um valor default que é atribuído a um pacote no momento de sua criação pelo sistema, no GNU/Linux e Mac OS X esse valor é 64, no MS Windows o valor é 128 e em sistemas Unix (como o Oracle Solaris por exemplo) 255.
A segunda particularidade importante é o decremento do valor padrão a cada salto do pacote realizado em roteadores. Para melhor exemplificar isso, vamos a um exemplo prático: Digamos que o site manjaro-linux.com.br esteja hospedado em um servidor localizado na Antartida e você (localizado no Brasil) queira simplesmente testar se a máquina está ativa e respondendo, então você abrirá o shell e escreverá o seguinte:
- Código: Selecionar todos
# ping -c 5 manjaro-linux.com.br
Logo em seguida, a máquina que recebeu o ping devolverá o pong com uma saída semelhante a essa:
- Código: Selecionar todos
from 200.0.2.6: icmp_seq= ttl=60 time=
from 200.0.2.6: icmp_seq= ttl=60 time=
from 200.0.2.6: icmp_seq= ttl=60 time=
Repare que o valor de TTL é 60. Mas o que isso realmente quer dizer? Simples, o computador que hospeda o site do Manjaro Linux Brasil é uma máquina com GNU/Linux e para chegar até ela, meu pacote com a requisição teve que passar por quatro roteadores. Se a máquina em questão fosse um Solaris, o valor de TTL seria 251 (255 que é o valor padrão subtraído por quatro roteadores).
No resumo da obra, a técnica é a seguinte: "Pingue" uma máquina qualquer na rede e a partir do valor que mais se aproximar dos valores padrões você saberá qual é o SO daquela máquina. Caso o endereço de loopback seja testado, o retorno será o valor padrão, pois não há roteadores nesse caminho.
- A anti técnica
O que foi explicado acima não se aplica a todas as máquinas, logo, a certeza de que o resultado é verdadeiro restringe-se a um ambiente de rede controlado, na qual você sabe que as máquinas não sofreram configurações avançadas. Digo isso, pois o valor de TTL pode ser alterado no GNU/Linux! Como fazer isso? Veja abaixo:
- Código: Selecionar todos
# more /proc/sys/net/ipv4/ip_default_ttl
A instrução acima permite que você veja o valor padrão. Já a que está abaixo o altera, nesse caso para o valor do MS Windows.
- Código: Selecionar todos
# echo 128 > /proc/sys/net/ipv4/ip_default_ttl
Feito a alteração execute:
- Código: Selecionar todos
# ping -c 3 127.0.0.1
E verá que sua máquina não é mais um Manjaro Linux, e sim um Windows para o resto da rede .
- Conclusão
Embora a técnica acima possa ser burlada, é válido conhece-la. Uma vez que muitas pessoas sequer possuem ideia disso e nesse caso ela funcionará, por outro lado nunca confie totalmente nela e busque mais de uma maneira para realizar a identificação, a não ser que você esteja em um ambiente controlado é claro.
Bom pessoal, essa foi mais uma dica. Espero que isso possa ajudar alguém e caso haja alguma informação errada ou incompleta, fiquem a vontade para comentar. Criticas e sugestões também são bem vindas.
Valeu.