=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[07]-=[Sniffing for Dummies]-=|hallz|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Introdução ao Sniffing
(Sniffing for Dummies) Por hallz

.:: Introdução ::.

Procuro abordar aqui o funcionamento de um sniffer, os riscos que este pode trazer a uma rede, alguns truques que invasores usam para oculta-lo e também formas de detecção. Ao longo do artigo, usarei a palavra 'invasor' quando me referir a pessoa que esta 'sniffando' uma rede que não seja sua. 'Invasor' neste caso, serve para hackers, crackers e kiddies. Vale lembrar, no entanto, que as diferenças entre os termos são enormes. Hackers são pessoas com conhecimento avançado, que estão sempre em busca de mais conhecimento, compartilham suas descobertas e seguem uma ética; Crackers violam sistemas com intenções maliciosas, causando problemas aos seus alvos; Kiddies são pessoas que não tem conhecimento técnico, apenas usam ferramentas criadas por outros como forma de conseguir seus 15 minutos de fama. Este eh um texto básico, portanto se você já eh 'fera', não espere encontrar algo novo por aqui.

.:: O que são Sniffers? ::.

Sniffers (farejadores) são dispositivos (podem ser programas ou algum hardware especifico) que capturam (a maioria também analisa) o trafego de uma rede de forma passiva,isto é, sem interferir nas comunicações, podem ser utilizados tanto por administradores como por invasores, obviamente com propósitos diferentes. Administradores podem usar um sniffer para detectar, ou pelo menos ajudar a detectar, a causa de um problema, assim como gerar logs do trafego da rede que podem ser consultados posteriormente caso necessário (devido ao comprometimento de uma maquina, por exemplo). Já invasores podem utiliza-lo para capturar informações confidenciais que circulem em 'texto-puro', ou seja, não criptografadas. Qualquer informação não criptografada, incluindo logins e senhas de serviços como FTP, Telnet e POP, estará acessível ao invasor. Usar criptografia é altamente recomendável, porem não impede totalmente o acesso por parte do invasor as informações.

.:: Como Funcionam ::.

Para entender o funcionamento dos sniffers, precisamos entender o funcionamento das redes. Aqui sera abordado o padrão Ethernet, o mais utilizado hoje em dia. Cada computador em uma rede Ethernet tem o seu endereço de hardware, o MAC (Media Access Control). O MAC, um número hexadecimal de 12 dígitos, único em toda a rede (teoricamente não existem duas placas de rede com o mesmo MAC), é utilizado para identificar as maquinas. Em cada pacote enviado, logo no começo, podemos encontrar dois endereços MACs, o endereço do computador que enviou o pacote, e o endereço do computador que deve recebe-lo.

Na verdade, todos os computadores da rede recebem os pacotes (salvo se a rede utilizar switches - isto sera abordado mais adiante), mas só responderão a pacotes destinados a elas, ou seja, apenas responderão caso o pacote em questão tenha o seu endereço MAC como destinatário; caso não possua, o pacote sera descartado(isso é feito a nível de hardware - interface de rede). Se conseguirmos fazer com que a interface não descarte os pacotes, poderemos capturar todo o trafego da rede! É assim que um sniffer funciona, ele faz com que a interface de rede aceite todos os pacotes. Quando uma interface se encontra nesta condição, dizemos que esta em 'modo promiscuo', estado que geralmente pode-se habilitar via software.

Na maioria dos sistemas operacionais atuais, para por uma interface de rede em modo promiscuo, deve-se ter privilégios de root (administrador). O sniffer pode ser utilizado com a interface em seu estado normal, mas neste caso só serão capturados os pacotes que tenham como origem (ou destino) o computador onde ele esta sendo executado. Pode não parecer tao interessante, mas se este computador for um roteador, o invasor terá acesso a todo o trafego que por ele passar.

