Sniffing de pacotes de rede
Sniffing ou sniffing de pacotes de rede é o processo de monitorar e capturar todos os pacotes que passam por uma determinada rede usando ferramentas de sniffing. É uma forma em que podemos “grampear fios telefônicos” e conhecer a conversa. Também é chamadowiretapping e pode ser aplicado às redes de computadores.
Há muitas possibilidades de que, se um conjunto de portas de switch corporativo estiver aberto, um de seus funcionários possa farejar todo o tráfego da rede. Qualquer pessoa no mesmo local físico pode se conectar à rede usando um cabo Ethernet ou conectar-se sem fio a essa rede e farejar o tráfego total.
Em outras palavras, o Sniffing permite que você veja todos os tipos de tráfego, protegidos e desprotegidos. Nas condições certas e com os protocolos certos em vigor, uma parte atacante pode ser capaz de coletar informações que podem ser usadas para outros ataques ou para causar outros problemas para o proprietário da rede ou do sistema.
O que pode ser cheirado?
Pode-se farejar as seguintes informações confidenciais de uma rede -
- Tráfego de email
- Senhas de FTP
- Tráfegos da web
- Senhas telnet
- Configuração do roteador
- Sessões de chat
- Tráfego DNS
Como funciona o cheiro?
Um farejador normalmente coloca a NIC do sistema no modo promíscuo para que ouça todos os dados transmitidos em seu segmento.
O modo promíscuo se refere à forma única de hardware Ethernet, em particular, placas de interface de rede (NICs), que permite que uma NIC receba todo o tráfego da rede, mesmo que não seja endereçado a esta NIC. Por padrão, uma NIC ignora todo o tráfego que não é endereçado a ela, o que é feito comparando o endereço de destino do pacote Ethernet com o endereço de hardware (MAC) do dispositivo. Embora isso faça sentido para redes, o modo não promíscuo torna difícil usar o software de monitoramento e análise de rede para diagnosticar problemas de conectividade ou contabilidade de tráfego.
Um sniffer pode monitorar continuamente todo o tráfego para um computador por meio da NIC, decodificando as informações encapsuladas nos pacotes de dados.
Tipos de cheirar
Farejar pode ser de natureza ativa ou passiva. Agora aprenderemos sobre os diferentes tipos de cheirada.
Sniffing Passivo
Na detecção passiva, o tráfego é bloqueado, mas não é alterado de forma alguma. Farejar passivo permite apenas ouvir. Funciona com os dispositivos Hub. Em um dispositivo de hub, o tráfego é enviado a todas as portas. Em uma rede que usa hubs para conectar sistemas, todos os hosts da rede podem ver o tráfego. Portanto, um invasor pode capturar facilmente o tráfego que passa.
A boa notícia é que os hubs quase se tornaram obsoletos nos últimos tempos. A maioria das redes modernas usa switches. Conseqüentemente, cheirar passivamente não é mais eficaz.
Sniffing ativo
Na detecção ativa, o tráfego não é apenas bloqueado e monitorado, mas também pode ser alterado de alguma forma, conforme determinado pelo ataque. A detecção ativa é usada para detectar uma rede baseada em switch. Envolve a injeção de pacotes de resolução de endereço (ARP) em uma rede de destino para inundar a tabela de memória endereçável de conteúdo do switch (CAM). O CAM mantém registro de qual host está conectado a qual porta.
A seguir estão as técnicas ativas de cheirar -
- MAC Flooding
- Ataques DHCP
- Envenenamento DNS
- Ataques falsificados
- Envenenamento ARP
Os efeitos do cheiro nos protocolos
Protocolos como o tried and true TCP/IPnunca foram projetados com a segurança em mente. Esses protocolos não oferecem muita resistência a intrusos em potencial. A seguir estão os diferentes protocolos que se prestam a uma fácil detecção -
HTTP
Ele é usado para enviar informações em texto não criptografado sem qualquer criptografia e, portanto, um alvo real.
SMTP (protocolo de transferência de correio simples)
O SMTP é utilizado na transferência de e-mails. Este protocolo é eficiente, mas não inclui nenhuma proteção contra farejamento.
NNTP (protocolo de transferência de notícias de rede)
É usado para todos os tipos de comunicação. Uma grande desvantagem disso é que os dados e até mesmo as senhas são enviados pela rede como texto não criptografado.
POP (Post Office Protocol)
O POP é estritamente usado para receber e-mails dos servidores. Este protocolo não inclui proteção contra farejamento porque pode ser interceptado.
FTP (protocolo de transferência de arquivos)
O FTP é usado para enviar e receber arquivos, mas não oferece nenhum recurso de segurança. Todos os dados são enviados como texto não criptografado que pode ser facilmente detectado.
IMAP (Internet Message Access Protocol)
IMAP é igual ao SMTP em suas funções, mas é altamente vulnerável a farejamentos.
Telnet
O Telnet envia tudo (nomes de usuário, senhas, pressionamentos de tecla) pela rede como texto não criptografado e, portanto, pode ser facilmente detectado.
Sniffers não são utilitários idiotas que permitem que você visualize apenas o tráfego ao vivo. Se você realmente deseja analisar cada pacote, salve a captura e revise-a sempre que houver tempo.
Implementação usando Python
Antes de implementar o raw socket sniffer, vamos entender o struct método conforme descrito abaixo -
struct.pack (fmt, a1, a2, ...)
Como o nome sugere, este método é usado para retornar a string, que é compactada de acordo com o formato fornecido. A string contém os valores a1, a2 e assim por diante.
struct.unpack (fmt, string)
Como o nome sugere, esse método descompacta a string de acordo com um determinado formato.
No exemplo a seguir de cabeçalho IP do sniffer de soquete bruto, que são os próximos 20 bytes no pacote e, entre esses 20 bytes, estamos interessados nos últimos 8 bytes. Os últimos bytes mostram se o endereço IP de origem e destino está analisando -
Agora, precisamos importar alguns módulos básicos da seguinte forma -
import socket
import struct
import binascii
Agora, vamos criar um socket, que terá três parâmetros. O primeiro parâmetro nos fala sobre a interface do pacote - PF_PACKET para Linux específico e AF_INET para Windows; o segundo parâmetro nos diz que é um socket raw e o terceiro parâmetro nos diz sobre o protocolo no qual estamos interessados —0x0800 usado para protocolo IP.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
Agora, precisamos chamar o recvfrom() método para receber o pacote.
while True:
packet = s.recvfrom(2048)
Na linha de código a seguir, estamos copiando o cabeçalho Ethernet -
ethernet_header = packet[0][0:14]
Com a seguinte linha de código, estamos analisando e desempacotando o cabeçalho com o struct método -
eth_header = struct.unpack("!6s6s2s", ethernet_header)
A linha de código a seguir retornará uma tupla com três valores hexadecimais, convertidos por hexify no binascii módulo -
print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])
Agora podemos obter o cabeçalho IP executando a seguinte linha de código -
ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])
Da mesma forma, também podemos analisar o cabeçalho TCP.