Tempos atrás, um aluno me perguntou se havia algum jeito de detectar sistemas operacionais através do PING, respondi que, apesar de não ser algo 100% confiável é possível sim.
Mas como? bem, o protocolo IP possui um campo chamado TTL ou (Time-To-Live) tempo de vida.
A função do TTL é evitar que os pacotes permaneçam na rede por tempo indeterminado de tal forma que não ocorram loops.
Roteadores estão programados para decrementar uma unidade do TTL a cada roteador alcançado.
Sistemas Operacionais possuem TTL padrões, exemplo: [Linux 64], [Windows 128] , [Solaris 255] e assim por diante.
Diante do exposto, basta executar o comando ping e verificar o resultado que se encontre mais próximo ao padrão .
Veja o exemplo de um ping contra um host Linux :
linux:~ root# ping -c 5 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.057 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.065 ms
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.057/0.065/0.071/0.004
Abaixo, um ping executado contra uma máquina Windows :
root@kali:/# ping -c 3 192.168.0.21
PING 192.168.0.21 (192.168.0.21) 56(84) bytes of data.
64 bytes from 192.168.0.21: icmp_req=1 ttl=128 time=0.615 ms
64 bytes from 192.168.0.21: icmp_req=2 ttl=128 time=0.414 ms
64 bytes from 192.168.0.21: icmp_req=3 ttl=128 time=0.314 ms
— 192.168.0.21 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
O porquê de não acreditar 100% ? muito simples …. (é possível mudar os padrões TTL) no Linux, basta o seguinte comando para verificar o padrão:
root@kali:/# cat /proc/sys/net/ipv4/ip_default_ttl
64
Depois o comando para alterar:
root@kali:/# echo 128 > /proc/sys/net/ipv4/ip_default_ttl
root@kali:/# cat /proc/sys/net/ipv4/ip_default_ttl
128
Abaixo um Kali Linux com padrão Windows de 128:
root@kali:/# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=128 time=0.027 ms
64 bytes from 127.0.0.1: icmp_req=2 ttl=128 time=0.020 ms
64 bytes from 127.0.0.1: icmp_req=3 ttl=128 time=0.023 ms
— 127.0.0.1 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
E isso ai !!!