Os pacotes capturados pelo sniffer geralmente são armazenados em arquivos salvos no disco rígido, para posterior analise. Em uma rede movimentada, este arquivo poderá ficar enorme, em poucas horas, o que facilitaria a detecção de um sniffer por parte do administrador. Por este motivo(e também para não perder tempo), sniffers instalados furtivamente são bem seletivos; gravam apenas o que é interessante ao invasor (geralmente logins e senhas). Como estas informações geralmente localizam-se no começo do pacote, muitos sniffers não analisam o pacote inteiro, mas apenas os seus primeiros 200-300 bytes. Outros sniffers vão ainda mais longe; enviam os logins/senhas capturados para um e-mail fornecido pelo invasor. Imaginemos a seguinte situação: Um invasor, localizado no RJ, quer interceptar a conversa pela internet de João e Maria, que estão em SP, usando um sniffer. E possível?

                         ----------------
                        /                \
                       /                  \
  ------       ----------                ----------        -------
 | João |---> | Provedor |   INTERNET   | Provedor | < --- | Maria |
  ------       ----------                ----------        -------
                       \                  /
                        \   ----------   /
                         --| Provedor |--
                            ----------
                                |
                            ---------
                           | Invasor |
                            ---------

Claro! Basta que ele consiga acesso ao computador de um dos dois (engenharia social, exploração de alguma falha, trojans...), ou a algum que esteja 'no meio do caminho' (Um servidor do provedor de Maria ou um roteador, por exemplo) e instale la o sniffer. O invasor pode ainda fazer com que os dados passem pelo seu computador ou seja ele redireciona o trafego. Apesar de ser muito mais trabalhoso, é possível.

.:: Sniffers em redes comutadas ::.

Logo acima foi dito que os pacotes em uma rede são distribuídos por todos os computadores; Isto é verdade se for utilizado um hub ou cabo coaxial para fazer a ligação dos PCs, mas não se for utilizado um switch (Lembrem-se que estamos falando de redes Ethernet). Os switches possuem tabelas onde são armazenados, entre outras coisas, endereços MACs encontrados em cada uma de suas portas. Por isso, o switch pode enviar os pacotes apenas para a porta onde esta o destinatário. Com isso, dificulta-se o sniffing (Porem não o torna impossível :P). Mas como o switch sabe em que porta o destinatário esta? Simples! Suponhamos que João e Maria agora estão ligados em uma rede comutada. Vejamos o que acontece se João 'pingar' (ICMP Echo Request) o computador de Maria.

João ---> ARP Request ---> Broadcast
João < --- ARP Response <--- Maria
João ---> ICMP Echo Request ---> Maria
João < --- ICMP Echo Response <--- Maria

O que acontece é o seguinte: João quer enviar o ICMP Echo Request (o famoso Ping) para Maria, mas para isso, ele precisa saber o endereço físico (MAC) do computador de Maria. Por isso, João 'grita', para todos os computadores da rede (Broadcast): "Qual o endereço MAC de Maria?". Isto é um ARP Request (Address Resolution Protocol - o ARP traduz endereços IP para MAC). Maria então ouve o 'grito' de João e o responde (ARP Response). Agora que João já tem o endereço MAC, pode enviar o 'ping' (Echo Request), que é prontamente respondido pela Maria (Echo Response). Depois disso, caso João queira enviar mais algum pacote para Maria (e vice-versa), não precisara enviar primeiro outro ARP Request, pois o endereço MAC de Maria já sera conhecido, podendo ser localizado na cache ARP de seu PC. Quando passam ARP Requests e Responses pelo switch, este verifica de qual de suas portas o pacote foi originado e pega o endereço MAC de origem que esta escrito no pacote. Essas informações são então registradas nas tabelas do switch. Assim ele fica sabendo em que porta estão localizados cada computador, e pode repassar os pacotes apenas para a porta onde esta o destinatário do pacote. Em redes que operem nesta forma são chamadas de comutadas. Porém nem tudo são flores, e o sniffing ainda pode funcionar nestas condições. Vejamos algumas formas de fazer isso.

+ Table Flooding

Como já foi dito, o switch sabe para que porta enviar cada pacote devido a tabela que ele possui (CAM Table). (CAM) Table Flooding consiste em encher a tabela do switch com entradas falsas, para que ele passe a enviar os pacotes para todas as portas. Tabela do Switch ANTES do ataque:(apenas para ilustração, a tabela é mais 'complexa')

--------------------------
| Porta  |  Endereço MAC   |
|--------------------------|
|   01   |   MAC de Maria  |
|   02   |   MAC de João   |
|   ...  |       ...       |
|   10   |  MAC do Invasor |
--------------------------

Então o invasor, que quer capturar o trafego da rede, começa a enviar pacotes ARP para a rede, cada um com um endereço MAC - que não existe na rede - diferente. O switch armazena estes endereços em sua tabela, até que esta fica cheia - Sim, a CAM Table tem um limite de entradas. Tabela do Switch DURANTE o ataque:

----------------------------
| Porta |    Endereço MAC    |
|----------------------------|
|  01   | MAC inexistente 1  |
|  02   | MAC inexistente 2  |
|  ...  |        ...         |
|  10   | MAC inexistente 10 |
----------------------------

Assim, todo o pacote cujo destinatário não estiver listado na tabela do switch devera ser enviado para todas as portas. Ai, o invasor pode captura-los sem problemas. O macof é um programa que aplica esta técnica.

+ ARP Cache Poisoning

Esta técnica consiste em enviar pacotes ARP forjados para as maquinas-alvo, de forma com que todo o trafego entre elas passe pela maquina do invasor. Vejamos o caminho (normal) dos pacotes entre João e Maria:

 --------        --------        -------
|  João  | < --> | Switch | < --> | Maria |
 --------        --------        -------

Para poder sniffar o trafego entre João e Maria, o invasor envia pacotes ARP (que não requerem autenticação) para João fingindo ser Maria, e pacotes ARP para Maria fingindo ser João. Assim a tabela ARP de Maria e João fica envenenada (poisoned). Vejamos as tabelas:

Antes:

Tabela de João ANTES do ataque           Tabela de Maria ANTES do ataque
--------------------------------          --------------------------------
|  Endereço IP  |  Endereço MAC  |        |  Endereço IP  |  Endereço MAC  |
|--------------------------------|        |--------------------------------|
| IP de Maria   | MAC de Maria   |        |  IP de João   |  MAC de João   |
| IP do Invasor | MAC do Invasor |        | IP do Invasor | MAC do Invasor |
--------------------------------          --------------------------------

Durante:

Tabela de João DURANTE o ataque           Tabela de Maria DURANTE o ataque
--------------------------------          --------------------------------
|  Endereço IP  |  Endereço MAC  |        |  Endereço IP  |  Endereço MAC  |
|--------------------------------|        |--------------------------------|
| IP de Maria   | MAC do Invasor |        |  IP de João   | MAC do Invasor |
| IP do Invasor | MAC do Invasor |        | IP do Invasor | MAC do Invasor |
--------------------------------          --------------------------------

O invasor deve certificar-se que os pacotes enviados por João cheguem ao seu destinatário real, Maria, e vice-versa. Isso pode ser feito facilmente através do IP Forwarding, que é suportado por muitos sistemas operacionais. Alem disso, o invasor devera enviar regularmente novos pacotes ARP para Maria e João, pois as entradas nas tabelas ARP expiram. O caminho dos pacotes durante o ARP Poisoning:

 --------        --------        ---------        --------        -------
|  João  | < --> | Switch | < --> | Invasor | < --> | Switch | < --> | Maria |
 --------        --------        ---------        --------        -------

Com o ARP Cache Poisoning o invasor pode não somente capturar os pacotes enviados como também altera-los (assim como cria-los) antes de enviar para o verdadeiro destinatário. Imagine se o invasor se passar por um roteador...

+ ICMP Redirect

Pacotes ICMP Redirect são usados por roteadores para fazer com que os computadores enviem seus pacotes por um caminho diferente. Forjando ICMP Redirects o invasor pode alterar as tabelas de roteamento de uma maquina para que o trafego passe por ele.

+ Monitor Port (SPAN, Port Mirroring, Port Monitoring)

Muitos switches fornecem Monitor Ports, que permitem copiar todo o trafego da rede para uma (ou mais) portas. O problema - Ou solução, depende do ponto de vista - eh que muitos administradores não alteram as senhas-padrão, permitindo assim que o invasor faca com que o switch envie todo o trafego da rede para a porta em que ele esta conectado. Caso o switch suporte realizar esta configuração via SNMP, o invasor pode tentar adivinhar a senha. Mesmo que o administrador tenha configurado o switch para aceitar apenas pacotes SNMP vindos de um certo endereço IP, o invasor pode utilizar de spoofing.

+ Switch Port Stealing

Nesta técnica o invasor envia pacotes com o endereço MAC de origem da maquina-alvo. O switch então "aprende" que o invasor eh a maquina-alvo e passa a enviar os pacotes destinados a ela para o invasor. Temos dois problemas aih. O primeiro eh que se a maquina-alvo parar de receber os pacotes, a conexão se encerra, o outro problema é que a maquina-alvo continuara enviando pacotes, o que fara com que a tabela do switch volte ao seu estado normal. Para contornar o problema, podemos tirar a maquina-vitima da jogada(DoS) e enviar os pacotes com o MAC alterado. Assim podemos tomar conta de uma conexão já autenticada, como uma sessão Telnet. Outra possibilidade é enviar pacotes com o MAC alterado em intervalos regulares, e ao receber um pacote destinado a maquina-alvo, reenvia-lo para broadcast. Assim, a maquina-alvo continua recebendo os pacotes.

.:: Detectando Sniffers ::.

Por sua natureza passiva, a detecção de sniffers pode se tornar algo complicado. Contudo, formas de detecção existem, e podem ser divididas em duas categorias: locais e remotas. A detecção local consiste basicamente em utilizar ferramentas do sistema para verificar se existem interfaces em modo promiscuo, ou algum outro indicio da existência de sniffers na maquina. Podemos ver se uma interface esta em modo promiscuo usando o ifconfig:


bash-2.05b# ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:50:56:40:2A:B9
inet addr:192.168.0.172 Bcast:192.168.0.191 Mask:255.255.255.224
UP BROADCAST NOTRAILERS RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:2282 (2.2 Kb) TX bytes:2707 (2.6 Kb)
Interrupt:10 Base address:0x10a0


lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Repare a palavra "PROMISC" em eth0. Em maquinas Windows (NT, 2000, XP) pode-se utilizar o PromiscDetect. Outra ferramenta que pode ser utilizada é o lsof (list open files), em busca de network files abertos (sockets) ou ainda o arquivo onde o sniffer grave os dados capturados.

O problema da detecção local é que o invasor pode substituir as ferramentas como ifconfig ou ainda carregar módulos que façam o computador esconder as informações que poderiam entregar a presença do sniffer. Um checador de integridade, como o tripwire, pode ajudar a resolver o problema da alteração de binários, mas se o invasor inserir um modulo no kernel que faca o sistema mentir para você, o tripwire de nada adiantara. Existem ferramentas, como o rkscan, que podem localizar rootkits conhecidos, através de assinaturas (padrões). Novamente, o rkscan de nada adiantara contra um rootkit desenvolvido pelo próprio invasor, já que sua assinatura não constara no rkscan. E a brincadeira de gato e rato continua. A detecção remota é um processo heurístico, ou seja, o resultado não eh 100% confiável. Nesta detecção exploram-se certas características do sistema operacional e protocolos, que possam indicar a existência de um sniffer. Vejamos algumas das técnicas que IDS e ferramentas como o antisniff utilizam para tentar identificar sniffers na rede.

+ Método Ping

Sem duvida o método mais conhecido, consiste em enviar um ICMP Echo Request (ping) para a maquina a ser testada, mas com o endereço MAC diferente. Como o MAC não é o da maquina, não deve haver resposta ao ping; se houver, é porque a interface de rede não descartou o pacote, e portanto, esta rodando em modo promiscuo. Este método pode ser realizado com qualquer protocolo que gere resposta. Apesar de eficiente, pode ser contornado facilmente; de fato vários sniffers furtivos implementam uma especie de 'filtro virtual de MAC', que inutiliza esta técnica.

+ Método ARP

Existem basicamente duas possibilidades aqui. A primeira eh a mesma do Método Ping, só que utiliza-se o protocolo ARP. A segunda aproveita-se do ARP Cache. Lembram de como funciona isto? Se não lembram, releiam o texto, pois eu que não vou escrever novamente. Bem, o que se faz eh o seguinte: Envia-se um ARP para um endereço que não seja o de broadcast, e depois um Ping para broadcast. As maquinas que responderem o ping sem antes enviarem um ARP pedindo seu MAC podem te-lo obtido capturando o seu pacote ARP anterior, portanto podem estar executando um sniffer.

+ Honey Pot (aka Armadilha)

Honey Pots são utilizados para a detecção e estudo de ataques (apesar de existirem muitas criticas a respeito de seu uso). No caso da detecção de sniffers, pode-se enviar informações, senhas falsas na rede, simular conexões, e esperar que alguém tente usa-las. Pode ser uma boa forma de detectar um sniffer totalmente passivo.

+ DNS Reverso

Alguns sniffers realizam operações resolução reversão (Reverse DNS Lookups), isto eh, transformam endereços IP em nomes mais amigáveis (pelo menos para seres humanos normais), como google.com. Então, monitorando a utilização de resolução reversa na rede pode-se encontrar sniffers. Um exemplo pratico seria você enviar vários pings para endereços inexistentes na rede, e monitora-la, para ver se alguma maquina tenta realizar a resolução.

+ Inundacao ARP

Para sniffers em redes comutadas serem funcionais, frequentemente eles necessitarão gerar grande trafego ARP, seja para encher a tabela do switch ou para assumir o lugar de outra maquina (Man in the middle). O monitoramento do número de anúncios ARP pode revelar a existência de sniffers na rede.

+ Latência

Este método pode trazer problemas a rede, portanto deve ser empregado com cuidado, e apenas quando já existir a suspeita que uma maquina esteja executando um sniffer. Ele consiste em enviar uma grande quantidade de trafego na rede. Maquinas que não estiverem suas interfaces de rede executando em modo promiscuo não serão afetadas, apenas as que estiverem, sim. Como serão afetadas? Terão um aumento do seu tempo de resposta, devido ao fato do sniffer (a maioria) analisar todos os pacotes recebidos a fim de armazenar apenas as informações que forem interessantes. 'Pingue' a maquina suspeita antes de injetar grande quantidade de trafego na rede e anote o resultado. Depois, pingue novamente durante a 'tempestade' de pacotes. Se a diferença for grande, podemos ter um sniffer ai.

.:: Evitando o sniffing ::.

Existem formas de tornar as coisas mais complicadas para sniffers, como o uso de entradas ARP estáticas - a cache ARP não é modificada - ou o uso de Port Security, que 'prende' os endereços MAC a certas portas do switch, mas não são muito praticas. Existem ainda interfaces de rede que não suportam o modo promiscuo, mas são difíceis de serem encontradas. A solução mais efetiva contra sniffers é o uso de criptografia, desde que seja implementada de forma correta, com algoritmos seguros, além de ser muito mais fácil de ser administrado que as soluções anteriores.

.:: Finalizando ::.

Espero que este artigo tenha atingido seu objetivo de servir de introdução ao sniffing, um eterno (?) problema para admins. Fico devendo (mas na o garanto que farei :P) uma parte sobre sniffing de redes wireless. Ate a próxima! :>

hallz

.:: Links Relacionados ::.

http://www.packetstormsecurity.nl/sniffers/
http://stein.cshl.org/~lstein/talks/WWW6/sniffer/
http://www.linux-sec.net/Sniffer/
http://www.ntsecurity.nu/toolbox/promiscdetect/
http://ettercap.sourceforge.net/
http://www.oxid.it/cain.html
http://staff.washington.edu/dittrich/talks/agora/macof
http://www.robertgraham.com/pubs/sniffing-faq.html
http://www.nwo.net/osall/Methodology/Novice/Sniffer_FAQ/sniffer_faq.html
http://www.packetwatch.net/documents/papers/layer2sniffing.pdf
http://www.ebookhackers.net/kb/index.php?page=index_v1&c=15

.:: EOF ::.